From 7600d75b8931e77fbb4672f59bb349586f2695f4 Mon Sep 17 00:00:00 2001
From: Matthew Dean
Date: Mon, 9 Mar 2026 16:10:06 -0700
Subject: [PATCH 01/11] feat: migrate to native ESM with no build step
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Rename src/ to lib/ — source files are shipped directly, no compilation
- Add "type": "module" to package.json for native ESM support (Node 18+)
- Convert bin/lessc, test files, and build scripts from CJS to ESM
- Rename Gruntfile.js and .eslintrc.js to .cjs (must remain CommonJS)
- Add .js extensions to all relative import paths for ESM resolution
- Use createRequire() for optional dependency resolution (npm packages, JSON)
- Configure TypeScript for check-only mode (noEmit: true, allowJs: true)
- Update Rollup config to read from lib/ directly
- Update CI matrix to drop Node 16 (minimum Node 18+)
- Browser build is smaller: 500KB (was 509KB), minified 153KB (was 158KB)
- All 139 tests pass
---
.github/workflows/ci.yml | 2 -
packages/less/{.eslintrc.js => .eslintrc.cjs} | 0
packages/less/.gitignore | 1 -
packages/less/{Gruntfile.js => Gruntfile.cjs} | 25 +-
packages/less/bin/lessc | 36 +-
packages/less/build/banner.js | 7 +-
packages/less/build/rollup.js | 38 +-
packages/less/dist/less.js | 10374 +++++++++-------
packages/less/dist/less.min.js | 8 +-
packages/less/dist/less.min.js.map | 2 +-
.../less-browser/add-default-options.js | 4 +-
.../{src => lib}/less-browser/bootstrap.js | 6 +-
.../less/{src => lib}/less-browser/browser.js | 2 +-
.../less/{src => lib}/less-browser/cache.js | 0
.../less-browser/error-reporting.js | 4 +-
.../{src => lib}/less-browser/file-manager.js | 0
.../{src => lib}/less-browser/image-size.js | 2 +-
.../less/{src => lib}/less-browser/index.js | 21 +-
.../{src => lib}/less-browser/log-listener.js | 0
.../less-browser/plugin-loader.js | 0
.../less/{src => lib}/less-browser/utils.js | 0
packages/less/lib/less-node/environment.js | 43 +
.../{src => lib}/less-node/file-manager.js | 5 +-
packages/less/lib/less-node/fs.js | 12 +
.../less/{src => lib}/less-node/image-size.js | 9 +-
packages/less/lib/less-node/index.js | 31 +
.../{src => lib}/less-node/lessc-helper.js | 5 +-
.../{src => lib}/less-node/plugin-loader.js | 3 +
.../less-node/url-file-manager.js | 6 +-
packages/less/{src => lib}/less/constants.js | 0
packages/less/{src => lib}/less/contexts.js | 2 +-
.../less/{src => lib}/less/data/colors.js | 0
packages/less/lib/less/data/index.js | 4 +
.../less/data/unit-conversions.js | 0
.../less/{src => lib}/less/default-options.js | 0
.../less/{src => lib}/less/deprecation.js | 0
.../less/environment/abstract-file-manager.js | 0
.../environment/abstract-plugin-loader.js | 4 +-
.../less/environment/environment-api.ts | 0
.../less/environment/environment.js | 2 +-
.../less/environment/file-manager-api.ts | 0
.../{src => lib}/less/functions/boolean.js | 4 +-
.../less/functions/color-blending.js | 2 +-
.../less/{src => lib}/less/functions/color.js | 12 +-
.../{src => lib}/less/functions/data-uri.js | 8 +-
.../{src => lib}/less/functions/default.js | 4 +-
.../less/functions/function-caller.js | 2 +-
.../less/functions/function-registry.js | 0
.../less/{src => lib}/less/functions/index.js | 28 +-
.../less/{src => lib}/less/functions/list.js | 20 +-
.../less/functions/math-helper.js | 2 +-
.../less/{src => lib}/less/functions/math.js | 0
.../{src => lib}/less/functions/number.js | 4 +-
.../{src => lib}/less/functions/string.js | 6 +-
.../less/{src => lib}/less/functions/style.js | 4 +-
.../less/{src => lib}/less/functions/svg.js | 10 +-
.../less/{src => lib}/less/functions/types.js | 16 +-
.../less/{src => lib}/less/import-manager.js | 10 +-
packages/less/{src => lib}/less/index.js | 43 +-
packages/less/{src => lib}/less/less-error.js | 2 +-
packages/less/{src => lib}/less/logger.js | 0
packages/less/{src => lib}/less/parse-tree.js | 16 +-
packages/less/{src => lib}/less/parse.js | 10 +-
.../{src => lib}/less/parser/parser-input.js | 0
.../less/{src => lib}/less/parser/parser.js | 22 +-
.../less/{src => lib}/less/plugin-manager.js | 0
packages/less/{src => lib}/less/render.js | 2 +-
.../{src => lib}/less/source-map-builder.js | 0
.../{src => lib}/less/source-map-output.js | 0
.../less/{src => lib}/less/transform-tree.js | 6 +-
.../less/{src => lib}/less/tree/anonymous.js | 2 +-
.../less/{src => lib}/less/tree/assignment.js | 2 +-
.../{src => lib}/less/tree/atrule-syntax.js | 0
.../less/{src => lib}/less/tree/atrule.js | 12 +-
.../less/{src => lib}/less/tree/attribute.js | 2 +-
packages/less/{src => lib}/less/tree/call.js | 6 +-
packages/less/{src => lib}/less/tree/color.js | 4 +-
.../less/{src => lib}/less/tree/combinator.js | 2 +-
.../less/{src => lib}/less/tree/comment.js | 4 +-
.../less/{src => lib}/less/tree/condition.js | 2 +-
.../less/{src => lib}/less/tree/container.js | 10 +-
.../less/{src => lib}/less/tree/debug-info.js | 0
.../{src => lib}/less/tree/declaration.js | 10 +-
.../less/tree/detached-ruleset.js | 6 +-
.../less/{src => lib}/less/tree/dimension.js | 8 +-
.../less/{src => lib}/less/tree/element.js | 6 +-
.../less/{src => lib}/less/tree/expression.js | 10 +-
.../less/{src => lib}/less/tree/extend.js | 4 +-
.../less/{src => lib}/less/tree/import.js | 18 +-
packages/less/lib/less/tree/index.js | 55 +
.../less/{src => lib}/less/tree/javascript.js | 8 +-
.../{src => lib}/less/tree/js-eval-node.js | 4 +-
.../less/{src => lib}/less/tree/keyword.js | 2 +-
packages/less/{src => lib}/less/tree/media.js | 10 +-
.../{src => lib}/less/tree/merge-rules.js | 4 +-
.../less/{src => lib}/less/tree/mixin-call.js | 8 +-
.../less/tree/mixin-definition.js | 16 +-
.../{src => lib}/less/tree/namespace-value.js | 8 +-
.../less/{src => lib}/less/tree/negative.js | 6 +-
.../{src => lib}/less/tree/nested-at-rule.js | 12 +-
packages/less/{src => lib}/less/tree/node.js | 0
.../less/{src => lib}/less/tree/operation.js | 8 +-
packages/less/{src => lib}/less/tree/paren.js | 2 +-
.../less/{src => lib}/less/tree/property.js | 4 +-
.../{src => lib}/less/tree/query-in-parens.js | 2 +-
.../less/{src => lib}/less/tree/quoted.js | 6 +-
.../less/{src => lib}/less/tree/ruleset.js | 28 +-
.../less/{src => lib}/less/tree/selector.js | 10 +-
.../less/tree/unicode-descriptor.js | 2 +-
packages/less/{src => lib}/less/tree/unit.js | 6 +-
packages/less/{src => lib}/less/tree/url.js | 2 +-
packages/less/{src => lib}/less/tree/value.js | 2 +-
.../{src => lib}/less/tree/variable-call.js | 10 +-
.../less/{src => lib}/less/tree/variable.js | 4 +-
packages/less/{src => lib}/less/utils.js | 2 +-
.../less/visitors/extend-visitor.js | 8 +-
.../less/visitors/import-sequencer.js | 0
.../less/visitors/import-visitor.js | 8 +-
packages/less/lib/less/visitors/index.js | 15 +
.../less/visitors/join-selector-visitor.js | 2 +-
.../visitors/set-tree-visibility-visitor.js | 0
.../less/visitors/to-css-visitor.js | 6 +-
.../{src => lib}/less/visitors/visitor.js | 2 +-
packages/less/package.json | 25 +-
packages/less/scripts/coverage-lines.js | 54 +-
packages/less/scripts/coverage-report.js | 62 +-
packages/less/scripts/postinstall.js | 37 +-
packages/less/src/less-node/environment.js | 27 -
packages/less/src/less-node/fs.js | 10 -
packages/less/src/less-node/index.js | 22 -
packages/less/src/less/data/index.js | 4 -
packages/less/src/less/tree/index.js | 55 -
packages/less/src/less/visitors/index.js | 15 -
...nchmark.config.js => benchmark.config.cjs} | 0
.../less/test/browser/generator/generate.cjs | 78 +
.../less/test/browser/generator/generate.js | 86 +-
.../less/test/browser/generator/runner.cjs | 2 +
.../{runner.config.js => runner.config.cjs} | 10 +-
.../less/test/browser/generator/runner.js | 4 +-
.../generator/{template.js => template.cjs} | 2 +-
.../browser/generator/{utils.js => utils.cjs} | 0
packages/less/test/index.js | 190 +-
packages/less/test/less-test.js | 270 +-
packages/less/test/mocha-playwright/runner.js | 10 +-
packages/less/test/modify-vars.js | 13 +-
.../filemanager/{index.js => index.cjs} | 0
.../postprocess/{index.js => index.cjs} | 0
.../preprocess/{index.js => index.cjs} | 0
.../plugins/visitor/{index.js => index.cjs} | 0
.../less/test/sourcemaps/comprehensive.json | 2 +-
.../less/test/{test-es6.ts => test-es6.js} | 4 +-
packages/less/tsconfig.build.json | 7 -
packages/less/tsconfig.json | 24 +-
.../filemanagerPlugin/styles.config.cjs | 2 +-
.../postProcessorPlugin/styles.config.cjs | 2 +-
.../preProcessorPlugin/styles.config.cjs | 2 +-
.../visitorPlugin/styles.config.cjs | 2 +-
pnpm-lock.yaml | 211 +-
158 files changed, 6749 insertions(+), 5744 deletions(-)
rename packages/less/{.eslintrc.js => .eslintrc.cjs} (100%)
rename packages/less/{Gruntfile.js => Gruntfile.cjs} (94%)
rename packages/less/{src => lib}/less-browser/add-default-options.js (95%)
rename packages/less/{src => lib}/less-browser/bootstrap.js (91%)
rename packages/less/{src => lib}/less-browser/browser.js (98%)
rename packages/less/{src => lib}/less-browser/cache.js (100%)
rename packages/less/{src => lib}/less-browser/error-reporting.js (98%)
rename packages/less/{src => lib}/less-browser/file-manager.js (100%)
rename packages/less/{src => lib}/less-browser/image-size.js (98%)
rename packages/less/{src => lib}/less-browser/index.js (95%)
rename packages/less/{src => lib}/less-browser/log-listener.js (100%)
rename packages/less/{src => lib}/less-browser/plugin-loader.js (100%)
rename packages/less/{src => lib}/less-browser/utils.js (100%)
create mode 100644 packages/less/lib/less-node/environment.js
rename packages/less/{src => lib}/less-node/file-manager.js (98%)
create mode 100644 packages/less/lib/less-node/fs.js
rename packages/less/{src => lib}/less-node/image-size.js (90%)
create mode 100644 packages/less/lib/less-node/index.js
rename packages/less/{src => lib}/less-node/lessc-helper.js (97%)
rename packages/less/{src => lib}/less-node/plugin-loader.js (95%)
rename packages/less/{src => lib}/less-node/url-file-manager.js (94%)
rename packages/less/{src => lib}/less/constants.js (100%)
rename packages/less/{src => lib}/less/contexts.js (99%)
rename packages/less/{src => lib}/less/data/colors.js (100%)
create mode 100644 packages/less/lib/less/data/index.js
rename packages/less/{src => lib}/less/data/unit-conversions.js (100%)
rename packages/less/{src => lib}/less/default-options.js (100%)
rename packages/less/{src => lib}/less/deprecation.js (100%)
rename packages/less/{src => lib}/less/environment/abstract-file-manager.js (100%)
rename packages/less/{src => lib}/less/environment/abstract-plugin-loader.js (98%)
rename packages/less/{src => lib}/less/environment/environment-api.ts (100%)
rename packages/less/{src => lib}/less/environment/environment.js (98%)
rename packages/less/{src => lib}/less/environment/file-manager-api.ts (100%)
rename packages/less/{src => lib}/less/functions/boolean.js (87%)
rename packages/less/{src => lib}/less/functions/color-blending.js (98%)
rename packages/less/{src => lib}/less/functions/color.js (98%)
rename packages/less/{src => lib}/less/functions/data-uri.js (94%)
rename packages/less/{src => lib}/less/functions/default.js (85%)
rename packages/less/{src => lib}/less/functions/function-caller.js (97%)
rename packages/less/{src => lib}/less/functions/function-registry.js (100%)
rename packages/less/{src => lib}/less/functions/index.js (57%)
rename packages/less/{src => lib}/less/functions/list.js (90%)
rename packages/less/{src => lib}/less/functions/math-helper.js (87%)
rename packages/less/{src => lib}/less/functions/math.js (100%)
rename packages/less/{src => lib}/less/functions/number.js (97%)
rename packages/less/{src => lib}/less/functions/string.js (91%)
rename packages/less/{src => lib}/less/functions/style.js (90%)
rename packages/less/{src => lib}/less/functions/svg.js (94%)
rename packages/less/{src => lib}/less/functions/types.js (83%)
rename packages/less/{src => lib}/less/import-manager.js (97%)
rename packages/less/{src => lib}/less/index.js (72%)
rename packages/less/{src => lib}/less/less-error.js (99%)
rename packages/less/{src => lib}/less/logger.js (100%)
rename packages/less/{src => lib}/less/parse-tree.js (93%)
rename packages/less/{src => lib}/less/parse.js (93%)
rename packages/less/{src => lib}/less/parser/parser-input.js (100%)
rename packages/less/{src => lib}/less/parser/parser.js (99%)
rename packages/less/{src => lib}/less/plugin-manager.js (100%)
rename packages/less/{src => lib}/less/render.js (97%)
rename packages/less/{src => lib}/less/source-map-builder.js (100%)
rename packages/less/{src => lib}/less/source-map-output.js (100%)
rename packages/less/{src => lib}/less/transform-tree.js (96%)
rename packages/less/{src => lib}/less/tree/anonymous.js (97%)
rename packages/less/{src => lib}/less/tree/assignment.js (95%)
rename packages/less/{src => lib}/less/tree/atrule-syntax.js (100%)
rename packages/less/{src => lib}/less/tree/atrule.js (97%)
rename packages/less/{src => lib}/less/tree/attribute.js (96%)
rename packages/less/{src => lib}/less/tree/call.js (96%)
rename packages/less/{src => lib}/less/tree/color.js (99%)
rename packages/less/{src => lib}/less/tree/combinator.js (95%)
rename packages/less/{src => lib}/less/tree/comment.js (90%)
rename packages/less/{src => lib}/less/tree/condition.js (97%)
rename packages/less/{src => lib}/less/tree/container.js (90%)
rename packages/less/{src => lib}/less/tree/debug-info.js (100%)
rename packages/less/{src => lib}/less/tree/declaration.js (95%)
rename packages/less/{src => lib}/less/tree/detached-ruleset.js (86%)
rename packages/less/{src => lib}/less/tree/dimension.js (97%)
rename packages/less/{src => lib}/less/tree/element.js (95%)
rename packages/less/{src => lib}/less/tree/expression.js (92%)
rename packages/less/{src => lib}/less/tree/extend.js (96%)
rename packages/less/{src => lib}/less/tree/import.js (96%)
create mode 100644 packages/less/lib/less/tree/index.js
rename packages/less/{src => lib}/less/tree/javascript.js (83%)
rename packages/less/{src => lib}/less/tree/js-eval-node.js (96%)
rename packages/less/{src => lib}/less/tree/keyword.js (93%)
rename packages/less/{src => lib}/less/tree/media.js (90%)
rename packages/less/{src => lib}/less/tree/merge-rules.js (93%)
rename packages/less/{src => lib}/less/tree/mixin-call.js (97%)
rename packages/less/{src => lib}/less/tree/mixin-definition.js (95%)
rename packages/less/{src => lib}/less/tree/namespace-value.js (94%)
rename packages/less/{src => lib}/less/tree/negative.js (81%)
rename packages/less/{src => lib}/less/tree/nested-at-rule.js (94%)
rename packages/less/{src => lib}/less/tree/node.js (100%)
rename packages/less/{src => lib}/less/tree/operation.js (91%)
rename packages/less/{src => lib}/less/tree/paren.js (94%)
rename packages/less/{src => lib}/less/tree/property.js (96%)
rename packages/less/{src => lib}/less/tree/query-in-parens.js (97%)
rename packages/less/{src => lib}/less/tree/quoted.js (95%)
rename packages/less/{src => lib}/less/tree/ruleset.js (98%)
rename packages/less/{src => lib}/less/tree/selector.js (96%)
rename packages/less/{src => lib}/less/tree/unicode-descriptor.js (86%)
rename packages/less/{src => lib}/less/tree/unit.js (96%)
rename packages/less/{src => lib}/less/tree/url.js (98%)
rename packages/less/{src => lib}/less/tree/value.js (97%)
rename packages/less/{src => lib}/less/tree/variable-call.js (85%)
rename packages/less/{src => lib}/less/tree/variable.js (96%)
rename packages/less/{src => lib}/less/utils.js (98%)
rename packages/less/{src => lib}/less/visitors/extend-visitor.js (99%)
rename packages/less/{src => lib}/less/visitors/import-sequencer.js (100%)
rename packages/less/{src => lib}/less/visitors/import-visitor.js (97%)
create mode 100644 packages/less/lib/less/visitors/index.js
rename packages/less/{src => lib}/less/visitors/join-selector-visitor.js (98%)
rename packages/less/{src => lib}/less/visitors/set-tree-visibility-visitor.js (100%)
rename packages/less/{src => lib}/less/visitors/to-css-visitor.js (98%)
rename packages/less/{src => lib}/less/visitors/visitor.js (99%)
delete mode 100644 packages/less/src/less-node/environment.js
delete mode 100644 packages/less/src/less-node/fs.js
delete mode 100644 packages/less/src/less-node/index.js
delete mode 100644 packages/less/src/less/data/index.js
delete mode 100644 packages/less/src/less/tree/index.js
delete mode 100644 packages/less/src/less/visitors/index.js
rename packages/less/test/browser/generator/{benchmark.config.js => benchmark.config.cjs} (100%)
create mode 100644 packages/less/test/browser/generator/generate.cjs
create mode 100644 packages/less/test/browser/generator/runner.cjs
rename packages/less/test/browser/generator/{runner.config.js => runner.config.cjs} (96%)
rename packages/less/test/browser/generator/{template.js => template.cjs} (98%)
rename packages/less/test/browser/generator/{utils.js => utils.cjs} (100%)
rename packages/less/test/plugins/filemanager/{index.js => index.cjs} (100%)
rename packages/less/test/plugins/postprocess/{index.js => index.cjs} (100%)
rename packages/less/test/plugins/preprocess/{index.js => index.cjs} (100%)
rename packages/less/test/plugins/visitor/{index.js => index.cjs} (100%)
rename packages/less/test/{test-es6.ts => test-es6.js} (76%)
delete mode 100644 packages/less/tsconfig.build.json
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 8fb80138d..62436e1ba 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -23,8 +23,6 @@ jobs:
node: 'lts/-1'
- os: ubuntu-latest
node: 'lts/-2'
- - os: ubuntu-latest
- node: 'lts/-3'
runs-on: ${{ matrix.os }}
# This has copy/paste steps and should be refactored using DRY
diff --git a/packages/less/.eslintrc.js b/packages/less/.eslintrc.cjs
similarity index 100%
rename from packages/less/.eslintrc.js
rename to packages/less/.eslintrc.cjs
diff --git a/packages/less/.gitignore b/packages/less/.gitignore
index 831c902ed..28568df4d 100644
--- a/packages/less/.gitignore
+++ b/packages/less/.gitignore
@@ -1,6 +1,5 @@
# project-specific
tmp
-lib
test/browser/less.min.js
test/browser/less.min.js.map
test/sourcemaps/**/*.map
diff --git a/packages/less/Gruntfile.js b/packages/less/Gruntfile.cjs
similarity index 94%
rename from packages/less/Gruntfile.js
rename to packages/less/Gruntfile.cjs
index 6f81878de..51b09a057 100644
--- a/packages/less/Gruntfile.js
+++ b/packages/less/Gruntfile.cjs
@@ -193,27 +193,16 @@ module.exports = function(grunt) {
}
},
build: {
- command: [
- /** Browser runtime */
- "node build/rollup.js --dist",
- /** Node.js runtime */
- "npm run build"
- ].join(" && ")
+ command: "node build/rollup.js --dist"
},
testbuild: {
- command: [
- "npm run build",
- "node build/rollup.js --browser --out=./tmp/browser/less.min.js"
- ].join(" && ")
- },
- testcjs: {
- command: "npm run build"
+ command: "node build/rollup.js --browser --out=./tmp/browser/less.min.js"
},
testbrowser: {
command: "node build/rollup.js --browser --out=./tmp/browser/less.min.js"
},
test: {
- command: 'npx ts-node test/test-es6.ts && node test/index.js'
+ command: 'node test/test-es6.js && node test/index.js'
},
generatebrowser: {
command: 'node test/browser/generator/generate.js'
@@ -265,11 +254,11 @@ module.exports = function(grunt) {
eslint: {
target: [
"test/**/*.js",
- "src/less*/**/*.js",
+ "lib/less*/**/*.js",
"!test/less/errors/plugin/plugin-error.js"
],
options: {
- configFile: ".eslintrc.js",
+ configFile: ".eslintrc.cjs",
fix: true
}
},
@@ -381,9 +370,8 @@ module.exports = function(grunt) {
// Run shell plugin test
grunt.registerTask("shell-plugin", ["shell:plugin"]);
- // Quickly build and run Node tests
+ // Quickly run Node tests (no build step needed)
grunt.registerTask("quicktest", [
- "shell:testcjs",
"shell:test"
]);
@@ -397,7 +385,6 @@ module.exports = function(grunt) {
// Run benchmark
grunt.registerTask("benchmark", [
- "shell:testcjs",
"shell:benchmark"
]);
};
diff --git a/packages/less/bin/lessc b/packages/less/bin/lessc
index 93c5254a9..a2e07b127 100755
--- a/packages/less/bin/lessc
+++ b/packages/less/bin/lessc
@@ -2,18 +2,17 @@
/* eslint indent: [2, 2, {"SwitchCase": 1}] */
-'use strict';
+import path from 'path';
+import os from 'os';
+import { createRequire } from 'module';
+import fs from '../lib/less-node/fs.js';
+import * as utils from '../lib/less/utils.js';
+import * as Constants from '../lib/less/constants.js';
+import less from '../lib/less-node/index.js';
-var path = require('path');
-var fs = require('../lib/less-node/fs').default;
-var os = require('os');
-var utils = require('../lib/less/utils');
-var Constants = require('../lib/less/constants');
-
-var less = require('../lib/less-node').default;
+const require = createRequire(import.meta.url);
var errno;
-var mkdirp;
try {
errno = require('errno');
@@ -108,22 +107,22 @@ function render() {
}
// Handle explicit sourceMapFullFilename (from --source-map=filename)
- // Normalization of other options (sourceMapBasepath, sourceMapRootpath, etc.)
+ // Normalization of other options (sourceMapBasepath, sourceMapRootpath, etc.)
// is handled automatically in parse-tree.js
if (sourceMapOptions.sourceMapFullFilename && !sourceMapFileInline) {
var mapFilename = path.resolve(process.cwd(), sourceMapOptions.sourceMapFullFilename);
var mapDir = path.dirname(mapFilename);
-
+
if (output) {
var outputDir = path.dirname(output);
// Set sourceMapOutputFilename relative to map directory
sourceMapOptions.sourceMapOutputFilename = path.join(
- path.relative(mapDir, outputDir),
+ path.relative(mapDir, outputDir),
path.basename(output)
);
// Set sourceMapFilename relative to output directory (for sourceMappingURL comment)
sourceMapOptions.sourceMapFilename = path.join(
- path.relative(outputDir, mapDir),
+ path.relative(outputDir, mapDir),
path.basename(sourceMapOptions.sourceMapFullFilename)
);
} else {
@@ -151,6 +150,7 @@ function render() {
return;
}
+ var mkdirp;
var ensureDirectory = function ensureDirectory(filepath) {
var dir = path.dirname(filepath);
var cmd;
@@ -189,7 +189,7 @@ function render() {
// To fix https://github.com/less/less.js/issues/3646
output = output.toString();
-
+
fs.writeFile(filename, output, 'utf8', function (err) {
if (err) {
var description = 'Error: ';
@@ -404,7 +404,7 @@ function processPluginQueue() {
case 'silent':
options.silent = silent = true;
break;
-
+
case 'quiet':
options.quiet = quiet = true;
break;
@@ -539,7 +539,7 @@ function processPluginQueue() {
}
break;
-
+
case 'ie-compat':
pendingDeprecations.push('Warning: The --ie-compat option is deprecated, as it has no effect on compilation.');
break;
@@ -652,7 +652,7 @@ function processPluginQueue() {
case 'disable-plugin-rule':
options.disablePluginRule = true;
break;
-
+
default:
queuePlugins.push({
name: arg,
@@ -675,4 +675,4 @@ function processPluginQueue() {
} else {
render();
}
-})();
\ No newline at end of file
+})();
diff --git a/packages/less/build/banner.js b/packages/less/build/banner.js
index 44074aac6..4557b6a23 100644
--- a/packages/less/build/banner.js
+++ b/packages/less/build/banner.js
@@ -1,10 +1,13 @@
+import { createRequire } from 'module';
+
+const require = createRequire(import.meta.url);
const pkg = require('./../package.json');
-module.exports =
+export default
`/**
* Less - ${ pkg.description } v${ pkg.version }
* http://lesscss.org
- *
+ *
* Copyright (c) 2009-${new Date().getFullYear()}, ${ pkg.author.name } <${ pkg.author.email }>
* Licensed under the ${ pkg.license } License.
*
diff --git a/packages/less/build/rollup.js b/packages/less/build/rollup.js
index f079f1400..c759a789d 100644
--- a/packages/less/build/rollup.js
+++ b/packages/less/build/rollup.js
@@ -1,21 +1,23 @@
-const rollup = require('rollup');
-const typescript = require('rollup-plugin-typescript2');
-const commonjs = require('@rollup/plugin-commonjs');
-const json = require('@rollup/plugin-json');
-const resolve = require('@rollup/plugin-node-resolve').nodeResolve;
-const terser = require('rollup-plugin-terser').terser;
-const banner = require('./banner');
-const path = require('path');
+import { rollup } from 'rollup';
+import commonjs from '@rollup/plugin-commonjs';
+import json from '@rollup/plugin-json';
+import { nodeResolve as resolve } from '@rollup/plugin-node-resolve';
+import { terser } from 'rollup-plugin-terser';
+import banner from './banner.js';
+import path from 'path';
+import { fileURLToPath } from 'url';
+import minimist from 'minimist';
+const __dirname = path.dirname(fileURLToPath(import.meta.url));
const rootPath = path.join(__dirname, '..');
-const args = require('minimist')(process.argv.slice(2));
+const args = minimist(process.argv.slice(2));
let outDir = args.dist ? './dist' : './tmp';
async function buildBrowser() {
- let bundle = await rollup.rollup({
- input: './src/less-browser/bootstrap.js',
+ let bundle = await rollup({
+ input: './lib/less-browser/bootstrap.js',
output: [
{
file: 'less.js',
@@ -30,18 +32,6 @@ async function buildBrowser() {
resolve(),
commonjs(),
json(),
- typescript({
- verbosity: 2,
- tsconfigDefaults: {
- compilerOptions: {
- allowJs: true,
- sourceMap: true,
- target: 'ES5'
- }
- },
- include: [ '*.ts', '**/*.ts', '*.js', '**/*.js' ],
- exclude: ['node_modules'] // only transpile our source code
- }),
terser({
compress: true,
include: [/^.+\.min\.js$/],
@@ -65,7 +55,7 @@ async function buildBrowser() {
format: 'umd',
name: 'less',
banner
- });
+ });
}
if (!args.out || args.out.indexOf('less.min.js') > -1) {
diff --git a/packages/less/dist/less.js b/packages/less/dist/less.js
index 0883ae41c..21d6708ef 100644
--- a/packages/less/dist/less.js
+++ b/packages/less/dist/less.js
@@ -1,8 +1,8 @@
/**
- * Less - Leaner CSS v4.4.2
+ * Less - Leaner CSS v4.5.0
* http://lesscss.org
- *
- * Copyright (c) 2009-2025, Alexis Sellier
+ *
+ * Copyright (c) 2009-2026, Alexis Sellier
* Licensed under the Apache-2.0 License.
*
* @license Apache-2.0
@@ -15,153 +15,193 @@
})(this, (function () { 'use strict';
// Export a new default each time
- function defaultOptions () {
+ function defaultOptions() {
return {
/* Inline Javascript - @plugin still allowed */
javascriptEnabled: false,
+
/* Outputs a makefile import dependency list to stdout. */
depends: false,
- /* (DEPRECATED) Compress using less built-in compression.
- * This does an okay job but does not utilise all the tricks of
+
+ /* (DEPRECATED) Compress using less built-in compression.
+ * This does an okay job but does not utilise all the tricks of
* dedicated css compression. */
compress: false,
+
/* Runs the less parser and just reports errors without any output. */
lint: false,
+
/* Sets available include paths.
- * If the file in an @import rule does not exist at that exact location,
- * less will look for it at the location(s) passed to this option.
- * You might use this for instance to specify a path to a library which
+ * If the file in an @import rule does not exist at that exact location,
+ * less will look for it at the location(s) passed to this option.
+ * You might use this for instance to specify a path to a library which
* you want to be referenced simply and relatively in the less files. */
paths: [],
+
/* color output in the terminal */
color: true,
- /* The strictImports controls whether the compiler will allow an @import inside of either
- * @media blocks or (a later addition) other selector blocks.
- * See: https://github.com/less/less.js/issues/656 */
+
+ /**
+ * @deprecated This option has confusing behavior and may be removed in a future version.
+ *
+ * When true, prevents @import statements for .less files from being evaluated inside
+ * selector blocks (rulesets). The imports are silently ignored and not output.
+ *
+ * Behavior:
+ * - @import at root level: Always processed
+ * - @import inside @-rules (@media, @supports, etc.): Processed (these are not selector blocks)
+ * - @import inside selector blocks (.class, #id, etc.): NOT processed (silently ignored)
+ *
+ * When false (default): All @import statements are processed regardless of context.
+ *
+ * Note: Despite the name "strict", this option does NOT throw an error when imports
+ * are used in selector blocks - it silently ignores them. This is confusing
+ * behavior that may catch users off guard.
+ *
+ * Note: Only affects .less file imports. CSS imports (url(...) or .css files) are
+ * always output as CSS @import statements regardless of this setting.
+ *
+ * @see https://github.com/less/less.js/issues/656
+ */
strictImports: false,
+
/* Allow Imports from Insecure HTTPS Hosts */
insecure: false,
- /* Allows you to add a path to every generated import and url in your css.
- * This does not affect less import statements that are processed, just ones
+
+ /* Allows you to add a path to every generated import and url in your css.
+ * This does not affect less import statements that are processed, just ones
* that are left in the output css. */
rootpath: '',
- /* By default URLs are kept as-is, so if you import a file in a sub-directory
- * that references an image, exactly the same URL will be output in the css.
- * This option allows you to re-write URL's in imported files so that the
+
+ /* By default URLs are kept as-is, so if you import a file in a sub-directory
+ * that references an image, exactly the same URL will be output in the css.
+ * This option allows you to re-write URL's in imported files so that the
* URL is always relative to the base imported file */
rewriteUrls: false,
- /* How to process math
+
+ /* How to process math
* 0 always - eagerly try to solve all operations
* 1 parens-division - require parens for division "/"
* 2 parens | strict - require parens for all operations
* 3 strict-legacy - legacy strict behavior (super-strict)
*/
math: 1,
+
/* Without this option, less attempts to guess at the output unit when it does maths. */
strictUnits: false,
- /* Effectively the declaration is put at the top of your base Less file,
- * meaning it can be used but it also can be overridden if this variable
+
+ /* Effectively the declaration is put at the top of your base Less file,
+ * meaning it can be used but it also can be overridden if this variable
* is defined in the file. */
globalVars: null,
+
/* As opposed to the global variable option, this puts the declaration at the
* end of your base file, meaning it will override anything defined in your Less file. */
modifyVars: null,
+
/* This option allows you to specify a argument to go on to every URL. */
urlArgs: ''
- };
+ }
}
function extractId(href) {
- return href.replace(/^[a-z-]+:\/+?[^/]+/, '') // Remove protocol & domain
- .replace(/[?&]livereload=\w+/, '') // Remove LiveReload cachebuster
- .replace(/^\//, '') // Remove root /
- .replace(/\.[a-zA-Z]+$/, '') // Remove simple extension
- .replace(/[^.\w-]+/g, '-') // Replace illegal characters
- .replace(/\./g, ':'); // Replace dots with colons(for valid id)
+ return href.replace(/^[a-z-]+:\/+?[^/]+/, '') // Remove protocol & domain
+ .replace(/[?&]livereload=\w+/, '') // Remove LiveReload cachebuster
+ .replace(/^\//, '') // Remove root /
+ .replace(/\.[a-zA-Z]+$/, '') // Remove simple extension
+ .replace(/[^.\w-]+/g, '-') // Replace illegal characters
+ .replace(/\./g, ':'); // Replace dots with colons(for valid id)
}
+
function addDataAttr(options, tag) {
- if (!tag) {
- return;
- } // in case of tag is null or undefined
- for (var opt in tag.dataset) {
+ if (!tag) {return;} // in case of tag is null or undefined
+ for (const opt in tag.dataset) {
if (Object.prototype.hasOwnProperty.call(tag.dataset, opt)) {
if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') {
options[opt] = tag.dataset[opt];
- }
- else {
+ } else {
try {
options[opt] = JSON.parse(tag.dataset[opt]);
}
- catch (_) { }
+ catch (_) {}
}
}
}
}
- var browser = {
+ var browser$1 = {
createCSS: function (document, styles, sheet) {
// Strip the query-string
- var href = sheet.href || '';
+ const href = sheet.href || '';
+
// If there is no title set, use the filename, minus the extension
- var id = "less:".concat(sheet.title || extractId(href));
+ const id = `less:${sheet.title || extractId(href)}`;
+
// If this has already been inserted into the DOM, we may need to replace it
- var oldStyleNode = document.getElementById(id);
- var keepOldStyleNode = false;
+ const oldStyleNode = document.getElementById(id);
+ let keepOldStyleNode = false;
+
// Create a new stylesheet node for insertion or (if necessary) replacement
- var styleNode = document.createElement('style');
+ const styleNode = document.createElement('style');
styleNode.setAttribute('type', 'text/css');
if (sheet.media) {
styleNode.setAttribute('media', sheet.media);
}
styleNode.id = id;
+
if (!styleNode.styleSheet) {
styleNode.appendChild(document.createTextNode(styles));
+
// If new contents match contents of oldStyleNode, don't replace oldStyleNode
keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 &&
oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);
}
- var head = document.getElementsByTagName('head')[0];
+
+ const head = document.getElementsByTagName('head')[0];
+
// If there is no oldStyleNode, just append; otherwise, only append if we need
// to replace oldStyleNode with an updated stylesheet
if (oldStyleNode === null || keepOldStyleNode === false) {
- var nextEl = sheet && sheet.nextSibling || null;
+ const nextEl = sheet && sheet.nextSibling || null;
if (nextEl) {
nextEl.parentNode.insertBefore(styleNode, nextEl);
- }
- else {
+ } else {
head.appendChild(styleNode);
}
}
if (oldStyleNode && keepOldStyleNode === false) {
oldStyleNode.parentNode.removeChild(oldStyleNode);
}
+
// For IE.
// This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.
// See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head
if (styleNode.styleSheet) {
try {
styleNode.styleSheet.cssText = styles;
- }
- catch (e) {
+ } catch (e) {
throw new Error('Couldn\'t reassign styleSheet.cssText.');
}
}
},
- currentScript: function (window) {
- var document = window.document;
- return document.currentScript || (function () {
- var scripts = document.getElementsByTagName('script');
+ currentScript: function(window) {
+ const document = window.document;
+ return document.currentScript || (() => {
+ const scripts = document.getElementsByTagName('script');
return scripts[scripts.length - 1];
})();
}
};
- var addDefaultOptions = (function (window, options) {
+ var addDefaultOptions = (window, options) => {
+
// use options from the current script tag data attribues
- addDataAttr(options, browser.currentScript(window));
+ addDataAttr(options, browser$1.currentScript(window));
+
if (options.isFileProtocol === undefined) {
options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);
}
+
// Load styles asynchronously (default: false)
//
// This is set to `false` by default, so that the body
@@ -170,57 +210,63 @@
//
options.async = options.async || false;
options.fileAsync = options.fileAsync || false;
+
// Interval between watch polls
options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);
+
options.env = options.env || (window.location.hostname == '127.0.0.1' ||
- window.location.hostname == '0.0.0.0' ||
+ window.location.hostname == '0.0.0.0' ||
window.location.hostname == 'localhost' ||
(window.location.port &&
- window.location.port.length > 0) ||
- options.isFileProtocol ? 'development'
+ window.location.port.length > 0) ||
+ options.isFileProtocol ? 'development'
: 'production');
- var dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);
+
+ const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);
if (dumpLineNumbers) {
options.dumpLineNumbers = dumpLineNumbers[1];
}
+
if (options.useFileCache === undefined) {
options.useFileCache = true;
}
+
if (options.onReady === undefined) {
options.onReady = true;
}
+
if (options.relativeUrls) {
options.rewriteUrls = 'all';
}
- });
+ };
var logger$1 = {
- error: function (msg) {
+ error: function(msg) {
this._fireEvent('error', msg);
},
- warn: function (msg) {
+ warn: function(msg) {
this._fireEvent('warn', msg);
},
- info: function (msg) {
+ info: function(msg) {
this._fireEvent('info', msg);
},
- debug: function (msg) {
+ debug: function(msg) {
this._fireEvent('debug', msg);
},
- addListener: function (listener) {
+ addListener: function(listener) {
this._listeners.push(listener);
},
- removeListener: function (listener) {
- for (var i_1 = 0; i_1 < this._listeners.length; i_1++) {
- if (this._listeners[i_1] === listener) {
- this._listeners.splice(i_1, 1);
+ removeListener: function(listener) {
+ for (let i = 0; i < this._listeners.length; i++) {
+ if (this._listeners[i] === listener) {
+ this._listeners.splice(i, 1);
return;
}
}
},
- _fireEvent: function (type, msg) {
- for (var i_2 = 0; i_2 < this._listeners.length; i_2++) {
- var logFunction = this._listeners[i_2][type];
+ _fireEvent: function(type, msg) {
+ for (let i = 0; i < this._listeners.length; i++) {
+ const logFunction = this._listeners[i][type];
if (logFunction) {
logFunction(msg);
}
@@ -233,201 +279,207 @@
* @todo Document why this abstraction exists, and the relationship between
* environment, file managers, and plugin manager
*/
- var Environment = /** @class */ (function () {
- function Environment(externalEnvironment, fileManagers) {
+
+ class Environment {
+ constructor(externalEnvironment, fileManagers) {
this.fileManagers = fileManagers || [];
externalEnvironment = externalEnvironment || {};
- var optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];
- var requiredFunctions = [];
- var functions = requiredFunctions.concat(optionalFunctions);
- for (var i_1 = 0; i_1 < functions.length; i_1++) {
- var propName = functions[i_1];
- var environmentFunc = externalEnvironment[propName];
+
+ const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];
+ const requiredFunctions = [];
+ const functions = requiredFunctions.concat(optionalFunctions);
+
+ for (let i = 0; i < functions.length; i++) {
+ const propName = functions[i];
+ const environmentFunc = externalEnvironment[propName];
if (environmentFunc) {
this[propName] = environmentFunc.bind(externalEnvironment);
- }
- else if (i_1 < requiredFunctions.length) {
- this.warn("missing required function in environment - ".concat(propName));
+ } else if (i < requiredFunctions.length) {
+ this.warn(`missing required function in environment - ${propName}`);
}
}
}
- Environment.prototype.getFileManager = function (filename, currentDirectory, options, environment, isSync) {
+
+ getFileManager(filename, currentDirectory, options, environment, isSync) {
+
if (!filename) {
logger$1.warn('getFileManager called with no filename.. Please report this issue. continuing.');
}
if (currentDirectory === undefined) {
logger$1.warn('getFileManager called with null directory.. Please report this issue. continuing.');
}
- var fileManagers = this.fileManagers;
+
+ let fileManagers = this.fileManagers;
if (options.pluginManager) {
fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());
}
- for (var i_2 = fileManagers.length - 1; i_2 >= 0; i_2--) {
- var fileManager = fileManagers[i_2];
+ for (let i = fileManagers.length - 1; i >= 0 ; i--) {
+ const fileManager = fileManagers[i];
if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {
return fileManager;
}
}
return null;
- };
- Environment.prototype.addFileManager = function (fileManager) {
+ }
+
+ addFileManager(fileManager) {
this.fileManagers.push(fileManager);
- };
- Environment.prototype.clearFileManagers = function () {
+ }
+
+ clearFileManagers() {
this.fileManagers = [];
- };
- return Environment;
- }());
+ }
+ }
var colors = {
- 'aliceblue': '#f0f8ff',
- 'antiquewhite': '#faebd7',
- 'aqua': '#00ffff',
- 'aquamarine': '#7fffd4',
- 'azure': '#f0ffff',
- 'beige': '#f5f5dc',
- 'bisque': '#ffe4c4',
- 'black': '#000000',
- 'blanchedalmond': '#ffebcd',
- 'blue': '#0000ff',
- 'blueviolet': '#8a2be2',
- 'brown': '#a52a2a',
- 'burlywood': '#deb887',
- 'cadetblue': '#5f9ea0',
- 'chartreuse': '#7fff00',
- 'chocolate': '#d2691e',
- 'coral': '#ff7f50',
- 'cornflowerblue': '#6495ed',
- 'cornsilk': '#fff8dc',
- 'crimson': '#dc143c',
- 'cyan': '#00ffff',
- 'darkblue': '#00008b',
- 'darkcyan': '#008b8b',
- 'darkgoldenrod': '#b8860b',
- 'darkgray': '#a9a9a9',
- 'darkgrey': '#a9a9a9',
- 'darkgreen': '#006400',
- 'darkkhaki': '#bdb76b',
- 'darkmagenta': '#8b008b',
- 'darkolivegreen': '#556b2f',
- 'darkorange': '#ff8c00',
- 'darkorchid': '#9932cc',
- 'darkred': '#8b0000',
- 'darksalmon': '#e9967a',
- 'darkseagreen': '#8fbc8f',
- 'darkslateblue': '#483d8b',
- 'darkslategray': '#2f4f4f',
- 'darkslategrey': '#2f4f4f',
- 'darkturquoise': '#00ced1',
- 'darkviolet': '#9400d3',
- 'deeppink': '#ff1493',
- 'deepskyblue': '#00bfff',
- 'dimgray': '#696969',
- 'dimgrey': '#696969',
- 'dodgerblue': '#1e90ff',
- 'firebrick': '#b22222',
- 'floralwhite': '#fffaf0',
- 'forestgreen': '#228b22',
- 'fuchsia': '#ff00ff',
- 'gainsboro': '#dcdcdc',
- 'ghostwhite': '#f8f8ff',
- 'gold': '#ffd700',
- 'goldenrod': '#daa520',
- 'gray': '#808080',
- 'grey': '#808080',
- 'green': '#008000',
- 'greenyellow': '#adff2f',
- 'honeydew': '#f0fff0',
- 'hotpink': '#ff69b4',
- 'indianred': '#cd5c5c',
- 'indigo': '#4b0082',
- 'ivory': '#fffff0',
- 'khaki': '#f0e68c',
- 'lavender': '#e6e6fa',
- 'lavenderblush': '#fff0f5',
- 'lawngreen': '#7cfc00',
- 'lemonchiffon': '#fffacd',
- 'lightblue': '#add8e6',
- 'lightcoral': '#f08080',
- 'lightcyan': '#e0ffff',
- 'lightgoldenrodyellow': '#fafad2',
- 'lightgray': '#d3d3d3',
- 'lightgrey': '#d3d3d3',
- 'lightgreen': '#90ee90',
- 'lightpink': '#ffb6c1',
- 'lightsalmon': '#ffa07a',
- 'lightseagreen': '#20b2aa',
- 'lightskyblue': '#87cefa',
- 'lightslategray': '#778899',
- 'lightslategrey': '#778899',
- 'lightsteelblue': '#b0c4de',
- 'lightyellow': '#ffffe0',
- 'lime': '#00ff00',
- 'limegreen': '#32cd32',
- 'linen': '#faf0e6',
- 'magenta': '#ff00ff',
- 'maroon': '#800000',
- 'mediumaquamarine': '#66cdaa',
- 'mediumblue': '#0000cd',
- 'mediumorchid': '#ba55d3',
- 'mediumpurple': '#9370d8',
- 'mediumseagreen': '#3cb371',
- 'mediumslateblue': '#7b68ee',
- 'mediumspringgreen': '#00fa9a',
- 'mediumturquoise': '#48d1cc',
- 'mediumvioletred': '#c71585',
- 'midnightblue': '#191970',
- 'mintcream': '#f5fffa',
- 'mistyrose': '#ffe4e1',
- 'moccasin': '#ffe4b5',
- 'navajowhite': '#ffdead',
- 'navy': '#000080',
- 'oldlace': '#fdf5e6',
- 'olive': '#808000',
- 'olivedrab': '#6b8e23',
- 'orange': '#ffa500',
- 'orangered': '#ff4500',
- 'orchid': '#da70d6',
- 'palegoldenrod': '#eee8aa',
- 'palegreen': '#98fb98',
- 'paleturquoise': '#afeeee',
- 'palevioletred': '#d87093',
- 'papayawhip': '#ffefd5',
- 'peachpuff': '#ffdab9',
- 'peru': '#cd853f',
- 'pink': '#ffc0cb',
- 'plum': '#dda0dd',
- 'powderblue': '#b0e0e6',
- 'purple': '#800080',
- 'rebeccapurple': '#663399',
- 'red': '#ff0000',
- 'rosybrown': '#bc8f8f',
- 'royalblue': '#4169e1',
- 'saddlebrown': '#8b4513',
- 'salmon': '#fa8072',
- 'sandybrown': '#f4a460',
- 'seagreen': '#2e8b57',
- 'seashell': '#fff5ee',
- 'sienna': '#a0522d',
- 'silver': '#c0c0c0',
- 'skyblue': '#87ceeb',
- 'slateblue': '#6a5acd',
- 'slategray': '#708090',
- 'slategrey': '#708090',
- 'snow': '#fffafa',
- 'springgreen': '#00ff7f',
- 'steelblue': '#4682b4',
- 'tan': '#d2b48c',
- 'teal': '#008080',
- 'thistle': '#d8bfd8',
- 'tomato': '#ff6347',
- 'turquoise': '#40e0d0',
- 'violet': '#ee82ee',
- 'wheat': '#f5deb3',
- 'white': '#ffffff',
- 'whitesmoke': '#f5f5f5',
- 'yellow': '#ffff00',
- 'yellowgreen': '#9acd32'
+ 'aliceblue':'#f0f8ff',
+ 'antiquewhite':'#faebd7',
+ 'aqua':'#00ffff',
+ 'aquamarine':'#7fffd4',
+ 'azure':'#f0ffff',
+ 'beige':'#f5f5dc',
+ 'bisque':'#ffe4c4',
+ 'black':'#000000',
+ 'blanchedalmond':'#ffebcd',
+ 'blue':'#0000ff',
+ 'blueviolet':'#8a2be2',
+ 'brown':'#a52a2a',
+ 'burlywood':'#deb887',
+ 'cadetblue':'#5f9ea0',
+ 'chartreuse':'#7fff00',
+ 'chocolate':'#d2691e',
+ 'coral':'#ff7f50',
+ 'cornflowerblue':'#6495ed',
+ 'cornsilk':'#fff8dc',
+ 'crimson':'#dc143c',
+ 'cyan':'#00ffff',
+ 'darkblue':'#00008b',
+ 'darkcyan':'#008b8b',
+ 'darkgoldenrod':'#b8860b',
+ 'darkgray':'#a9a9a9',
+ 'darkgrey':'#a9a9a9',
+ 'darkgreen':'#006400',
+ 'darkkhaki':'#bdb76b',
+ 'darkmagenta':'#8b008b',
+ 'darkolivegreen':'#556b2f',
+ 'darkorange':'#ff8c00',
+ 'darkorchid':'#9932cc',
+ 'darkred':'#8b0000',
+ 'darksalmon':'#e9967a',
+ 'darkseagreen':'#8fbc8f',
+ 'darkslateblue':'#483d8b',
+ 'darkslategray':'#2f4f4f',
+ 'darkslategrey':'#2f4f4f',
+ 'darkturquoise':'#00ced1',
+ 'darkviolet':'#9400d3',
+ 'deeppink':'#ff1493',
+ 'deepskyblue':'#00bfff',
+ 'dimgray':'#696969',
+ 'dimgrey':'#696969',
+ 'dodgerblue':'#1e90ff',
+ 'firebrick':'#b22222',
+ 'floralwhite':'#fffaf0',
+ 'forestgreen':'#228b22',
+ 'fuchsia':'#ff00ff',
+ 'gainsboro':'#dcdcdc',
+ 'ghostwhite':'#f8f8ff',
+ 'gold':'#ffd700',
+ 'goldenrod':'#daa520',
+ 'gray':'#808080',
+ 'grey':'#808080',
+ 'green':'#008000',
+ 'greenyellow':'#adff2f',
+ 'honeydew':'#f0fff0',
+ 'hotpink':'#ff69b4',
+ 'indianred':'#cd5c5c',
+ 'indigo':'#4b0082',
+ 'ivory':'#fffff0',
+ 'khaki':'#f0e68c',
+ 'lavender':'#e6e6fa',
+ 'lavenderblush':'#fff0f5',
+ 'lawngreen':'#7cfc00',
+ 'lemonchiffon':'#fffacd',
+ 'lightblue':'#add8e6',
+ 'lightcoral':'#f08080',
+ 'lightcyan':'#e0ffff',
+ 'lightgoldenrodyellow':'#fafad2',
+ 'lightgray':'#d3d3d3',
+ 'lightgrey':'#d3d3d3',
+ 'lightgreen':'#90ee90',
+ 'lightpink':'#ffb6c1',
+ 'lightsalmon':'#ffa07a',
+ 'lightseagreen':'#20b2aa',
+ 'lightskyblue':'#87cefa',
+ 'lightslategray':'#778899',
+ 'lightslategrey':'#778899',
+ 'lightsteelblue':'#b0c4de',
+ 'lightyellow':'#ffffe0',
+ 'lime':'#00ff00',
+ 'limegreen':'#32cd32',
+ 'linen':'#faf0e6',
+ 'magenta':'#ff00ff',
+ 'maroon':'#800000',
+ 'mediumaquamarine':'#66cdaa',
+ 'mediumblue':'#0000cd',
+ 'mediumorchid':'#ba55d3',
+ 'mediumpurple':'#9370d8',
+ 'mediumseagreen':'#3cb371',
+ 'mediumslateblue':'#7b68ee',
+ 'mediumspringgreen':'#00fa9a',
+ 'mediumturquoise':'#48d1cc',
+ 'mediumvioletred':'#c71585',
+ 'midnightblue':'#191970',
+ 'mintcream':'#f5fffa',
+ 'mistyrose':'#ffe4e1',
+ 'moccasin':'#ffe4b5',
+ 'navajowhite':'#ffdead',
+ 'navy':'#000080',
+ 'oldlace':'#fdf5e6',
+ 'olive':'#808000',
+ 'olivedrab':'#6b8e23',
+ 'orange':'#ffa500',
+ 'orangered':'#ff4500',
+ 'orchid':'#da70d6',
+ 'palegoldenrod':'#eee8aa',
+ 'palegreen':'#98fb98',
+ 'paleturquoise':'#afeeee',
+ 'palevioletred':'#d87093',
+ 'papayawhip':'#ffefd5',
+ 'peachpuff':'#ffdab9',
+ 'peru':'#cd853f',
+ 'pink':'#ffc0cb',
+ 'plum':'#dda0dd',
+ 'powderblue':'#b0e0e6',
+ 'purple':'#800080',
+ 'rebeccapurple':'#663399',
+ 'red':'#ff0000',
+ 'rosybrown':'#bc8f8f',
+ 'royalblue':'#4169e1',
+ 'saddlebrown':'#8b4513',
+ 'salmon':'#fa8072',
+ 'sandybrown':'#f4a460',
+ 'seagreen':'#2e8b57',
+ 'seashell':'#fff5ee',
+ 'sienna':'#a0522d',
+ 'silver':'#c0c0c0',
+ 'skyblue':'#87ceeb',
+ 'slateblue':'#6a5acd',
+ 'slategray':'#708090',
+ 'slategrey':'#708090',
+ 'snow':'#fffafa',
+ 'springgreen':'#00ff7f',
+ 'steelblue':'#4682b4',
+ 'tan':'#d2b48c',
+ 'teal':'#008080',
+ 'thistle':'#d8bfd8',
+ 'tomato':'#ff6347',
+ 'turquoise':'#40e0d0',
+ 'violet':'#ee82ee',
+ 'wheat':'#f5deb3',
+ 'white':'#ffffff',
+ 'whitesmoke':'#f5f5f5',
+ 'yellow':'#ffff00',
+ 'yellowgreen':'#9acd32'
};
var unitConversions = {
@@ -452,37 +504,32 @@
}
};
- var data = { colors: colors, unitConversions: unitConversions };
+ var data = { colors, unitConversions };
/**
* The reason why Node is a class and other nodes simply do not extend
* from Node (since we're transpiling) is due to this issue:
- *
+ *
* @see https://github.com/less/less.js/issues/3434
*/
- var Node = /** @class */ (function () {
- function Node() {
+ class Node {
+ constructor() {
this.parent = null;
this.visibilityBlocks = undefined;
this.nodeVisible = undefined;
this.rootNode = null;
this.parsed = null;
}
- Object.defineProperty(Node.prototype, "currentFileInfo", {
- get: function () {
- return this.fileInfo();
- },
- enumerable: false,
- configurable: true
- });
- Object.defineProperty(Node.prototype, "index", {
- get: function () {
- return this.getIndex();
- },
- enumerable: false,
- configurable: true
- });
- Node.prototype.setParent = function (nodes, parent) {
+
+ get currentFileInfo() {
+ return this.fileInfo();
+ }
+
+ get index() {
+ return this.getIndex();
+ }
+
+ setParent(nodes, parent) {
function set(node) {
if (node && node instanceof Node) {
node.parent = parent;
@@ -494,20 +541,24 @@
else {
set(nodes);
}
- };
- Node.prototype.getIndex = function () {
+ }
+
+ getIndex() {
return this._index || (this.parent && this.parent.getIndex()) || 0;
- };
- Node.prototype.fileInfo = function () {
+ }
+
+ fileInfo() {
return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};
- };
- Node.prototype.isRulesetLike = function () { return false; };
- Node.prototype.toCSS = function (context) {
- var strs = [];
+ }
+
+ isRulesetLike() { return false; }
+
+ toCSS(context) {
+ const strs = [];
this.genCSS(context, {
// remove when genCSS has JSDoc types
// eslint-disable-next-line no-unused-vars
- add: function (chunk, fileInfo, index) {
+ add: function(chunk, fileInfo, index) {
strs.push(chunk);
},
isEmpty: function () {
@@ -515,45 +566,51 @@
}
});
return strs.join('');
- };
- Node.prototype.genCSS = function (context, output) {
+ }
+
+ genCSS(context, output) {
output.add(this.value);
- };
- Node.prototype.accept = function (visitor) {
+ }
+
+ accept(visitor) {
this.value = visitor.visit(this.value);
- };
- Node.prototype.eval = function () { return this; };
- Node.prototype._operate = function (context, op, a, b) {
+ }
+
+ eval() { return this; }
+
+ _operate(context, op, a, b) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
}
- };
- Node.prototype.fround = function (context, value) {
- var precision = context && context.numPrecision;
+ }
+
+ fround(context, value) {
+ const precision = context && context.numPrecision;
// add "epsilon" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:
return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;
- };
- Node.compare = function (a, b) {
+ }
+
+ static compare(a, b) {
/* returns:
-1: a < b
0: a = b
1: a > b
and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */
+
if ((a.compare) &&
// for "symmetric results" force toCSS-based comparison
// of Quoted or Anonymous if either value is one of those
!(b.type === 'Quoted' || b.type === 'Anonymous')) {
return a.compare(b);
- }
- else if (b.compare) {
+ } else if (b.compare) {
return -b.compare(a);
- }
- else if (a.type !== b.type) {
+ } else if (a.type !== b.type) {
return undefined;
}
+
a = a.value;
b = b.value;
if (!Array.isArray(a)) {
@@ -562,75 +619,83 @@
if (a.length !== b.length) {
return undefined;
}
- for (var i_1 = 0; i_1 < a.length; i_1++) {
- if (Node.compare(a[i_1], b[i_1]) !== 0) {
+ for (let i = 0; i < a.length; i++) {
+ if (Node.compare(a[i], b[i]) !== 0) {
return undefined;
}
}
return 0;
- };
- Node.numericCompare = function (a, b) {
- return a < b ? -1
- : a === b ? 0
- : a > b ? 1 : undefined;
- };
+ }
+
+ static numericCompare(a, b) {
+ return a < b ? -1
+ : a === b ? 0
+ : a > b ? 1 : undefined;
+ }
+
// Returns true if this node represents root of ast imported by reference
- Node.prototype.blocksVisibility = function () {
+ blocksVisibility() {
if (this.visibilityBlocks === undefined) {
this.visibilityBlocks = 0;
}
return this.visibilityBlocks !== 0;
- };
- Node.prototype.addVisibilityBlock = function () {
+ }
+
+ addVisibilityBlock() {
if (this.visibilityBlocks === undefined) {
this.visibilityBlocks = 0;
}
this.visibilityBlocks = this.visibilityBlocks + 1;
- };
- Node.prototype.removeVisibilityBlock = function () {
+ }
+
+ removeVisibilityBlock() {
if (this.visibilityBlocks === undefined) {
this.visibilityBlocks = 0;
}
this.visibilityBlocks = this.visibilityBlocks - 1;
- };
+ }
+
// Turns on node visibility - if called node will be shown in output regardless
// of whether it comes from import by reference or not
- Node.prototype.ensureVisibility = function () {
+ ensureVisibility() {
this.nodeVisible = true;
- };
+ }
+
// Turns off node visibility - if called node will NOT be shown in output regardless
// of whether it comes from import by reference or not
- Node.prototype.ensureInvisibility = function () {
+ ensureInvisibility() {
this.nodeVisible = false;
- };
+ }
+
// return values:
// false - the node must not be visible
// true - the node must be visible
// undefined or null - the node has the same visibility as its parent
- Node.prototype.isVisible = function () {
+ isVisible() {
return this.nodeVisible;
- };
- Node.prototype.visibilityInfo = function () {
+ }
+
+ visibilityInfo() {
return {
visibilityBlocks: this.visibilityBlocks,
nodeVisible: this.nodeVisible
};
- };
- Node.prototype.copyVisibilityInfo = function (info) {
+ }
+
+ copyVisibilityInfo(info) {
if (!info) {
return;
}
this.visibilityBlocks = info.visibilityBlocks;
this.nodeVisible = info.nodeVisible;
- };
- return Node;
- }());
+ }
+ }
//
// RGB Colors - #ff0014, #eee
//
- var Color = function (rgb, a, originalForm) {
- var self = this;
+ const Color = function(rgb, a, originalForm) {
+ const self = this;
//
// The end goal here, is to parse the arguments
// into an integer triplet, such as `128, 255, 0`
@@ -639,25 +704,21 @@
//
if (Array.isArray(rgb)) {
this.rgb = rgb;
- }
- else if (rgb.length >= 6) {
+ } else if (rgb.length >= 6) {
this.rgb = [];
rgb.match(/.{2}/g).map(function (c, i) {
if (i < 3) {
self.rgb.push(parseInt(c, 16));
- }
- else {
+ } else {
self.alpha = (parseInt(c, 16)) / 255;
}
});
- }
- else {
+ } else {
this.rgb = [];
rgb.split('').map(function (c, i) {
if (i < 3) {
self.rgb.push(parseInt(c + c, 16));
- }
- else {
+ } else {
self.alpha = (parseInt(c + c, 16)) / 255;
}
});
@@ -667,51 +728,56 @@
this.value = originalForm;
}
};
+
Color.prototype = Object.assign(new Node(), {
type: 'Color',
- luma: function () {
- var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;
+
+ luma() {
+ let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;
+
r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);
g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);
b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);
+
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
},
- genCSS: function (context, output) {
+
+ genCSS(context, output) {
output.add(this.toCSS(context));
},
- toCSS: function (context, doNotCompress) {
- var compress = context && context.compress && !doNotCompress;
- var color;
- var alpha;
- var colorFunction;
- var args = [];
+
+ toCSS(context, doNotCompress) {
+ const compress = context && context.compress && !doNotCompress;
+ let color;
+ let alpha;
+ let colorFunction;
+ let args = [];
+
// `value` is set if this color was originally
// converted from a named color string so we need
// to respect this and try to output named color too.
alpha = this.fround(context, this.alpha);
+
if (this.value) {
if (this.value.indexOf('rgb') === 0) {
if (alpha < 1) {
colorFunction = 'rgba';
}
- }
- else if (this.value.indexOf('hsl') === 0) {
+ } else if (this.value.indexOf('hsl') === 0) {
if (alpha < 1) {
colorFunction = 'hsla';
- }
- else {
+ } else {
colorFunction = 'hsl';
}
- }
- else {
+ } else {
return this.value;
}
- }
- else {
+ } else {
if (alpha < 1) {
colorFunction = 'rgba';
}
}
+
switch (colorFunction) {
case 'rgba':
args = this.rgb.map(function (c) {
@@ -725,115 +791,118 @@
color = this.toHSL();
args = [
this.fround(context, color.h),
- "".concat(this.fround(context, color.s * 100), "%"),
- "".concat(this.fround(context, color.l * 100), "%")
+ `${this.fround(context, color.s * 100)}%`,
+ `${this.fround(context, color.l * 100)}%`
].concat(args);
}
+
if (colorFunction) {
// Values are capped between `0` and `255`, rounded and zero-padded.
- return "".concat(colorFunction, "(").concat(args.join(",".concat(compress ? '' : ' ')), ")");
+ return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;
}
+
color = this.toRGB();
+
if (compress) {
- var splitcolor = color.split('');
+ const splitcolor = color.split('');
+
// Convert color to short format
if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {
- color = "#".concat(splitcolor[1]).concat(splitcolor[3]).concat(splitcolor[5]);
+ color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;
}
}
+
return color;
},
+
//
// Operations have to be done per-channel, if not,
// channels will spill onto each other. Once we have
// our result, in the form of an integer triplet,
// we create a new Color node to hold the result.
//
- operate: function (context, op, other) {
- var rgb = new Array(3);
- var alpha = this.alpha * (1 - other.alpha) + other.alpha;
- for (var c = 0; c < 3; c++) {
+ operate(context, op, other) {
+ const rgb = new Array(3);
+ const alpha = this.alpha * (1 - other.alpha) + other.alpha;
+ for (let c = 0; c < 3; c++) {
rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);
}
return new Color(rgb, alpha);
},
- toRGB: function () {
+
+ toRGB() {
return toHex(this.rgb);
},
- toHSL: function () {
- var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;
- var max = Math.max(r, g, b), min = Math.min(r, g, b);
- var h;
- var s;
- var l = (max + min) / 2;
- var d = max - min;
+
+ toHSL() {
+ const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;
+
+ const max = Math.max(r, g, b), min = Math.min(r, g, b);
+ let h;
+ let s;
+ const l = (max + min) / 2;
+ const d = max - min;
+
if (max === min) {
h = s = 0;
- }
- else {
+ } else {
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
+
switch (max) {
- case r:
- h = (g - b) / d + (g < b ? 6 : 0);
- break;
- case g:
- h = (b - r) / d + 2;
- break;
- case b:
- h = (r - g) / d + 4;
- break;
+ case r: h = (g - b) / d + (g < b ? 6 : 0); break;
+ case g: h = (b - r) / d + 2; break;
+ case b: h = (r - g) / d + 4; break;
}
h /= 6;
}
- return { h: h * 360, s: s, l: l, a: a };
+ return { h: h * 360, s, l, a };
},
+
// Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
- toHSV: function () {
- var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;
- var max = Math.max(r, g, b), min = Math.min(r, g, b);
- var h;
- var s;
- var v = max;
- var d = max - min;
+ toHSV() {
+ const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;
+
+ const max = Math.max(r, g, b), min = Math.min(r, g, b);
+ let h;
+ let s;
+ const v = max;
+
+ const d = max - min;
if (max === 0) {
s = 0;
- }
- else {
+ } else {
s = d / max;
}
+
if (max === min) {
h = 0;
- }
- else {
+ } else {
switch (max) {
- case r:
- h = (g - b) / d + (g < b ? 6 : 0);
- break;
- case g:
- h = (b - r) / d + 2;
- break;
- case b:
- h = (r - g) / d + 4;
- break;
+ case r: h = (g - b) / d + (g < b ? 6 : 0); break;
+ case g: h = (b - r) / d + 2; break;
+ case b: h = (r - g) / d + 4; break;
}
h /= 6;
}
- return { h: h * 360, s: s, v: v, a: a };
+ return { h: h * 360, s, v, a };
},
- toARGB: function () {
+
+ toARGB() {
return toHex([this.alpha * 255].concat(this.rgb));
},
- compare: function (x) {
+
+ compare(x) {
return (x.rgb &&
x.rgb[0] === this.rgb[0] &&
x.rgb[1] === this.rgb[1] &&
x.rgb[2] === this.rgb[2] &&
- x.alpha === this.alpha) ? 0 : undefined;
+ x.alpha === this.alpha) ? 0 : undefined;
}
});
- Color.fromKeyword = function (keyword) {
- var c;
- var key = keyword.toLowerCase();
+
+ Color.fromKeyword = function(keyword) {
+ let c;
+ const key = keyword.toLowerCase();
// eslint-disable-next-line no-prototype-builtins
if (colors.hasOwnProperty(key)) {
c = new Color(colors[key].slice(1));
@@ -841,114 +910,82 @@
else if (key === 'transparent') {
c = new Color([0, 0, 0], 0);
}
+
if (c) {
c.value = keyword;
return c;
}
};
+
function clamp$1(v, max) {
return Math.min(Math.max(v, 0), max);
}
- function toHex(v) {
- return "#".concat(v.map(function (c) {
- c = clamp$1(Math.round(c), 255);
- return (c < 16 ? '0' : '') + c.toString(16);
- }).join(''));
- }
-
- /******************************************************************************
- Copyright (c) Microsoft Corporation.
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
-
- var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
- function __spreadArray(to, from, pack) {
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
- if (ar || !(i in from)) {
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
- ar[i] = from[i];
- }
- }
- return to.concat(ar || Array.prototype.slice.call(from));
+ function toHex(v) {
+ return `#${v.map(function (c) {
+ c = clamp$1(Math.round(c), 255);
+ return (c < 16 ? '0' : '') + c.toString(16);
+ }).join('')}`;
}
- typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
- var e = new Error(message);
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
- };
-
- var Paren = function (node) {
+ const Paren = function(node) {
this.value = node;
};
+
Paren.prototype = Object.assign(new Node(), {
type: 'Paren',
- genCSS: function (context, output) {
+
+ genCSS(context, output) {
output.add('(');
this.value.genCSS(context, output);
output.add(')');
},
- eval: function (context) {
- var paren = new Paren(this.value.eval(context));
+
+ eval(context) {
+ const paren = new Paren(this.value.eval(context));
+
if (this.noSpacing) {
paren.noSpacing = true;
}
+
return paren;
}
});
- var _noSpaceCombinators = {
+ const _noSpaceCombinators = {
'': true,
' ': true,
'|': true
};
- var Combinator = function (value) {
+
+ const Combinator = function(value) {
if (value === ' ') {
this.value = ' ';
this.emptyOrWhitespace = true;
- }
- else {
+ } else {
this.value = value ? value.trim() : '';
this.emptyOrWhitespace = this.value === '';
}
};
+
Combinator.prototype = Object.assign(new Node(), {
type: 'Combinator',
- genCSS: function (context, output) {
- var spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';
+
+ genCSS(context, output) {
+ const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';
output.add(spaceOrEmpty + this.value + spaceOrEmpty);
}
});
- var Element = function (combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {
+ const Element = function(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {
this.combinator = combinator instanceof Combinator ?
combinator : new Combinator(combinator);
+
if (typeof value === 'string') {
this.value = value.trim();
- }
- else if (value) {
+ } else if (value) {
this.value = value;
- }
- else {
+ } else {
this.value = '';
}
this.isVariable = isVariable;
@@ -957,28 +994,42 @@
this.copyVisibilityInfo(visibilityInfo);
this.setParent(this.combinator, this);
};
+
Element.prototype = Object.assign(new Node(), {
type: 'Element',
- accept: function (visitor) {
- var value = this.value;
+
+ accept(visitor) {
+ const value = this.value;
this.combinator = visitor.visit(this.combinator);
if (typeof value === 'object') {
this.value = visitor.visit(value);
}
},
- eval: function (context) {
- return new Element(this.combinator, this.value.eval ? this.value.eval(context) : this.value, this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo());
+
+ eval(context) {
+ return new Element(this.combinator,
+ this.value.eval ? this.value.eval(context) : this.value,
+ this.isVariable,
+ this.getIndex(),
+ this.fileInfo(), this.visibilityInfo());
},
- clone: function () {
- return new Element(this.combinator, this.value, this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo());
+
+ clone() {
+ return new Element(this.combinator,
+ this.value,
+ this.isVariable,
+ this.getIndex(),
+ this.fileInfo(), this.visibilityInfo());
},
- genCSS: function (context, output) {
+
+ genCSS(context, output) {
output.add(this.toCSS(context), this.fileInfo(), this.getIndex());
},
- toCSS: function (context) {
+
+ toCSS(context) {
context = context || {};
- var value = this.value;
- var firstSelector = context.firstSelector;
+ let value = this.value;
+ const firstSelector = context.firstSelector;
if (value instanceof Paren) {
// selector in parens should not be affected by outer selector
// flags (breaks only interpolated selectors - see #1973)
@@ -988,20 +1039,20 @@
context.firstSelector = firstSelector;
if (value === '' && this.combinator.value.charAt(0) === '&') {
return '';
- }
- else {
+ } else {
return this.combinator.toCSS(context) + value;
}
}
});
- var Math$1 = {
+ const Math$1 = {
ALWAYS: 0,
PARENS_DIVISION: 1,
PARENS: 2
// removed - STRICT_LEGACY: 3
};
- var RewriteUrls = {
+
+ const RewriteUrls = {
OFF: 0,
LOCAL: 1,
ALL: 2
@@ -1083,55 +1134,64 @@
}
/* jshint proto: true */
+
function getLocation(index, inputStream) {
- var n = index + 1;
- var line = null;
- var column = -1;
+ let n = index + 1;
+ let line = null;
+ let column = -1;
+
while (--n >= 0 && inputStream.charAt(n) !== '\n') {
column++;
}
+
if (typeof index === 'number') {
line = (inputStream.slice(0, index).match(/\n/g) || '').length;
}
+
return {
- line: line,
- column: column
+ line,
+ column
};
}
+
function copyArray(arr) {
- var i;
- var length = arr.length;
- var copy = new Array(length);
+ let i;
+ const length = arr.length;
+ const copy = new Array(length);
+
for (i = 0; i < length; i++) {
copy[i] = arr[i];
}
return copy;
}
+
function clone(obj) {
- var cloned = {};
- for (var prop in obj) {
+ const cloned = {};
+ for (const prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
cloned[prop] = obj[prop];
}
}
return cloned;
}
+
function defaults(obj1, obj2) {
- var newObj = obj2 || {};
+ let newObj = obj2 || {};
if (!obj2._defaults) {
newObj = {};
- var defaults_1 = copy(obj1);
- newObj._defaults = defaults_1;
- var cloned = obj2 ? copy(obj2) : {};
- Object.assign(newObj, defaults_1, cloned);
+ const defaults = copy(obj1);
+ newObj._defaults = defaults;
+ const cloned = obj2 ? copy(obj2) : {};
+ Object.assign(newObj, defaults, cloned);
}
return newObj;
}
+
function copyOptions(obj1, obj2) {
if (obj2 && obj2._defaults) {
return obj2;
}
- var opts = defaults(obj1, obj2);
+ const opts = defaults(obj1, obj2);
if (opts.strictMath) {
opts.math = Math$1.PARENS;
}
@@ -1170,22 +1230,22 @@
}
return opts;
}
+
function merge(obj1, obj2) {
- for (var prop in obj2) {
+ for (const prop in obj2) {
if (Object.prototype.hasOwnProperty.call(obj2, prop)) {
obj1[prop] = obj2[prop];
}
}
return obj1;
}
- function flattenArray(arr, result) {
- if (result === void 0) { result = []; }
- for (var i_1 = 0, length_1 = arr.length; i_1 < length_1; i_1++) {
- var value = arr[i_1];
+
+ function flattenArray(arr, result = []) {
+ for (let i = 0, length = arr.length; i < length; i++) {
+ const value = arr[i];
if (Array.isArray(value)) {
flattenArray(value, result);
- }
- else {
+ } else {
if (value !== undefined) {
result.push(value);
}
@@ -1193,8 +1253,9 @@
}
return result;
}
+
function isNullOrUndefined(val) {
- return val === null || val === undefined;
+ return val === null || val === undefined
}
var utils = /*#__PURE__*/Object.freeze({
@@ -1209,7 +1270,8 @@
isNullOrUndefined: isNullOrUndefined
});
- var anonymousFunc = /(|Function):(\d+):(\d+)/;
+ const anonymousFunc = /(|Function):(\d+):(\d+)/;
+
/**
* This is a centralized class of any error that could be thrown internally (mostly by the parser).
* Besides standard .message it keeps some additional data like a path to the file where the error
@@ -1232,25 +1294,33 @@
* @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?
* @param {string} [currentFilename]
*/
- var LessError = function (e, fileContentMap, currentFilename) {
+ const LessError = function(e, fileContentMap, currentFilename) {
Error.call(this);
- var filename = e.filename || currentFilename;
+
+ const filename = e.filename || currentFilename;
+
this.message = e.message;
this.stack = e.stack;
+
+ // Set type early so it's always available, even if fileContentMap is missing
+ this.type = e.type || 'Syntax';
+
if (fileContentMap && filename) {
- var input = fileContentMap.contents[filename];
- var loc = getLocation(e.index, input);
+ const input = fileContentMap.contents[filename];
+ const loc = getLocation(e.index, input);
var line = loc.line;
- var col = loc.column;
- var callLine = e.call && getLocation(e.call, input).line;
- var lines = input ? input.split('\n') : '';
- this.type = e.type || 'Syntax';
+ const col = loc.column;
+ const callLine = e.call && getLocation(e.call, input).line;
+ const lines = input ? input.split('\n') : '';
+
this.filename = filename;
this.index = e.index;
this.line = typeof line === 'number' ? line + 1 : null;
this.column = col;
+
if (!this.line && this.stack) {
- var found = this.stack.match(anonymousFunc);
+ const found = this.stack.match(anonymousFunc);
+
/**
* We have to figure out how this environment stringifies anonymous functions
* so we can correctly map plugin errors.
@@ -1258,15 +1328,15 @@
* Note, in Node 8, the output of anonymous funcs varied based on parameters
* being present or not, so we inject dummy params.
*/
- var func = new Function('a', 'throw new Error()');
- var lineAdjust = 0;
+ const func = new Function('a', 'throw new Error()');
+ let lineAdjust = 0;
try {
func();
- }
- catch (e) {
- var match = e.stack.match(anonymousFunc);
+ } catch (e) {
+ const match = e.stack.match(anonymousFunc);
lineAdjust = 1 - parseInt(match[2]);
}
+
if (found) {
if (found[2]) {
this.line = parseInt(found[2]) + lineAdjust;
@@ -1276,24 +1346,29 @@
}
}
}
+
this.callLine = callLine + 1;
this.callExtract = lines[callLine];
+
this.extract = [
lines[this.line - 2],
lines[this.line - 1],
lines[this.line]
];
}
+
};
+
if (typeof Object.create === 'undefined') {
- var F = function () { };
+ const F = function () {};
F.prototype = Error.prototype;
LessError.prototype = new F();
- }
- else {
+ } else {
LessError.prototype = Object.create(Error.prototype);
}
+
LessError.prototype.constructor = LessError;
+
/**
* An overridden version of the default Object.prototype.toString
* which uses additional information to create a helpful message.
@@ -1301,65 +1376,74 @@
* @param {Object} options
* @returns {string}
*/
- LessError.prototype.toString = function (options) {
- var _a;
+ LessError.prototype.toString = function(options) {
options = options || {};
- var isWarning = ((_a = this.type) !== null && _a !== void 0 ? _a : '').toLowerCase().includes('warning');
- var type = isWarning ? this.type : "".concat(this.type, "Error");
- var color = isWarning ? 'yellow' : 'red';
- var message = '';
- var extract = this.extract || [];
- var error = [];
- var stylize = function (str) { return str; };
+ const isWarning = (this.type ?? '').toLowerCase().includes('warning');
+ const type = isWarning ? this.type : `${this.type}Error`;
+ const color = isWarning ? 'yellow' : 'red';
+
+ let message = '';
+ const extract = this.extract || [];
+ let error = [];
+ let stylize = function (str) { return str; };
if (options.stylize) {
- var type_1 = typeof options.stylize;
- if (type_1 !== 'function') {
- throw Error("options.stylize should be a function, got a ".concat(type_1, "!"));
+ const type = typeof options.stylize;
+ if (type !== 'function') {
+ throw Error(`options.stylize should be a function, got a ${type}!`);
}
stylize = options.stylize;
}
+
if (this.line !== null) {
if (!isWarning && typeof extract[0] === 'string') {
- error.push(stylize("".concat(this.line - 1, " ").concat(extract[0]), 'grey'));
+ error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));
}
+
if (typeof extract[1] === 'string') {
- var errorTxt = "".concat(this.line, " ");
+ let errorTxt = `${this.line} `;
if (extract[1]) {
errorTxt += extract[1].slice(0, this.column) +
- stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +
+ stylize(stylize(stylize(extract[1].slice(this.column, this.column + 1), 'bold') +
extract[1].slice(this.column + 1), 'red'), 'inverse');
}
error.push(errorTxt);
}
+
if (!isWarning && typeof extract[2] === 'string') {
- error.push(stylize("".concat(this.line + 1, " ").concat(extract[2]), 'grey'));
+ error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));
}
- error = "".concat(error.join('\n') + stylize('', 'reset'), "\n");
+ error = `${error.join('\n') + stylize('', 'reset')}\n`;
}
- message += stylize("".concat(type, ": ").concat(this.message), color);
+
+ message += stylize(`${type}: ${this.message}`, color);
if (this.filename) {
message += stylize(' in ', color) + this.filename;
}
if (this.line) {
- message += stylize(" on line ".concat(this.line, ", column ").concat(this.column + 1, ":"), 'grey');
+ message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');
}
- message += "\n".concat(error);
+
+ message += `\n${error}`;
+
if (this.callLine) {
- message += "".concat(stylize('from ', color) + (this.filename || ''), "/n");
- message += "".concat(stylize(this.callLine, 'grey'), " ").concat(this.callExtract, "/n");
+ message += `${stylize('from ', color) + (this.filename || '')}/n`;
+ message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;
}
+
return message;
};
- var _visitArgs = { visitDeeper: true };
- var _hasIndexed = false;
+ const _visitArgs = { visitDeeper: true };
+ let _hasIndexed = false;
+
function _noop(node) {
return node;
}
+
function indexNodeTypes(parent, ticker) {
// add .typeIndex to tree node types for lookup table
- var key, child;
- for (key in parent) {
+ let key, child;
+ for (key in parent) {
/* eslint guard-for-in: 0 */
child = parent[key];
switch (typeof child) {
@@ -1373,25 +1457,30 @@
case 'object':
ticker = indexNodeTypes(child, ticker);
break;
+
}
}
return ticker;
}
- var Visitor = /** @class */ (function () {
- function Visitor(implementation) {
+
+ class Visitor {
+ constructor(implementation) {
this._implementation = implementation;
this._visitInCache = {};
this._visitOutCache = {};
+
if (!_hasIndexed) {
indexNodeTypes(tree, 1);
_hasIndexed = true;
}
}
- Visitor.prototype.visit = function (node) {
+
+ visit(node) {
if (!node) {
return node;
}
- var nodeTypeIndex = node.typeIndex;
+
+ const nodeTypeIndex = node.typeIndex;
if (!nodeTypeIndex) {
// MixinCall args aren't a node type?
if (node.value && node.value.typeIndex) {
@@ -1399,48 +1488,57 @@
}
return node;
}
- var impl = this._implementation;
- var func = this._visitInCache[nodeTypeIndex];
- var funcOut = this._visitOutCache[nodeTypeIndex];
- var visitArgs = _visitArgs;
- var fnName;
+
+ const impl = this._implementation;
+ let func = this._visitInCache[nodeTypeIndex];
+ let funcOut = this._visitOutCache[nodeTypeIndex];
+ const visitArgs = _visitArgs;
+ let fnName;
+
visitArgs.visitDeeper = true;
+
if (!func) {
- fnName = "visit".concat(node.type);
+ fnName = `visit${node.type}`;
func = impl[fnName] || _noop;
- funcOut = impl["".concat(fnName, "Out")] || _noop;
+ funcOut = impl[`${fnName}Out`] || _noop;
this._visitInCache[nodeTypeIndex] = func;
this._visitOutCache[nodeTypeIndex] = funcOut;
}
+
if (func !== _noop) {
- var newNode = func.call(impl, node, visitArgs);
+ const newNode = func.call(impl, node, visitArgs);
if (node && impl.isReplacing) {
node = newNode;
}
}
+
if (visitArgs.visitDeeper && node) {
if (node.length) {
- for (var i_1 = 0, cnt = node.length; i_1 < cnt; i_1++) {
- if (node[i_1].accept) {
- node[i_1].accept(this);
+ for (let i = 0, cnt = node.length; i < cnt; i++) {
+ if (node[i].accept) {
+ node[i].accept(this);
}
}
- }
- else if (node.accept) {
+ } else if (node.accept) {
node.accept(this);
}
}
+
if (funcOut != _noop) {
funcOut.call(impl, node);
}
+
return node;
- };
- Visitor.prototype.visitArray = function (nodes, nonReplacing) {
+ }
+
+ visitArray(nodes, nonReplacing) {
if (!nodes) {
return nodes;
}
- var cnt = nodes.length;
- var i;
+
+ const cnt = nodes.length;
+ let i;
+
// Non-replacing
if (nonReplacing || !this._implementation.isReplacing) {
for (i = 0; i < cnt; i++) {
@@ -1448,27 +1546,28 @@
}
return nodes;
}
+
// Replacing
- var out = [];
+ const out = [];
for (i = 0; i < cnt; i++) {
- var evald = this.visit(nodes[i]);
- if (evald === undefined) {
- continue;
- }
+ const evald = this.visit(nodes[i]);
+ if (evald === undefined) { continue; }
if (!evald.splice) {
out.push(evald);
- }
- else if (evald.length) {
+ } else if (evald.length) {
this.flatten(evald, out);
}
}
return out;
- };
- Visitor.prototype.flatten = function (arr, out) {
+ }
+
+ flatten(arr, out) {
if (!out) {
out = [];
}
- var cnt, i, item, nestedCnt, j, nestedItem;
+
+ let cnt, i, item, nestedCnt, j, nestedItem;
+
for (i = 0, cnt = arr.length; i < cnt; i++) {
item = arr[i];
if (item === undefined) {
@@ -1478,6 +1577,7 @@
out.push(item);
continue;
}
+
for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {
nestedItem = item[j];
if (nestedItem === undefined) {
@@ -1485,77 +1585,80 @@
}
if (!nestedItem.splice) {
out.push(nestedItem);
- }
- else if (nestedItem.length) {
+ } else if (nestedItem.length) {
this.flatten(nestedItem, out);
}
}
}
- return out;
- };
- return Visitor;
- }());
- var contexts = {};
- var copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {
- if (!original) {
- return;
+ return out;
}
- for (var i_1 = 0; i_1 < propertiesToCopy.length; i_1++) {
- if (Object.prototype.hasOwnProperty.call(original, propertiesToCopy[i_1])) {
- destination[propertiesToCopy[i_1]] = original[propertiesToCopy[i_1]];
+ }
+
+ const contexts = {};
+
+ const copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {
+ if (!original) { return; }
+
+ for (let i = 0; i < propertiesToCopy.length; i++) {
+ if (Object.prototype.hasOwnProperty.call(original, propertiesToCopy[i])) {
+ destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];
}
}
};
+
/*
parse is used whilst parsing
*/
- var parseCopyProperties = [
+ const parseCopyProperties = [
// options
- 'paths',
- 'rewriteUrls',
- 'rootpath',
- 'strictImports',
- 'insecure',
- 'dumpLineNumbers',
- 'compress',
- 'syncImport',
- 'chunkInput',
- 'mime',
- 'useFileCache',
+ 'paths', // option - unmodified - paths to search for imports on
+ 'rewriteUrls', // option - whether to adjust URL's to be relative
+ 'rootpath', // option - rootpath to append to URL's
+ 'strictImports', // option -
+ 'insecure', // option - whether to allow imports from insecure ssl hosts
+ 'dumpLineNumbers', // option - @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead. All modes ('comments', 'mediaquery', 'all') will be removed in a future version.
+ 'compress', // option - whether to compress
+ 'syncImport', // option - whether to import synchronously
+ 'mime', // browser only - mime type for sheet import
+ 'useFileCache', // browser only - whether to use the per file session cache
// context
- 'processImports',
+ 'processImports', // option & context - whether to process imports. if false then imports will not be imported.
// Used by the import manager to stop multiple import visitors being created.
- 'pluginManager',
- 'quiet', // option - whether to log warnings
+ 'pluginManager', // Used as the plugin manager for the session
+ 'quiet', // option - whether to log warnings
+ 'quietDeprecations', // option - whether to suppress deprecation warnings only
];
- contexts.Parse = function (options) {
+
+ contexts.Parse = function(options) {
copyFromOriginal(options, this, parseCopyProperties);
- if (typeof this.paths === 'string') {
- this.paths = [this.paths];
- }
+
+ if (typeof this.paths === 'string') { this.paths = [this.paths]; }
};
- var evalCopyProperties = [
- 'paths',
- 'compress',
- 'math',
- 'strictUnits',
- 'sourceMap',
- 'importMultiple',
- 'urlArgs',
- 'javascriptEnabled',
- 'pluginManager',
- 'importantScope',
- 'rewriteUrls' // option - whether to adjust URL's to be relative
+
+ const evalCopyProperties = [
+ 'paths', // additional include paths
+ 'compress', // whether to compress
+ 'math', // whether math has to be within parenthesis
+ 'strictUnits', // whether units need to evaluate correctly
+ 'sourceMap', // whether to output a source map
+ 'importMultiple', // whether we are currently importing multiple copies
+ 'urlArgs', // whether to add args into url tokens
+ 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false
+ 'pluginManager', // Used as the plugin manager for the session
+ 'importantScope', // used to bubble up !important statements
+ 'rewriteUrls' // option - whether to adjust URL's to be relative
];
- contexts.Eval = function (options, frames) {
+
+ contexts.Eval = function(options, frames) {
copyFromOriginal(options, this, evalCopyProperties);
- if (typeof this.paths === 'string') {
- this.paths = [this.paths];
- }
+
+ if (typeof this.paths === 'string') { this.paths = [this.paths]; }
+
this.frames = frames || [];
this.importantScope = this.importantScope || [];
};
+
contexts.Eval.prototype.enterCalc = function () {
if (!this.calcStack) {
this.calcStack = [];
@@ -1563,21 +1666,25 @@
this.calcStack.push(true);
this.inCalc = true;
};
+
contexts.Eval.prototype.exitCalc = function () {
this.calcStack.pop();
if (!this.calcStack.length) {
this.inCalc = false;
}
};
+
contexts.Eval.prototype.inParenthesis = function () {
if (!this.parensStack) {
this.parensStack = [];
}
this.parensStack.push(true);
};
+
contexts.Eval.prototype.outOfParenthesis = function () {
this.parensStack.pop();
};
+
contexts.Eval.prototype.inCalc = false;
contexts.Eval.prototype.mathOn = true;
contexts.Eval.prototype.isMathOn = function (op) {
@@ -1592,37 +1699,44 @@
}
return true;
};
+
contexts.Eval.prototype.pathRequiresRewrite = function (path) {
- var isRelative = this.rewriteUrls === RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;
+ const isRelative = this.rewriteUrls === RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;
+
return isRelative(path);
};
+
contexts.Eval.prototype.rewritePath = function (path, rootpath) {
- var newPath;
+ let newPath;
+
rootpath = rootpath || '';
newPath = this.normalizePath(rootpath + path);
+
// If a path was explicit relative and the rootpath was not an absolute path
// we must ensure that the new path is also explicit relative.
if (isPathLocalRelative(path) &&
isPathRelative(rootpath) &&
isPathLocalRelative(newPath) === false) {
- newPath = "./".concat(newPath);
+ newPath = `./${newPath}`;
}
+
return newPath;
};
+
contexts.Eval.prototype.normalizePath = function (path) {
- var segments = path.split('/').reverse();
- var segment;
+ const segments = path.split('/').reverse();
+ let segment;
+
path = [];
while (segments.length !== 0) {
segment = segments.pop();
- switch (segment) {
+ switch ( segment ) {
case '.':
break;
case '..':
if ((path.length === 0) || (path[path.length - 1] === '..')) {
- path.push(segment);
- }
- else {
+ path.push( segment );
+ } else {
path.pop();
}
break;
@@ -1631,45 +1745,53 @@
break;
}
}
+
return path.join('/');
};
+
function isPathRelative(path) {
return !/^(?:[a-z-]+:|\/|#)/i.test(path);
}
+
function isPathLocalRelative(path) {
return path.charAt(0) === '.';
}
+
// todo - do the same for the toCSS ?
- var ImportSequencer = /** @class */ (function () {
- function ImportSequencer(onSequencerEmpty) {
+ class ImportSequencer {
+ constructor(onSequencerEmpty) {
this.imports = [];
this.variableImports = [];
this._onSequencerEmpty = onSequencerEmpty;
this._currentDepth = 0;
}
- ImportSequencer.prototype.addImport = function (callback) {
- var importSequencer = this, importItem = {
- callback: callback,
- args: null,
- isReady: false
- };
+
+ addImport(callback) {
+ const importSequencer = this,
+ importItem = {
+ callback,
+ args: null,
+ isReady: false
+ };
this.imports.push(importItem);
- return function () {
+ return function() {
importItem.args = Array.prototype.slice.call(arguments, 0);
importItem.isReady = true;
importSequencer.tryRun();
};
- };
- ImportSequencer.prototype.addVariableImport = function (callback) {
+ }
+
+ addVariableImport(callback) {
this.variableImports.push(callback);
- };
- ImportSequencer.prototype.tryRun = function () {
+ }
+
+ tryRun() {
this._currentDepth++;
try {
while (true) {
while (this.imports.length > 0) {
- var importItem = this.imports[0];
+ const importItem = this.imports[0];
if (!importItem.isReady) {
return;
}
@@ -1679,23 +1801,23 @@
if (this.variableImports.length === 0) {
break;
}
- var variableImport = this.variableImports[0];
+ const variableImport = this.variableImports[0];
this.variableImports = this.variableImports.slice(1);
variableImport();
}
- }
- finally {
+ } finally {
this._currentDepth--;
}
if (this._currentDepth === 0 && this._onSequencerEmpty) {
this._onSequencerEmpty();
}
- };
- return ImportSequencer;
- }());
+ }
+ }
/* eslint-disable no-unused-vars */
- var ImportVisitor = function (importer, finish) {
+
+ const ImportVisitor = function(importer, finish) {
+
this._visitor = new Visitor(this);
this._importer = importer;
this._finish = finish;
@@ -1705,6 +1827,7 @@
this.recursionDetector = {};
this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));
};
+
ImportVisitor.prototype = {
isReplacing: false,
run: function (root) {
@@ -1715,62 +1838,68 @@
catch (e) {
this.error = e;
}
+
this.isFinished = true;
this._sequencer.tryRun();
},
- _onSequencerEmpty: function () {
+ _onSequencerEmpty: function() {
if (!this.isFinished) {
return;
}
this._finish(this.error);
},
visitImport: function (importNode, visitArgs) {
- var inlineCSS = importNode.options.inline;
+ const inlineCSS = importNode.options.inline;
+
if (!importNode.css || inlineCSS) {
- var context = new contexts.Eval(this.context, copyArray(this.context.frames));
- var importParent = context.frames[0];
+
+ const context = new contexts.Eval(this.context, copyArray(this.context.frames));
+ const importParent = context.frames[0];
+
this.importCount++;
if (importNode.isVariableImport()) {
this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));
- }
- else {
+ } else {
this.processImportNode(importNode, context, importParent);
}
}
visitArgs.visitDeeper = false;
},
- processImportNode: function (importNode, context, importParent) {
- var evaldImportNode;
- var inlineCSS = importNode.options.inline;
+ processImportNode: function(importNode, context, importParent) {
+ let evaldImportNode;
+ const inlineCSS = importNode.options.inline;
+
try {
evaldImportNode = importNode.evalForImport(context);
- }
- catch (e) {
- if (!e.filename) {
- e.index = importNode.getIndex();
- e.filename = importNode.fileInfo().filename;
- }
+ } catch (e) {
+ if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }
// attempt to eval properly and treat as css
importNode.css = true;
// if that fails, this error will be thrown
importNode.error = e;
}
+
if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {
+
if (evaldImportNode.options.multiple) {
context.importMultiple = true;
}
+
// try appending if we haven't determined if it is css or not
- var tryAppendLessExtension = evaldImportNode.css === undefined;
- for (var i_1 = 0; i_1 < importParent.rules.length; i_1++) {
- if (importParent.rules[i_1] === importNode) {
- importParent.rules[i_1] = evaldImportNode;
+ const tryAppendLessExtension = evaldImportNode.css === undefined;
+
+ for (let i = 0; i < importParent.rules.length; i++) {
+ if (importParent.rules[i] === importNode) {
+ importParent.rules[i] = evaldImportNode;
break;
}
}
- var onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);
- this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(), evaldImportNode.options, sequencedOnImported);
- }
- else {
+
+ const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);
+
+ this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),
+ evaldImportNode.options, sequencedOnImported);
+ } else {
this.importCount--;
if (this.isFinished) {
this._sequencer.tryRun();
@@ -1780,18 +1909,22 @@
onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {
if (e) {
if (!e.filename) {
- e.index = importNode.getIndex();
- e.filename = importNode.fileInfo().filename;
+ e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;
}
this.error = e;
}
- var importVisitor = this, inlineCSS = importNode.options.inline, isPlugin = importNode.options.isPlugin, isOptional = importNode.options.optional, duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;
+
+ const importVisitor = this,
+ inlineCSS = importNode.options.inline,
+ isPlugin = importNode.options.isPlugin,
+ isOptional = importNode.options.optional,
+ duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;
+
if (!context.importMultiple) {
if (duplicateImport) {
importNode.skip = true;
- }
- else {
- importNode.skip = function () {
+ } else {
+ importNode.skip = function() {
if (fullPath in importVisitor.onceFileDetectionMap) {
return true;
}
@@ -1800,26 +1933,31 @@
};
}
}
+
if (!fullPath && isOptional) {
importNode.skip = true;
}
+
if (root) {
importNode.root = root;
importNode.importedFilename = fullPath;
+
if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {
importVisitor.recursionDetector[fullPath] = true;
- var oldContext = this.context;
+
+ const oldContext = this.context;
this.context = context;
try {
this._visitor.visit(root);
- }
- catch (e) {
+ } catch (e) {
this.error = e;
}
this.context = oldContext;
}
}
+
importVisitor.importCount--;
+
if (importVisitor.isFinished) {
importVisitor._sequencer.tryRun();
}
@@ -1827,12 +1965,11 @@
visitDeclaration: function (declNode, visitArgs) {
if (declNode.value.type === 'DetachedRuleset') {
this.context.frames.unshift(declNode);
- }
- else {
+ } else {
visitArgs.visitDeeper = false;
}
},
- visitDeclarationOut: function (declNode) {
+ visitDeclarationOut: function(declNode) {
if (declNode.value.type === 'DetachedRuleset') {
this.context.frames.shift();
}
@@ -1840,16 +1977,13 @@
visitAtRule: function (atRuleNode, visitArgs) {
if (atRuleNode.value) {
this.context.frames.unshift(atRuleNode);
- }
- else if (atRuleNode.declarations && atRuleNode.declarations.length) {
+ } else if (atRuleNode.declarations && atRuleNode.declarations.length) {
if (atRuleNode.isRooted) {
this.context.frames.unshift(atRuleNode);
- }
- else {
+ } else {
this.context.frames.unshift(atRuleNode.declarations[0]);
}
- }
- else if (atRuleNode.rules && atRuleNode.rules.length) {
+ } else if (atRuleNode.rules && atRuleNode.rules.length) {
this.context.frames.unshift(atRuleNode);
}
},
@@ -1876,167 +2010,189 @@
}
};
- var SetTreeVisibilityVisitor = /** @class */ (function () {
- function SetTreeVisibilityVisitor(visible) {
+ class SetTreeVisibilityVisitor {
+ constructor(visible) {
this.visible = visible;
}
- SetTreeVisibilityVisitor.prototype.run = function (root) {
+
+ run(root) {
this.visit(root);
- };
- SetTreeVisibilityVisitor.prototype.visitArray = function (nodes) {
+ }
+
+ visitArray(nodes) {
if (!nodes) {
return nodes;
}
- var cnt = nodes.length;
- var i;
+
+ const cnt = nodes.length;
+ let i;
for (i = 0; i < cnt; i++) {
this.visit(nodes[i]);
}
return nodes;
- };
- SetTreeVisibilityVisitor.prototype.visit = function (node) {
+ }
+
+ visit(node) {
if (!node) {
return node;
}
if (node.constructor === Array) {
return this.visitArray(node);
}
+
if (!node.blocksVisibility || node.blocksVisibility()) {
return node;
}
if (this.visible) {
node.ensureVisibility();
- }
- else {
+ } else {
node.ensureInvisibility();
}
+
node.accept(this);
return node;
- };
- return SetTreeVisibilityVisitor;
- }());
+ }
+ }
/* eslint-disable no-unused-vars */
+
/* jshint loopfunc:true */
- var ExtendFinderVisitor = /** @class */ (function () {
- function ExtendFinderVisitor() {
+
+ class ExtendFinderVisitor {
+ constructor() {
this._visitor = new Visitor(this);
this.contexts = [];
this.allExtendsStack = [[]];
}
- ExtendFinderVisitor.prototype.run = function (root) {
+
+ run(root) {
root = this._visitor.visit(root);
root.allExtends = this.allExtendsStack[0];
return root;
- };
- ExtendFinderVisitor.prototype.visitDeclaration = function (declNode, visitArgs) {
+ }
+
+ visitDeclaration(declNode, visitArgs) {
visitArgs.visitDeeper = false;
- };
- ExtendFinderVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) {
+ }
+
+ visitMixinDefinition(mixinDefinitionNode, visitArgs) {
visitArgs.visitDeeper = false;
- };
- ExtendFinderVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) {
+ }
+
+ visitRuleset(rulesetNode, visitArgs) {
if (rulesetNode.root) {
return;
}
- var i;
- var j;
- var extend;
- var allSelectorsExtendList = [];
- var extendList;
+
+ let i;
+ let j;
+ let extend;
+ const allSelectorsExtendList = [];
+ let extendList;
+
// get &:extend(.a); rules which apply to all selectors in this ruleset
- var rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;
+ const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;
for (i = 0; i < ruleCnt; i++) {
if (rulesetNode.rules[i] instanceof tree.Extend) {
allSelectorsExtendList.push(rules[i]);
rulesetNode.extendOnEveryPath = true;
}
}
+
// now find every selector and apply the extends that apply to all extends
// and the ones which apply to an individual extend
- var paths = rulesetNode.paths;
+ const paths = rulesetNode.paths;
for (i = 0; i < paths.length; i++) {
- var selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;
+ const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;
+
extendList = selExtendList ? copyArray(selExtendList).concat(allSelectorsExtendList)
: allSelectorsExtendList;
+
if (extendList) {
- extendList = extendList.map(function (allSelectorsExtend) {
+ extendList = extendList.map(function(allSelectorsExtend) {
return allSelectorsExtend.clone();
});
}
+
for (j = 0; j < extendList.length; j++) {
this.foundExtends = true;
extend = extendList[j];
extend.findSelfSelectors(selectorPath);
extend.ruleset = rulesetNode;
- if (j === 0) {
- extend.firstExtendOnThisSelectorPath = true;
- }
+ if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }
this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);
}
}
+
this.contexts.push(rulesetNode.selectors);
- };
- ExtendFinderVisitor.prototype.visitRulesetOut = function (rulesetNode) {
+ }
+
+ visitRulesetOut(rulesetNode) {
if (!rulesetNode.root) {
this.contexts.length = this.contexts.length - 1;
}
- };
- ExtendFinderVisitor.prototype.visitMedia = function (mediaNode, visitArgs) {
+ }
+
+ visitMedia(mediaNode, visitArgs) {
mediaNode.allExtends = [];
this.allExtendsStack.push(mediaNode.allExtends);
- };
- ExtendFinderVisitor.prototype.visitMediaOut = function (mediaNode) {
+ }
+
+ visitMediaOut(mediaNode) {
this.allExtendsStack.length = this.allExtendsStack.length - 1;
- };
- ExtendFinderVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) {
+ }
+
+ visitAtRule(atRuleNode, visitArgs) {
atRuleNode.allExtends = [];
this.allExtendsStack.push(atRuleNode.allExtends);
- };
- ExtendFinderVisitor.prototype.visitAtRuleOut = function (atRuleNode) {
+ }
+
+ visitAtRuleOut(atRuleNode) {
this.allExtendsStack.length = this.allExtendsStack.length - 1;
- };
- return ExtendFinderVisitor;
- }());
- var ProcessExtendsVisitor = /** @class */ (function () {
- function ProcessExtendsVisitor() {
+ }
+ }
+
+ class ProcessExtendsVisitor {
+ constructor() {
this._visitor = new Visitor(this);
}
- ProcessExtendsVisitor.prototype.run = function (root) {
- var extendFinder = new ExtendFinderVisitor();
+
+ run(root) {
+ const extendFinder = new ExtendFinderVisitor();
this.extendIndices = {};
extendFinder.run(root);
- if (!extendFinder.foundExtends) {
- return root;
- }
+ if (!extendFinder.foundExtends) { return root; }
root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));
this.allExtendsStack = [root.allExtends];
- var newRoot = this._visitor.visit(root);
+ const newRoot = this._visitor.visit(root);
this.checkExtendsForNonMatched(root.allExtends);
return newRoot;
- };
- ProcessExtendsVisitor.prototype.checkExtendsForNonMatched = function (extendList) {
- var indices = this.extendIndices;
- extendList.filter(function (extend) {
+ }
+
+ checkExtendsForNonMatched(extendList) {
+ const indices = this.extendIndices;
+ extendList.filter(function(extend) {
return !extend.hasFoundMatches && extend.parent_ids.length == 1;
- }).forEach(function (extend) {
- var selector = '_unknown_';
+ }).forEach(function(extend) {
+ let selector = '_unknown_';
try {
selector = extend.selector.toCSS({});
}
- catch (_) { }
- if (!indices["".concat(extend.index, " ").concat(selector)]) {
- indices["".concat(extend.index, " ").concat(selector)] = true;
+ catch (_) {}
+
+ if (!indices[`${extend.index} ${selector}`]) {
+ indices[`${extend.index} ${selector}`] = true;
/**
* @todo Shouldn't this be an error? To alert the developer
* that they may have made an error in the selector they are
* targeting?
*/
- logger$1.warn("WARNING: extend '".concat(selector, "' has no matches"));
+ logger$1.warn(`WARNING: extend '${selector}' has no matches`);
}
});
- };
- ProcessExtendsVisitor.prototype.doExtendChaining = function (extendsList, extendsListTarget, iterationCount) {
+ }
+
+ doExtendChaining(extendsList, extendsListTarget, iterationCount) {
//
// chaining is different from normal extension.. if we extend an extend then we are not just copying, altering
// and pasting the selector we would do normally, but we are also adding an extend with the same target selector
@@ -2045,17 +2201,21 @@
// this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors
// this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already
// processed if we look at each selector at a time, as is done in visitRuleset
- var extendIndex;
- var targetExtendIndex;
- var matches;
- var extendsToAdd = [];
- var newSelector;
- var extendVisitor = this;
- var selectorPath;
- var extend;
- var targetExtend;
- var newExtend;
+
+ let extendIndex;
+
+ let targetExtendIndex;
+ let matches;
+ const extendsToAdd = [];
+ let newSelector;
+ const extendVisitor = this;
+ let selectorPath;
+ let extend;
+ let targetExtend;
+ let newExtend;
+
iterationCount = iterationCount || 0;
+
// loop through comparing every extend with every target extend.
// a target extend is the one on the ruleset we are looking at copy/edit/pasting in place
// e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one
@@ -2064,32 +2224,41 @@
// case when processing media queries
for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {
for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {
+
extend = extendsList[extendIndex];
targetExtend = extendsListTarget[targetExtendIndex];
+
// look for circular references
- if (extend.parent_ids.indexOf(targetExtend.object_id) >= 0) {
- continue;
- }
+ if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }
+
// find a match in the target extends self selector (the bit before :extend)
selectorPath = [targetExtend.selfSelectors[0]];
matches = extendVisitor.findMatch(extend, selectorPath);
+
if (matches.length) {
extend.hasFoundMatches = true;
+
// we found a match, so for each self selector..
- extend.selfSelectors.forEach(function (selfSelector) {
- var info = targetExtend.visibilityInfo();
+ extend.selfSelectors.forEach(function(selfSelector) {
+ const info = targetExtend.visibilityInfo();
+
// process the extend as usual
newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());
+
// but now we create a new extend from it
- newExtend = new (tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);
+ newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);
newExtend.selfSelectors = newSelector;
+
// add the extend onto the list of extends for that selector
newSelector[newSelector.length - 1].extendList = [newExtend];
+
// record that we need to add it.
extendsToAdd.push(newExtend);
newExtend.ruleset = targetExtend.ruleset;
+
// remember its parents for circular references
newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);
+
// only process the selector once.. if we have :extend(.a,.b) then multiple
// extends will look at the same selector path, so when extending
// we know that any others will be duplicates in terms of what is added to the css
@@ -2101,101 +2270,114 @@
}
}
}
+
if (extendsToAdd.length) {
// try to detect circular references to stop a stack overflow.
// may no longer be needed.
this.extendChainCount++;
if (iterationCount > 100) {
- var selectorOne = '{unable to calculate}';
- var selectorTwo = '{unable to calculate}';
+ let selectorOne = '{unable to calculate}';
+ let selectorTwo = '{unable to calculate}';
try {
selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();
selectorTwo = extendsToAdd[0].selector.toCSS();
}
- catch (e) { }
- throw { message: "extend circular reference detected. One of the circular extends is currently:".concat(selectorOne, ":extend(").concat(selectorTwo, ")") };
+ catch (e) {}
+ throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};
}
+
// now process the new extends on the existing rules so that we can handle a extending b extending c extending
// d extending e...
return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));
- }
- else {
+ } else {
return extendsToAdd;
}
- };
- ProcessExtendsVisitor.prototype.visitDeclaration = function (ruleNode, visitArgs) {
+ }
+
+ visitDeclaration(ruleNode, visitArgs) {
visitArgs.visitDeeper = false;
- };
- ProcessExtendsVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) {
+ }
+
+ visitMixinDefinition(mixinDefinitionNode, visitArgs) {
visitArgs.visitDeeper = false;
- };
- ProcessExtendsVisitor.prototype.visitSelector = function (selectorNode, visitArgs) {
+ }
+
+ visitSelector(selectorNode, visitArgs) {
visitArgs.visitDeeper = false;
- };
- ProcessExtendsVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) {
+ }
+
+ visitRuleset(rulesetNode, visitArgs) {
if (rulesetNode.root) {
return;
}
- var matches;
- var pathIndex;
- var extendIndex;
- var allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];
- var selectorsToAdd = [];
- var extendVisitor = this;
- var selectorPath;
+ let matches;
+ const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];
+ const selectorsToAdd = [];
+ const paths = rulesetNode.paths;
+ const pathCount = paths.length;
+
// look at each selector path in the ruleset, find any extend matches and then copy, find and replace
- for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {
- for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {
- selectorPath = rulesetNode.paths[pathIndex];
+
+ for (let extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {
+ const extend = allExtends[extendIndex];
+ for (let pathIndex = 0; pathIndex < pathCount; pathIndex++) {
+ const selectorPath = paths[pathIndex];
+
// extending extends happens initially, before the main pass
- if (rulesetNode.extendOnEveryPath) {
- continue;
- }
- var extendList = selectorPath[selectorPath.length - 1].extendList;
- if (extendList && extendList.length) {
- continue;
- }
- matches = this.findMatch(allExtends[extendIndex], selectorPath);
+ if (rulesetNode.extendOnEveryPath) { continue; }
+ const extendList = selectorPath[selectorPath.length - 1].extendList;
+ if (extendList && extendList.length) { continue; }
+
+ matches = this.findMatch(extend, selectorPath);
+
if (matches.length) {
- allExtends[extendIndex].hasFoundMatches = true;
- allExtends[extendIndex].selfSelectors.forEach(function (selfSelector) {
- var extendedSelectors;
- extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());
- selectorsToAdd.push(extendedSelectors);
- });
+ extend.hasFoundMatches = true;
+
+ const selfSelectors = extend.selfSelectors;
+ const isVisible = extend.isVisible();
+ for (let si = 0; si < selfSelectors.length; si++) {
+ selectorsToAdd.push(this.extendSelector(matches, selectorPath, selfSelectors[si], isVisible));
+ }
}
}
}
- rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);
- };
- ProcessExtendsVisitor.prototype.findMatch = function (extend, haystackSelectorPath) {
+ rulesetNode.paths = paths.concat(selectorsToAdd);
+ }
+
+ findMatch(extend, haystackSelectorPath) {
//
// look through the haystack selector path to try and find the needle - extend.selector
// returns an array of selector matches that can then be replaced
//
- var haystackSelectorIndex;
- var hackstackSelector;
- var hackstackElementIndex;
- var haystackElement;
- var targetCombinator;
- var i;
- var extendVisitor = this;
- var needleElements = extend.selector.elements;
- var potentialMatches = [];
- var potentialMatch;
- var matches = [];
+ let haystackSelectorIndex;
+
+ let hackstackSelector;
+ let hackstackElementIndex;
+ let haystackElement;
+ let targetCombinator;
+ let i;
+ const needleElements = extend.selector.elements;
+ const potentialMatches = [];
+ let potentialMatch;
+ const matches = [];
+
// loop through the haystack elements
for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {
hackstackSelector = haystackSelectorPath[haystackSelectorIndex];
+
for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {
+
haystackElement = hackstackSelector.elements[hackstackElementIndex];
+
// if we allow elements before our match we can add a potential match every time. otherwise only at the first element.
if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {
- potentialMatches.push({ pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,
- initialCombinator: haystackElement.combinator });
+ potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,
+ initialCombinator: haystackElement.combinator});
}
+
for (i = 0; i < potentialMatches.length; i++) {
potentialMatch = potentialMatches[i];
+
// selectors add " " onto the first element. When we use & it joins the selectors together, but if we don't
// then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to
// work out what the resulting combinator will be
@@ -2203,14 +2385,15 @@
if (targetCombinator === '' && hackstackElementIndex === 0) {
targetCombinator = ' ';
}
+
// if we don't match, null our match to indicate failure
- if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||
+ if (!this.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||
(potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {
potentialMatch = null;
- }
- else {
+ } else {
potentialMatch.matched++;
}
+
// if we are still valid and have finished, test whether we have elements after and whether these are allowed
if (potentialMatch) {
potentialMatch.finished = potentialMatch.matched === needleElements.length;
@@ -2229,8 +2412,7 @@
potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again
matches.push(potentialMatch);
}
- }
- else {
+ } else {
potentialMatches.splice(i, 1);
i--;
}
@@ -2238,8 +2420,9 @@
}
}
return matches;
- };
- ProcessExtendsVisitor.prototype.isElementValuesEqual = function (elementValue1, elementValue2) {
+ }
+
+ isElementValuesEqual(elementValue1, elementValue2) {
if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {
return elementValue1 === elementValue2;
}
@@ -2263,44 +2446,59 @@
if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {
return false;
}
- for (var i_1 = 0; i_1 < elementValue1.elements.length; i_1++) {
- if (elementValue1.elements[i_1].combinator.value !== elementValue2.elements[i_1].combinator.value) {
- if (i_1 !== 0 || (elementValue1.elements[i_1].combinator.value || ' ') !== (elementValue2.elements[i_1].combinator.value || ' ')) {
+ for (let i = 0; i < elementValue1.elements.length; i++) {
+ if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {
+ if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {
return false;
}
}
- if (!this.isElementValuesEqual(elementValue1.elements[i_1].value, elementValue2.elements[i_1].value)) {
+ if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {
return false;
}
}
return true;
}
return false;
- };
- ProcessExtendsVisitor.prototype.extendSelector = function (matches, selectorPath, replacementSelector, isVisible) {
+ }
+
+ extendSelector(matches, selectorPath, replacementSelector, isVisible) {
+
// for a set of matches, replace each match with the replacement selector
- var currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;
+
+ let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;
+
for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {
match = matches[matchIndex];
selector = selectorPath[match.pathIndex];
- firstElement = new tree.Element(match.initialCombinator, replacementSelector.elements[0].value, replacementSelector.elements[0].isVariable, replacementSelector.elements[0].getIndex(), replacementSelector.elements[0].fileInfo());
+ firstElement = new tree.Element(
+ match.initialCombinator,
+ replacementSelector.elements[0].value,
+ replacementSelector.elements[0].isVariable,
+ replacementSelector.elements[0].getIndex(),
+ replacementSelector.elements[0].fileInfo()
+ );
+
if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {
path[path.length - 1].elements = path[path.length - 1]
.elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));
currentSelectorPathElementIndex = 0;
currentSelectorPathIndex++;
}
+
newElements = selector.elements
.slice(currentSelectorPathElementIndex, match.index)
.concat([firstElement])
.concat(replacementSelector.elements.slice(1));
+
if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {
path[path.length - 1].elements =
path[path.length - 1].elements.concat(newElements);
- }
- else {
+ } else {
path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));
- path.push(new tree.Selector(newElements));
+
+ path.push(new tree.Selector(
+ newElements
+ ));
}
currentSelectorPathIndex = match.endPathIndex;
currentSelectorPathElementIndex = match.endPathElementIndex;
@@ -2309,627 +2507,1086 @@
currentSelectorPathIndex++;
}
}
+
if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {
path[path.length - 1].elements = path[path.length - 1]
.elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));
currentSelectorPathIndex++;
}
+
path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));
path = path.map(function (currentValue) {
// we can re-use elements here, because the visibility property matters only for selectors
- var derived = currentValue.createDerived(currentValue.elements);
+ const derived = currentValue.createDerived(currentValue.elements);
if (isVisible) {
derived.ensureVisibility();
- }
- else {
+ } else {
derived.ensureInvisibility();
}
return derived;
});
return path;
- };
- ProcessExtendsVisitor.prototype.visitMedia = function (mediaNode, visitArgs) {
- var newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);
+ }
+
+ visitMedia(mediaNode, visitArgs) {
+ let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);
newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));
this.allExtendsStack.push(newAllExtends);
- };
- ProcessExtendsVisitor.prototype.visitMediaOut = function (mediaNode) {
- var lastIndex = this.allExtendsStack.length - 1;
+ }
+
+ visitMediaOut(mediaNode) {
+ const lastIndex = this.allExtendsStack.length - 1;
this.allExtendsStack.length = lastIndex;
- };
- ProcessExtendsVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) {
- var newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);
+ }
+
+ visitAtRule(atRuleNode, visitArgs) {
+ let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);
newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));
this.allExtendsStack.push(newAllExtends);
- };
- ProcessExtendsVisitor.prototype.visitAtRuleOut = function (atRuleNode) {
- var lastIndex = this.allExtendsStack.length - 1;
+ }
+
+ visitAtRuleOut(atRuleNode) {
+ const lastIndex = this.allExtendsStack.length - 1;
this.allExtendsStack.length = lastIndex;
- };
- return ProcessExtendsVisitor;
- }());
+ }
+ }
/* eslint-disable no-unused-vars */
- var JoinSelectorVisitor = /** @class */ (function () {
- function JoinSelectorVisitor() {
+
+ class JoinSelectorVisitor {
+ constructor() {
this.contexts = [[]];
this._visitor = new Visitor(this);
}
- JoinSelectorVisitor.prototype.run = function (root) {
+
+ run(root) {
return this._visitor.visit(root);
- };
- JoinSelectorVisitor.prototype.visitDeclaration = function (declNode, visitArgs) {
+ }
+
+ visitDeclaration(declNode, visitArgs) {
visitArgs.visitDeeper = false;
- };
- JoinSelectorVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) {
+ }
+
+ visitMixinDefinition(mixinDefinitionNode, visitArgs) {
visitArgs.visitDeeper = false;
- };
- JoinSelectorVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) {
- var context = this.contexts[this.contexts.length - 1];
- var paths = [];
- var selectors;
+ }
+
+ visitRuleset(rulesetNode, visitArgs) {
+ const context = this.contexts[this.contexts.length - 1];
+ const paths = [];
+ let selectors;
+
this.contexts.push(paths);
+
if (!rulesetNode.root) {
selectors = rulesetNode.selectors;
if (selectors) {
- selectors = selectors.filter(function (selector) { return selector.getIsOutput(); });
+ selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });
rulesetNode.selectors = selectors.length ? selectors : (selectors = null);
- if (selectors) {
- rulesetNode.joinSelectors(paths, context, selectors);
- }
- }
- if (!selectors) {
- rulesetNode.rules = null;
+ if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }
}
+ if (!selectors) { rulesetNode.rules = null; }
rulesetNode.paths = paths;
}
- };
- JoinSelectorVisitor.prototype.visitRulesetOut = function (rulesetNode) {
+ }
+
+ visitRulesetOut(rulesetNode) {
this.contexts.length = this.contexts.length - 1;
- };
- JoinSelectorVisitor.prototype.visitMedia = function (mediaNode, visitArgs) {
- var context = this.contexts[this.contexts.length - 1];
+ }
+
+ visitMedia(mediaNode, visitArgs) {
+ const context = this.contexts[this.contexts.length - 1];
mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);
- };
- JoinSelectorVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) {
- var context = this.contexts[this.contexts.length - 1];
+ }
+
+ visitAtRule(atRuleNode, visitArgs) {
+ const context = this.contexts[this.contexts.length - 1];
+
if (atRuleNode.declarations && atRuleNode.declarations.length) {
atRuleNode.declarations[0].root = (context.length === 0 || context[0].multiMedia);
}
else if (atRuleNode.rules && atRuleNode.rules.length) {
atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);
}
- };
- return JoinSelectorVisitor;
- }());
+ }
+ }
- /* eslint-disable no-unused-vars */
- var CSSVisitorUtils = /** @class */ (function () {
- function CSSVisitorUtils(context) {
- this._visitor = new Visitor(this);
- this._context = context;
+ /**
+ * @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead.
+ * This will be removed in a future version.
+ *
+ * @param {Object} ctx - Context object with debugInfo
+ * @returns {string} Debug info as CSS comment
+ */
+ function asComment(ctx) {
+ return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\n`;
+ }
+
+ /**
+ * @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead.
+ * This function generates Sass-compatible debug info using @media -sass-debug-info syntax.
+ * This format had short-lived usage and is no longer recommended.
+ * This will be removed in a future version.
+ *
+ * @param {Object} ctx - Context object with debugInfo
+ * @returns {string} Sass-compatible debug info as @media query
+ */
+ function asMediaQuery(ctx) {
+ let filenameWithProtocol = ctx.debugInfo.fileName;
+ if (!/^[a-z]+:\/\//i.test(filenameWithProtocol)) {
+ filenameWithProtocol = `file://${filenameWithProtocol}`;
}
- CSSVisitorUtils.prototype.containsSilentNonBlockedChild = function (bodyRules) {
- var rule;
- if (!bodyRules) {
- return false;
- }
- for (var r = 0; r < bodyRules.length; r++) {
- rule = bodyRules[r];
- if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {
- // the atrule contains something that was referenced (likely by extend)
- // therefore it needs to be shown in output too
- return true;
- }
- }
- return false;
- };
- CSSVisitorUtils.prototype.keepOnlyVisibleChilds = function (owner) {
- if (owner && owner.rules) {
- owner.rules = owner.rules.filter(function (thing) { return thing.isVisible(); });
- }
- };
- CSSVisitorUtils.prototype.isEmpty = function (owner) {
- return (owner && owner.rules)
- ? (owner.rules.length === 0) : true;
- };
- CSSVisitorUtils.prototype.hasVisibleSelector = function (rulesetNode) {
- return (rulesetNode && rulesetNode.paths)
- ? (rulesetNode.paths.length > 0) : false;
- };
- CSSVisitorUtils.prototype.resolveVisibility = function (node) {
- if (!node.blocksVisibility()) {
- if (this.isEmpty(node)) {
- return;
- }
- return node;
- }
- var compiledRulesBody = node.rules[0];
- this.keepOnlyVisibleChilds(compiledRulesBody);
- if (this.isEmpty(compiledRulesBody)) {
- return;
- }
- node.ensureVisibility();
- node.removeVisibilityBlock();
- return node;
- };
- CSSVisitorUtils.prototype.isVisibleRuleset = function (rulesetNode) {
- if (rulesetNode.firstRoot) {
- return true;
- }
- if (this.isEmpty(rulesetNode)) {
- return false;
+ return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:/\\])/g, function (a) {
+ if (a == '\\') {
+ a = '/';
+ }
+ return `\\${a}`;
+ })}}line{font-family:\\00003${ctx.debugInfo.lineNumber}}}\n`;
+ }
+
+ /**
+ * Generates debug information (line numbers) for CSS output.
+ *
+ * @param {Object} context - Context object with dumpLineNumbers option
+ * @param {Object} ctx - Context object with debugInfo
+ * @param {string} [lineSeparator] - Separator between comment and media query (for 'all' mode)
+ * @returns {string} Debug info string
+ *
+ * @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead.
+ * All modes ('comments', 'mediaquery', 'all') are deprecated and will be removed in a future version.
+ * The 'mediaquery' and 'all' modes generate Sass-compatible @media -sass-debug-info output
+ * which had short-lived usage and is no longer recommended.
+ */
+ function debugInfo(context, ctx, lineSeparator) {
+ let result = '';
+ if (context.dumpLineNumbers && !context.compress) {
+ switch (context.dumpLineNumbers) {
+ case 'comments':
+ result = asComment(ctx);
+ break;
+ case 'mediaquery':
+ result = asMediaQuery(ctx);
+ break;
+ case 'all':
+ result = asComment(ctx) + (lineSeparator || '') + asMediaQuery(ctx);
+ break;
}
- if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {
- return false;
+ }
+ return result;
+ }
+
+ const Comment = function(value, isLineComment, index, currentFileInfo) {
+ this.value = value;
+ this.isLineComment = isLineComment;
+ this._index = index;
+ this._fileInfo = currentFileInfo;
+ this.allowRoot = true;
+ };
+
+ Comment.prototype = Object.assign(new Node(), {
+ type: 'Comment',
+
+ genCSS(context, output) {
+ if (this.debugInfo) {
+ output.add(debugInfo(context, this), this.fileInfo(), this.getIndex());
}
- return true;
- };
- return CSSVisitorUtils;
- }());
- var ToCSSVisitor = function (context) {
- this._visitor = new Visitor(this);
- this._context = context;
- this.utils = new CSSVisitorUtils(context);
+ output.add(this.value);
+ },
+
+ isSilent(context) {
+ const isCompressed = context.compress && this.value[2] !== '!';
+ return this.isLineComment || isCompressed;
+ }
+ });
+
+ const Unit = function(numerator, denominator, backupUnit) {
+ this.numerator = numerator ? copyArray(numerator).sort() : [];
+ this.denominator = denominator ? copyArray(denominator).sort() : [];
+ if (backupUnit) {
+ this.backupUnit = backupUnit;
+ } else if (numerator && numerator.length) {
+ this.backupUnit = numerator[0];
+ }
};
- ToCSSVisitor.prototype = {
- isReplacing: true,
- run: function (root) {
- return this._visitor.visit(root);
+
+ Unit.prototype = Object.assign(new Node(), {
+ type: 'Unit',
+
+ clone() {
+ return new Unit(copyArray(this.numerator), copyArray(this.denominator), this.backupUnit);
},
- visitDeclaration: function (declNode, visitArgs) {
- if (declNode.blocksVisibility() || declNode.variable) {
- return;
+
+ genCSS(context, output) {
+ // Dimension checks the unit is singular and throws an error if in strict math mode.
+ const strictUnits = context && context.strictUnits;
+ if (this.numerator.length === 1) {
+ output.add(this.numerator[0]); // the ideal situation
+ } else if (!strictUnits && this.backupUnit) {
+ output.add(this.backupUnit);
+ } else if (!strictUnits && this.denominator.length) {
+ output.add(this.denominator[0]);
}
- return declNode;
},
- visitMixinDefinition: function (mixinNode, visitArgs) {
- // mixin definitions do not get eval'd - this means they keep state
- // so we have to clear that state here so it isn't used if toCSS is called twice
- mixinNode.frames = [];
+
+ toString() {
+ let i, returnStr = this.numerator.join('*');
+ for (i = 0; i < this.denominator.length; i++) {
+ returnStr += `/${this.denominator[i]}`;
+ }
+ return returnStr;
},
- visitExtend: function (extendNode, visitArgs) {
+
+ compare(other) {
+ return this.is(other.toString()) ? 0 : undefined;
},
- visitComment: function (commentNode, visitArgs) {
- if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {
- return;
- }
- return commentNode;
+
+ is(unitString) {
+ return this.toString().toUpperCase() === unitString.toUpperCase();
},
- visitMedia: function (mediaNode, visitArgs) {
- var originalRules = mediaNode.rules[0].rules;
- mediaNode.accept(this._visitor);
- visitArgs.visitDeeper = false;
- return this.utils.resolveVisibility(mediaNode, originalRules);
+
+ isLength() {
+ return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());
},
- visitImport: function (importNode, visitArgs) {
- if (importNode.blocksVisibility()) {
- return;
- }
- return importNode;
+
+ isEmpty() {
+ return this.numerator.length === 0 && this.denominator.length === 0;
},
- visitAtRule: function (atRuleNode, visitArgs) {
- if (atRuleNode.rules && atRuleNode.rules.length) {
- return this.visitAtRuleWithBody(atRuleNode, visitArgs);
+
+ isSingular() {
+ return this.numerator.length <= 1 && this.denominator.length === 0;
+ },
+
+ map(callback) {
+ let i;
+
+ for (i = 0; i < this.numerator.length; i++) {
+ this.numerator[i] = callback(this.numerator[i], false);
}
- else {
- return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);
+
+ for (i = 0; i < this.denominator.length; i++) {
+ this.denominator[i] = callback(this.denominator[i], true);
}
},
- visitAnonymous: function (anonymousNode, visitArgs) {
- if (!anonymousNode.blocksVisibility()) {
- anonymousNode.accept(this._visitor);
- return anonymousNode;
+
+ usedUnits() {
+ let group;
+ const result = {};
+ let mapUnit;
+ let groupName;
+
+ mapUnit = function (atomicUnit) {
+ // eslint-disable-next-line no-prototype-builtins
+ if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {
+ result[groupName] = atomicUnit;
+ }
+
+ return atomicUnit;
+ };
+
+ for (groupName in unitConversions) {
+ // eslint-disable-next-line no-prototype-builtins
+ if (unitConversions.hasOwnProperty(groupName)) {
+ group = unitConversions[groupName];
+
+ this.map(mapUnit);
+ }
}
+
+ return result;
},
- visitAtRuleWithBody: function (atRuleNode, visitArgs) {
- // if there is only one nested ruleset and that one has no path, then it is
- // just fake ruleset
- function hasFakeRuleset(atRuleNode) {
- var bodyRules = atRuleNode.rules;
- return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);
+
+ cancel() {
+ const counter = {};
+ let atomicUnit;
+ let i;
+
+ for (i = 0; i < this.numerator.length; i++) {
+ atomicUnit = this.numerator[i];
+ counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;
}
- function getBodyRules(atRuleNode) {
- var nodeRules = atRuleNode.rules;
- if (hasFakeRuleset(atRuleNode)) {
- return nodeRules[0].rules;
- }
- return nodeRules;
- }
- // it is still true that it is only one ruleset in array
- // this is last such moment
- // process childs
- var originalRules = getBodyRules(atRuleNode);
- atRuleNode.accept(this._visitor);
- visitArgs.visitDeeper = false;
- if (!this.utils.isEmpty(atRuleNode)) {
- this._mergeRules(atRuleNode.rules[0].rules);
- }
- return this.utils.resolveVisibility(atRuleNode, originalRules);
- },
- visitAtRuleWithoutBody: function (atRuleNode, visitArgs) {
- if (atRuleNode.blocksVisibility()) {
- return;
+
+ for (i = 0; i < this.denominator.length; i++) {
+ atomicUnit = this.denominator[i];
+ counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;
}
- if (atRuleNode.name === '@charset') {
- // Only output the debug info together with subsequent @charset definitions
- // a comment (or @media statement) before the actual @charset atrule would
- // be considered illegal css as it has to be on the first line
- if (this.charset) {
- if (atRuleNode.debugInfo) {
- var comment = new tree.Comment("/* ".concat(atRuleNode.toCSS(this._context).replace(/\n/g, ''), " */\n"));
- comment.debugInfo = atRuleNode.debugInfo;
- return this._visitor.visit(comment);
+
+ this.numerator = [];
+ this.denominator = [];
+
+ for (atomicUnit in counter) {
+ // eslint-disable-next-line no-prototype-builtins
+ if (counter.hasOwnProperty(atomicUnit)) {
+ const count = counter[atomicUnit];
+
+ if (count > 0) {
+ for (i = 0; i < count; i++) {
+ this.numerator.push(atomicUnit);
+ }
+ } else if (count < 0) {
+ for (i = 0; i < -count; i++) {
+ this.denominator.push(atomicUnit);
+ }
}
- return;
}
- this.charset = true;
}
- return atRuleNode;
+
+ this.numerator.sort();
+ this.denominator.sort();
+ }
+ });
+
+ /* eslint-disable no-prototype-builtins */
+
+ //
+ // A number with a unit
+ //
+ const Dimension = function(value, unit) {
+ this.value = parseFloat(value);
+ if (isNaN(this.value)) {
+ throw new Error('Dimension is not a number.');
+ }
+ this.unit = (unit && unit instanceof Unit) ? unit :
+ new Unit(unit ? [unit] : undefined);
+ this.setParent(this.unit, this);
+ };
+
+ Dimension.prototype = Object.assign(new Node(), {
+ type: 'Dimension',
+
+ accept(visitor) {
+ this.unit = visitor.visit(this.unit);
},
- checkValidNodes: function (rules, isRoot) {
- if (!rules) {
- return;
+
+ // remove when Nodes have JSDoc types
+ // eslint-disable-next-line no-unused-vars
+ eval(context) {
+ return this;
+ },
+
+ toColor() {
+ return new Color([this.value, this.value, this.value]);
+ },
+
+ genCSS(context, output) {
+ if ((context && context.strictUnits) && !this.unit.isSingular()) {
+ throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);
}
- for (var i_1 = 0; i_1 < rules.length; i_1++) {
- var ruleNode = rules[i_1];
- if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {
- throw { message: 'Properties must be inside selector blocks. They cannot be in the root',
- index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename };
- }
- if (ruleNode instanceof tree.Call) {
- throw { message: "Function '".concat(ruleNode.name, "' did not return a root node"),
- index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename };
- }
- if (ruleNode.type && !ruleNode.allowRoot) {
- throw { message: "".concat(ruleNode.type, " node returned by a function is not valid here"),
- index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename };
- }
+
+ const value = this.fround(context, this.value);
+ let strValue = String(value);
+
+ if (value !== 0 && value < 0.000001 && value > -0.000001) {
+ // would be output 1e-6 etc.
+ strValue = value.toFixed(20).replace(/0+$/, '');
}
- },
- visitRuleset: function (rulesetNode, visitArgs) {
- // at this point rulesets are nested into each other
- var rule;
- var rulesets = [];
- this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);
- if (!rulesetNode.root) {
- // remove invisible paths
- this._compileRulesetPaths(rulesetNode);
- // remove rulesets from this ruleset body and compile them separately
- var nodeRules = rulesetNode.rules;
- var nodeRuleCnt = nodeRules ? nodeRules.length : 0;
- for (var i_2 = 0; i_2 < nodeRuleCnt;) {
- rule = nodeRules[i_2];
- if (rule && rule.rules) {
- // visit because we are moving them out from being a child
- rulesets.push(this._visitor.visit(rule));
- nodeRules.splice(i_2, 1);
- nodeRuleCnt--;
- continue;
- }
- i_2++;
- }
- // accept the visitor to remove rules and refactor itself
- // then we can decide nogw whether we want it or not
- // compile body
- if (nodeRuleCnt > 0) {
- rulesetNode.accept(this._visitor);
+
+ if (context && context.compress) {
+ // Zero values doesn't need a unit
+ if (value === 0 && this.unit.isLength()) {
+ output.add(strValue);
+ return;
}
- else {
- rulesetNode.rules = null;
+
+ // Float values doesn't need a leading zero
+ if (value > 0 && value < 1) {
+ strValue = (strValue).slice(1);
}
- visitArgs.visitDeeper = false;
- }
- else { // if (! rulesetNode.root) {
- rulesetNode.accept(this._visitor);
- visitArgs.visitDeeper = false;
- }
- if (rulesetNode.rules) {
- this._mergeRules(rulesetNode.rules);
- this._removeDuplicateRules(rulesetNode.rules);
- }
- // now decide whether we keep the ruleset
- if (this.utils.isVisibleRuleset(rulesetNode)) {
- rulesetNode.ensureVisibility();
- rulesets.splice(0, 0, rulesetNode);
- }
- if (rulesets.length === 1) {
- return rulesets[0];
}
- return rulesets;
+
+ output.add(strValue);
+ this.unit.genCSS(context, output);
},
- _compileRulesetPaths: function (rulesetNode) {
- if (rulesetNode.paths) {
- rulesetNode.paths = rulesetNode.paths
- .filter(function (p) {
- var i;
- if (p[0].elements[0].combinator.value === ' ') {
- p[0].elements[0].combinator = new (tree.Combinator)('');
+
+ // In an operation between two Dimensions,
+ // we default to the first Dimension's unit,
+ // so `1px + 2` will yield `3px`.
+ operate(context, op, other) {
+ /* jshint noempty:false */
+ let value = this._operate(context, op, this.value, other.value);
+ let unit = this.unit.clone();
+
+ if (op === '+' || op === '-') {
+ if (unit.numerator.length === 0 && unit.denominator.length === 0) {
+ unit = other.unit.clone();
+ if (this.unit.backupUnit) {
+ unit.backupUnit = this.unit.backupUnit;
}
- for (i = 0; i < p.length; i++) {
- if (p[i].isVisible() && p[i].getIsOutput()) {
- return true;
- }
+ } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) ; else {
+ other = other.convertTo(this.unit.usedUnits());
+
+ if (context.strictUnits && other.unit.toString() !== unit.toString()) {
+ throw new Error('Incompatible units. Change the units or use the unit function. '
+ + `Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);
}
- return false;
- });
+
+ value = this._operate(context, op, this.value, other.value);
+ }
+ } else if (op === '*') {
+ unit.numerator = unit.numerator.concat(other.unit.numerator).sort();
+ unit.denominator = unit.denominator.concat(other.unit.denominator).sort();
+ unit.cancel();
+ } else if (op === '/') {
+ unit.numerator = unit.numerator.concat(other.unit.denominator).sort();
+ unit.denominator = unit.denominator.concat(other.unit.numerator).sort();
+ unit.cancel();
}
+ return new Dimension(value, unit);
},
- _removeDuplicateRules: function (rules) {
- if (!rules) {
- return;
+
+ compare(other) {
+ let a, b;
+
+ if (!(other instanceof Dimension)) {
+ return undefined;
}
- // remove duplicates
- var ruleCache = {};
- var ruleList;
- var rule;
- var i;
- for (i = rules.length - 1; i >= 0; i--) {
- rule = rules[i];
- if (rule instanceof tree.Declaration) {
- if (!ruleCache[rule.name]) {
- ruleCache[rule.name] = rule;
- }
- else {
- ruleList = ruleCache[rule.name];
- if (ruleList instanceof tree.Declaration) {
- ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];
- }
- var ruleCSS = rule.toCSS(this._context);
- if (ruleList.indexOf(ruleCSS) !== -1) {
- rules.splice(i, 1);
- }
- else {
- ruleList.push(ruleCSS);
- }
- }
+
+ if (this.unit.isEmpty() || other.unit.isEmpty()) {
+ a = this;
+ b = other;
+ } else {
+ a = this.unify();
+ b = other.unify();
+ if (a.unit.compare(b.unit) !== 0) {
+ return undefined;
}
}
+
+ return Node.numericCompare(a.value, b.value);
},
- _mergeRules: function (rules) {
- if (!rules) {
- return;
+
+ unify() {
+ return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });
+ },
+
+ convertTo(conversions) {
+ let value = this.value;
+ const unit = this.unit.clone();
+ let i;
+ let groupName;
+ let group;
+ let targetUnit;
+ let derivedConversions = {};
+ let applyUnit;
+
+ if (typeof conversions === 'string') {
+ for (i in unitConversions) {
+ if (unitConversions[i].hasOwnProperty(conversions)) {
+ derivedConversions = {};
+ derivedConversions[i] = conversions;
+ }
+ }
+ conversions = derivedConversions;
}
- var groups = {};
- var groupsArr = [];
- for (var i_3 = 0; i_3 < rules.length; i_3++) {
- var rule = rules[i_3];
- if (rule.merge) {
- var key = rule.name;
- groups[key] ? rules.splice(i_3--, 1) :
- groupsArr.push(groups[key] = []);
- groups[key].push(rule);
- }
- }
- groupsArr.forEach(function (group) {
- if (group.length > 0) {
- var result_1 = group[0];
- var space_1 = [];
- var comma_1 = [new tree.Expression(space_1)];
- group.forEach(function (rule) {
- if ((rule.merge === '+') && (space_1.length > 0)) {
- comma_1.push(new tree.Expression(space_1 = []));
- }
- space_1.push(rule.value);
- result_1.important = result_1.important || rule.important;
- });
- result_1.value = new tree.Value(comma_1);
+ applyUnit = function (atomicUnit, denominator) {
+ if (group.hasOwnProperty(atomicUnit)) {
+ if (denominator) {
+ value = value / (group[atomicUnit] / group[targetUnit]);
+ } else {
+ value = value * (group[atomicUnit] / group[targetUnit]);
+ }
+
+ return targetUnit;
}
- });
- }
- };
- var visitors = {
- Visitor: Visitor,
- ImportVisitor: ImportVisitor,
- MarkVisibleSelectorsVisitor: SetTreeVisibilityVisitor,
- ExtendVisitor: ProcessExtendsVisitor,
- JoinSelectorVisitor: JoinSelectorVisitor,
- ToCSSVisitor: ToCSSVisitor
- };
+ return atomicUnit;
+ };
- // Split the input into chunks.
- function chunker (input, fail) {
- var len = input.length;
- var level = 0;
- var parenLevel = 0;
- var lastOpening;
- var lastOpeningParen;
- var lastMultiComment;
- var lastMultiCommentEndBrace;
- var chunks = [];
- var emitFrom = 0;
- var chunkerCurrentIndex;
- var currentChunkStartIndex;
- var cc;
- var cc2;
- var matched;
- function emitChunk(force) {
- var len = chunkerCurrentIndex - emitFrom;
- if (((len < 512) && !force) || !len) {
- return;
+ for (groupName in conversions) {
+ if (conversions.hasOwnProperty(groupName)) {
+ targetUnit = conversions[groupName];
+ group = unitConversions[groupName];
+
+ unit.map(applyUnit);
+ }
}
- chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));
- emitFrom = chunkerCurrentIndex + 1;
+
+ unit.cancel();
+
+ return new Dimension(value, unit);
}
- for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {
- cc = input.charCodeAt(chunkerCurrentIndex);
- if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {
- // a-z or whitespace
- continue;
- }
- switch (cc) {
- case 40: // (
- parenLevel++;
- lastOpeningParen = chunkerCurrentIndex;
- continue;
- case 41: // )
- if (--parenLevel < 0) {
- return fail('missing opening `(`', chunkerCurrentIndex);
- }
- continue;
- case 59: // ;
- if (!parenLevel) {
- emitChunk();
- }
- continue;
- case 123: // {
- level++;
- lastOpening = chunkerCurrentIndex;
- continue;
- case 125: // }
- if (--level < 0) {
- return fail('missing opening `{`', chunkerCurrentIndex);
- }
- if (!level && !parenLevel) {
- emitChunk();
- }
- continue;
- case 92: // \
- if (chunkerCurrentIndex < len - 1) {
- chunkerCurrentIndex++;
- continue;
+ });
+
+ const Anonymous = function(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {
+ this.value = value;
+ this._index = index;
+ this._fileInfo = currentFileInfo;
+ this.mapLines = mapLines;
+ this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;
+ this.allowRoot = true;
+ this.copyVisibilityInfo(visibilityInfo);
+ };
+
+ Anonymous.prototype = Object.assign(new Node(), {
+ type: 'Anonymous',
+ eval() {
+ return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());
+ },
+ compare(other) {
+ return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;
+ },
+ isRulesetLike() {
+ return this.rulesetLike;
+ },
+ genCSS(context, output) {
+ this.nodeVisible = Boolean(this.value);
+ if (this.nodeVisible) {
+ output.add(this.value, this._fileInfo, this._index, this.mapLines);
+ }
+ }
+ });
+
+ const Expression = function(value, noSpacing) {
+ this.value = value;
+ this.noSpacing = noSpacing;
+ if (!value) {
+ throw new Error('Expression requires an array parameter');
+ }
+ };
+
+ Expression.prototype = Object.assign(new Node(), {
+ type: 'Expression',
+
+ accept(visitor) {
+ this.value = visitor.visitArray(this.value);
+ },
+
+ eval(context) {
+ const noSpacing = this.noSpacing;
+ let returnValue;
+ const mathOn = context.isMathOn();
+ const inParenthesis = this.parens;
+
+ let doubleParen = false;
+ if (inParenthesis) {
+ context.inParenthesis();
+ }
+ if (this.value.length > 1) {
+ returnValue = new Expression(this.value.map(function (e) {
+ if (!e.eval) {
+ return e;
}
- return fail('unescaped `\\`', chunkerCurrentIndex);
- case 34:
- case 39:
- case 96: // ", ' and `
- matched = 0;
- currentChunkStartIndex = chunkerCurrentIndex;
- for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {
- cc2 = input.charCodeAt(chunkerCurrentIndex);
- if (cc2 > 96) {
- continue;
- }
- if (cc2 == cc) {
- matched = 1;
- break;
- }
- if (cc2 == 92) { // \
- if (chunkerCurrentIndex == len - 1) {
- return fail('unescaped `\\`', chunkerCurrentIndex);
- }
- chunkerCurrentIndex++;
- }
+ return e.eval(context);
+ }), this.noSpacing);
+ } else if (this.value.length === 1) {
+ if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {
+ doubleParen = true;
+ }
+ returnValue = this.value[0].eval(context);
+ } else {
+ returnValue = this;
+ }
+ if (inParenthesis) {
+ context.outOfParenthesis();
+ }
+ if (this.parens && this.parensInOp && !mathOn && !doubleParen
+ && (!(returnValue instanceof Dimension))) {
+ returnValue = new Paren(returnValue);
+ }
+ returnValue.noSpacing = returnValue.noSpacing || noSpacing;
+ return returnValue;
+ },
+
+ genCSS(context, output) {
+ for (let i = 0; i < this.value.length; i++) {
+ this.value[i].genCSS(context, output);
+ if (!this.noSpacing && i + 1 < this.value.length) {
+ if (!(this.value[i + 1] instanceof Anonymous) ||
+ this.value[i + 1] instanceof Anonymous && this.value[i + 1].value !== ',') {
+ output.add(' ');
}
- if (matched) {
- continue;
+ }
+ }
+ },
+
+ throwAwayComments() {
+ this.value = this.value.filter(function(v) {
+ return !(v instanceof Comment);
+ });
+ }
+ });
+
+ const Value = function(value) {
+ if (!value) {
+ throw new Error('Value requires an array argument');
+ }
+ if (!Array.isArray(value)) {
+ this.value = [ value ];
+ }
+ else {
+ this.value = value;
+ }
+ };
+
+ Value.prototype = Object.assign(new Node(), {
+ type: 'Value',
+
+ accept(visitor) {
+ if (this.value) {
+ this.value = visitor.visitArray(this.value);
+ }
+ },
+
+ eval(context) {
+ if (this.value.length === 1) {
+ return this.value[0].eval(context);
+ } else {
+ return new Value(this.value.map(function (v) {
+ return v.eval(context);
+ }));
+ }
+ },
+
+ genCSS(context, output) {
+ let i;
+ for (i = 0; i < this.value.length; i++) {
+ this.value[i].genCSS(context, output);
+ if (i + 1 < this.value.length) {
+ output.add((context && context.compress) ? ',' : ', ');
+ }
+ }
+ }
+ });
+
+ /**
+ * Merges declarations with merge flags (+ or ,) into combined values.
+ * Used by both the ToCSSVisitor and AtRule eval.
+ */
+ function mergeRules(rules) {
+ if (!rules) {
+ return;
+ }
+
+ const groups = {};
+ const groupsArr = [];
+
+ for (let i = 0; i < rules.length; i++) {
+ const rule = rules[i];
+ if (rule.merge) {
+ const key = rule.name;
+ groups[key] ? rules.splice(i--, 1) :
+ groupsArr.push(groups[key] = []);
+ groups[key].push(rule);
+ }
+ }
+
+ groupsArr.forEach(group => {
+ if (group.length > 0) {
+ const result = group[0];
+ let space = [];
+ const comma = [new Expression(space)];
+ group.forEach(rule => {
+ if ((rule.merge === '+') && (space.length > 0)) {
+ comma.push(new Expression(space = []));
+ }
+ space.push(rule.value);
+ result.important = result.important || rule.important;
+ });
+ result.value = new Value(comma);
+ }
+ });
+ }
+
+ /* eslint-disable no-unused-vars */
+
+ class CSSVisitorUtils {
+ constructor(context) {
+ this._visitor = new Visitor(this);
+ this._context = context;
+ }
+
+ containsSilentNonBlockedChild(bodyRules) {
+ let rule;
+ if (!bodyRules) {
+ return false;
+ }
+ for (let r = 0; r < bodyRules.length; r++) {
+ rule = bodyRules[r];
+ if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {
+ // the atrule contains something that was referenced (likely by extend)
+ // therefore it needs to be shown in output too
+ return true;
+ }
+ }
+ return false;
+ }
+
+ keepOnlyVisibleChilds(owner) {
+ if (owner && owner.rules) {
+ owner.rules = owner.rules.filter(thing => thing.isVisible());
+ }
+ }
+
+ isEmpty(owner) {
+ return (owner && owner.rules)
+ ? (owner.rules.length === 0) : true;
+ }
+
+ hasVisibleSelector(rulesetNode) {
+ return (rulesetNode && rulesetNode.paths)
+ ? (rulesetNode.paths.length > 0) : false;
+ }
+
+ resolveVisibility(node) {
+ if (!node.blocksVisibility()) {
+ if (this.isEmpty(node)) {
+ return ;
+ }
+
+ return node;
+ }
+
+ const compiledRulesBody = node.rules[0];
+ this.keepOnlyVisibleChilds(compiledRulesBody);
+
+ if (this.isEmpty(compiledRulesBody)) {
+ return ;
+ }
+
+ node.ensureVisibility();
+ node.removeVisibilityBlock();
+
+ return node;
+ }
+
+ isVisibleRuleset(rulesetNode) {
+ if (rulesetNode.firstRoot) {
+ return true;
+ }
+
+ if (this.isEmpty(rulesetNode)) {
+ return false;
+ }
+
+ if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {
+ return false;
+ }
+
+ return true;
+ }
+ }
+
+ const ToCSSVisitor = function(context) {
+ this._visitor = new Visitor(this);
+ this._context = context;
+ this.utils = new CSSVisitorUtils(context);
+ };
+
+ ToCSSVisitor.prototype = {
+ isReplacing: true,
+ run: function (root) {
+ return this._visitor.visit(root);
+ },
+
+ visitDeclaration: function (declNode, visitArgs) {
+ if (declNode.blocksVisibility() || declNode.variable) {
+ return;
+ }
+ return declNode;
+ },
+
+ visitMixinDefinition: function (mixinNode, visitArgs) {
+ // mixin definitions do not get eval'd - this means they keep state
+ // so we have to clear that state here so it isn't used if toCSS is called twice
+ mixinNode.frames = [];
+ },
+
+ visitExtend: function (extendNode, visitArgs) {
+ },
+
+ visitComment: function (commentNode, visitArgs) {
+ if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {
+ return;
+ }
+ return commentNode;
+ },
+
+ visitMedia: function(mediaNode, visitArgs) {
+ const originalRules = mediaNode.rules[0].rules;
+ mediaNode.accept(this._visitor);
+ visitArgs.visitDeeper = false;
+
+ return this.utils.resolveVisibility(mediaNode, originalRules);
+ },
+
+ visitImport: function (importNode, visitArgs) {
+ if (importNode.blocksVisibility()) {
+ return ;
+ }
+ return importNode;
+ },
+
+ visitAtRule: function(atRuleNode, visitArgs) {
+ if (atRuleNode.rules && atRuleNode.rules.length) {
+ return this.visitAtRuleWithBody(atRuleNode, visitArgs);
+ } else {
+ return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);
+ }
+ },
+
+ visitAnonymous: function(anonymousNode, visitArgs) {
+ if (!anonymousNode.blocksVisibility()) {
+ anonymousNode.accept(this._visitor);
+ return anonymousNode;
+ }
+ },
+
+ visitAtRuleWithBody: function(atRuleNode, visitArgs) {
+ // if there is only one nested ruleset and that one has no path, then it is
+ // just fake ruleset
+ function hasFakeRuleset(atRuleNode) {
+ const bodyRules = atRuleNode.rules;
+ return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);
+ }
+ function getBodyRules(atRuleNode) {
+ const nodeRules = atRuleNode.rules;
+ if (hasFakeRuleset(atRuleNode)) {
+ return nodeRules[0].rules;
+ }
+
+ return nodeRules;
+ }
+ // it is still true that it is only one ruleset in array
+ // this is last such moment
+ // process childs
+ const originalRules = getBodyRules(atRuleNode);
+ atRuleNode.accept(this._visitor);
+ visitArgs.visitDeeper = false;
+
+ if (!this.utils.isEmpty(atRuleNode)) {
+ this._mergeRules(atRuleNode.rules[0].rules);
+ }
+
+ return this.utils.resolveVisibility(atRuleNode, originalRules);
+ },
+
+ visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {
+ if (atRuleNode.blocksVisibility()) {
+ return;
+ }
+
+ if (atRuleNode.name === '@charset') {
+ // Only output the debug info together with subsequent @charset definitions
+ // a comment (or @media statement) before the actual @charset atrule would
+ // be considered illegal css as it has to be on the first line
+ if (this.charset) {
+ if (atRuleNode.debugInfo) {
+ const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\n/g, '')} */\n`);
+ comment.debugInfo = atRuleNode.debugInfo;
+ return this._visitor.visit(comment);
}
- return fail("unmatched `".concat(String.fromCharCode(cc), "`"), currentChunkStartIndex);
- case 47: // /, check for comment
- if (parenLevel || (chunkerCurrentIndex == len - 1)) {
+ return;
+ }
+ this.charset = true;
+ }
+
+ return atRuleNode;
+ },
+
+ checkValidNodes: function(rules, isRoot) {
+ if (!rules) {
+ return;
+ }
+
+ for (let i = 0; i < rules.length; i++) {
+ const ruleNode = rules[i];
+ if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {
+ throw { message: 'Properties must be inside selector blocks. They cannot be in the root',
+ index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};
+ }
+ if (ruleNode instanceof tree.Call) {
+ throw { message: `Function '${ruleNode.name}' did not return a root node`,
+ index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};
+ }
+ if (ruleNode.type && !ruleNode.allowRoot) {
+ throw { message: `${ruleNode.type} node returned by a function is not valid here`,
+ index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};
+ }
+ }
+ },
+
+ visitRuleset: function (rulesetNode, visitArgs) {
+ // at this point rulesets are nested into each other
+ let rule;
+
+ const rulesets = [];
+
+ this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);
+
+ if (!rulesetNode.root) {
+ // remove invisible paths
+ this._compileRulesetPaths(rulesetNode);
+
+ // remove rulesets from this ruleset body and compile them separately
+ const nodeRules = rulesetNode.rules;
+
+ let nodeRuleCnt = nodeRules ? nodeRules.length : 0;
+ for (let i = 0; i < nodeRuleCnt; ) {
+ rule = nodeRules[i];
+ if (rule && rule.rules) {
+ // visit because we are moving them out from being a child
+ rulesets.push(this._visitor.visit(rule));
+ nodeRules.splice(i, 1);
+ nodeRuleCnt--;
continue;
}
- cc2 = input.charCodeAt(chunkerCurrentIndex + 1);
- if (cc2 == 47) {
- // //, find lnfeed
- for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {
- cc2 = input.charCodeAt(chunkerCurrentIndex);
- if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) {
- break;
- }
- }
- }
- else if (cc2 == 42) {
- // /*, find */
- lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;
- for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {
- cc2 = input.charCodeAt(chunkerCurrentIndex);
- if (cc2 == 125) {
- lastMultiCommentEndBrace = chunkerCurrentIndex;
- }
- if (cc2 != 42) {
- continue;
- }
- if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) {
- break;
+ i++;
+ }
+ // accept the visitor to remove rules and refactor itself
+ // then we can decide nogw whether we want it or not
+ // compile body
+ if (nodeRuleCnt > 0) {
+ rulesetNode.accept(this._visitor);
+ } else {
+ rulesetNode.rules = null;
+ }
+ visitArgs.visitDeeper = false;
+ } else { // if (! rulesetNode.root) {
+ rulesetNode.accept(this._visitor);
+ visitArgs.visitDeeper = false;
+ }
+
+ if (rulesetNode.rules) {
+ this._mergeRules(rulesetNode.rules);
+ this._removeDuplicateRules(rulesetNode.rules);
+ }
+
+ // now decide whether we keep the ruleset
+ if (this.utils.isVisibleRuleset(rulesetNode)) {
+ rulesetNode.ensureVisibility();
+ rulesets.splice(0, 0, rulesetNode);
+ }
+
+ if (rulesets.length === 1) {
+ return rulesets[0];
+ }
+ return rulesets;
+ },
+
+ _compileRulesetPaths: function(rulesetNode) {
+ if (rulesetNode.paths) {
+ rulesetNode.paths = rulesetNode.paths
+ .filter(p => {
+ let i;
+ if (p[0].elements[0].combinator.value === ' ') {
+ p[0].elements[0].combinator = new(tree.Combinator)('');
+ }
+ for (i = 0; i < p.length; i++) {
+ if (p[i].isVisible() && p[i].getIsOutput()) {
+ return true;
}
}
- if (chunkerCurrentIndex == len - 1) {
- return fail('missing closing `*/`', currentChunkStartIndex);
- }
- chunkerCurrentIndex++;
- }
- continue;
- case 42: // *, check for unmatched */
- if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {
- return fail('unmatched `/*`', chunkerCurrentIndex);
- }
- continue;
- }
- }
- if (level !== 0) {
- if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {
- return fail('missing closing `}` or `*/`', lastOpening);
+ return false;
+ });
}
- else {
- return fail('missing closing `}`', lastOpening);
+ },
+
+ _removeDuplicateRules: function(rules) {
+ if (!rules) { return; }
+
+ // remove duplicates
+ const ruleCache = {};
+
+ for (let i = rules.length - 1; i >= 0 ; i--) {
+ let rule = rules[i];
+ if (rule instanceof tree.Declaration) {
+ if (!Object.prototype.hasOwnProperty.call(ruleCache, rule.name)) {
+ ruleCache[rule.name] = rule;
+ } else {
+ let ruleList = ruleCache[rule.name];
+ if (!Array.isArray(ruleList)) {
+ const prevRuleCSS = ruleList.toCSS(this._context);
+ ruleList = ruleCache[rule.name] = [prevRuleCSS];
+ }
+ const ruleCSS = rule.toCSS(this._context);
+ if (ruleList.indexOf(ruleCSS) !== -1) {
+ rules.splice(i, 1);
+ } else {
+ ruleList.push(ruleCSS);
+ }
+ }
+ }
}
- }
- else if (parenLevel !== 0) {
- return fail('missing closing `)`', lastOpeningParen);
- }
- emitChunk(true);
- return chunks;
- }
+ },
+
+ _mergeRules: mergeRules
+ };
+
+ var visitors = {
+ Visitor,
+ ImportVisitor,
+ MarkVisibleSelectorsVisitor: SetTreeVisibilityVisitor,
+ ExtendVisitor: ProcessExtendsVisitor,
+ JoinSelectorVisitor,
+ ToCSSVisitor
+ };
+
+ var getParserInput = () => {
+ let // Less input string
+ input;
+
+ let // current chunk
+ j;
+
+ const // holds state for backtracking
+ saveStack = [];
+
+ let // furthest index the parser has gone to
+ furthest;
+
+ let // if this is furthest we got to, this is the probably cause
+ furthestPossibleErrorMessage;
+
+ let // chunkified input
+ chunks;
+
+ let // current chunk
+ current;
+
+ let // index of current chunk, in `input`
+ currentPos;
+
+ const parserInput = {};
+ const CHARCODE_SPACE = 32;
+ const CHARCODE_TAB = 9;
+ const CHARCODE_LF = 10;
+ const CHARCODE_CR = 13;
+ const CHARCODE_PLUS = 43;
+ const CHARCODE_COMMA = 44;
+ const CHARCODE_FORWARD_SLASH = 47;
+ const CHARCODE_9 = 57;
- var getParserInput = (function () {
- var // Less input string
- input;
- var // current chunk
- j;
- var // holds state for backtracking
- saveStack = [];
- var // furthest index the parser has gone to
- furthest;
- var // if this is furthest we got to, this is the probably cause
- furthestPossibleErrorMessage;
- var // chunkified input
- chunks;
- var // current chunk
- current;
- var // index of current chunk, in `input`
- currentPos;
- var parserInput = {};
- var CHARCODE_SPACE = 32;
- var CHARCODE_TAB = 9;
- var CHARCODE_LF = 10;
- var CHARCODE_CR = 13;
- var CHARCODE_PLUS = 43;
- var CHARCODE_COMMA = 44;
- var CHARCODE_FORWARD_SLASH = 47;
- var CHARCODE_9 = 57;
function skipWhitespace(length) {
- var oldi = parserInput.i;
- var oldj = j;
- var curr = parserInput.i - currentPos;
- var endIndex = parserInput.i + current.length - curr;
- var mem = (parserInput.i += length);
- var inp = input;
- var c;
- var nextChar;
- var comment;
+ const oldi = parserInput.i;
+ const oldj = j;
+ const curr = parserInput.i - currentPos;
+ const endIndex = parserInput.i + current.length - curr;
+ const mem = (parserInput.i += length);
+ const inp = input;
+ let c;
+ let nextChar;
+ let comment;
+
for (; parserInput.i < endIndex; parserInput.i++) {
c = inp.charCodeAt(parserInput.i);
+
if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {
nextChar = inp.charAt(parserInput.i + 1);
if (nextChar === '/') {
- comment = { index: parserInput.i, isLineComment: true };
- var nextNewLine = inp.indexOf('\n', parserInput.i + 2);
+ comment = {index: parserInput.i, isLineComment: true};
+ let nextNewLine = inp.indexOf('\n', parserInput.i + 2);
if (nextNewLine < 0) {
nextNewLine = endIndex;
}
parserInput.i = nextNewLine;
- comment.text = inp.substr(comment.index, parserInput.i - comment.index);
+ comment.text = inp.slice(comment.index, parserInput.i);
parserInput.commentStore.push(comment);
continue;
- }
- else if (nextChar === '*') {
- var nextStarSlash = inp.indexOf('*/', parserInput.i + 2);
+ } else if (nextChar === '*') {
+ const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);
if (nextStarSlash >= 0) {
comment = {
index: parserInput.i,
- text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),
+ text: inp.slice(parserInput.i, nextStarSlash + 2),
isLineComment: false
};
parserInput.i += comment.text.length - 1;
@@ -2939,12 +3596,15 @@
}
break;
}
+
if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {
break;
}
}
+
current = current.slice(length + parserInput.i - mem + curr);
currentPos = parserInput.i;
+
if (!current.length) {
if (j < chunks.length - 1) {
current = chunks[++j];
@@ -2953,92 +3613,107 @@
}
parserInput.finished = true;
}
+
return oldi !== parserInput.i || oldj !== j;
}
- parserInput.save = function () {
+
+ parserInput.save = () => {
currentPos = parserInput.i;
- saveStack.push({ current: current, i: parserInput.i, j: j });
+ saveStack.push( { current, i: parserInput.i, j });
};
- parserInput.restore = function (possibleErrorMessage) {
+ parserInput.restore = possibleErrorMessage => {
+
if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {
furthest = parserInput.i;
furthestPossibleErrorMessage = possibleErrorMessage;
}
- var state = saveStack.pop();
+ const state = saveStack.pop();
current = state.current;
currentPos = parserInput.i = state.i;
j = state.j;
};
- parserInput.forget = function () {
+ parserInput.forget = () => {
saveStack.pop();
};
- parserInput.isWhitespace = function (offset) {
- var pos = parserInput.i + (offset || 0);
- var code = input.charCodeAt(pos);
+ parserInput.isWhitespace = offset => {
+ const pos = parserInput.i + (offset || 0);
+ const code = input.charCodeAt(pos);
return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);
};
+
// Specialization of $(tok)
- parserInput.$re = function (tok) {
+ parserInput.$re = tok => {
if (parserInput.i > currentPos) {
current = current.slice(parserInput.i - currentPos);
currentPos = parserInput.i;
}
- var m = tok.exec(current);
+
+ const m = tok.exec(current);
if (!m) {
return null;
}
+
skipWhitespace(m[0].length);
if (typeof m === 'string') {
return m;
}
+
return m.length === 1 ? m[0] : m;
};
- parserInput.$char = function (tok) {
+
+ parserInput.$char = tok => {
if (input.charAt(parserInput.i) !== tok) {
return null;
}
skipWhitespace(1);
return tok;
};
- parserInput.$peekChar = function (tok) {
+
+ parserInput.$peekChar = tok => {
if (input.charAt(parserInput.i) !== tok) {
return null;
}
return tok;
};
- parserInput.$str = function (tok) {
- var tokLength = tok.length;
+
+ parserInput.$str = tok => {
+ const tokLength = tok.length;
+
// https://jsperf.com/string-startswith/21
- for (var i_1 = 0; i_1 < tokLength; i_1++) {
- if (input.charAt(parserInput.i + i_1) !== tok.charAt(i_1)) {
+ for (let i = 0; i < tokLength; i++) {
+ if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {
return null;
}
}
+
skipWhitespace(tokLength);
return tok;
};
- parserInput.$quoted = function (loc) {
- var pos = loc || parserInput.i;
- var startChar = input.charAt(pos);
+
+ parserInput.$quoted = loc => {
+ const pos = loc || parserInput.i;
+ const startChar = input.charAt(pos);
+
if (startChar !== '\'' && startChar !== '"') {
return;
}
- var length = input.length;
- var currentPosition = pos;
- for (var i_2 = 1; i_2 + currentPosition < length; i_2++) {
- var nextChar = input.charAt(i_2 + currentPosition);
+ const length = input.length;
+ const currentPosition = pos;
+
+ for (let i = 1; i + currentPosition < length; i++) {
+ const nextChar = input.charAt(i + currentPosition);
switch (nextChar) {
case '\\':
- i_2++;
+ i++;
continue;
case '\r':
case '\n':
break;
case startChar: {
- var str = input.substr(currentPosition, i_2 + 1);
+ const str = input.slice(currentPosition, currentPosition + i + 1);
if (!loc && loc !== 0) {
- skipWhitespace(i_2 + 1);
- return str;
+ skipWhitespace(i + 1);
+ return str
}
return [startChar, str];
}
@@ -3046,33 +3721,35 @@
}
return null;
};
+
/**
* Permissive parsing. Ignores everything except matching {} [] () and quotes
* until matching token (outside of blocks)
*/
- parserInput.$parseUntil = function (tok) {
- var quote = '';
- var returnVal = null;
- var inComment = false;
- var blockDepth = 0;
- var blockStack = [];
- var parseGroups = [];
- var length = input.length;
- var startPos = parserInput.i;
- var lastPos = parserInput.i;
- var i = parserInput.i;
- var loop = true;
- var testChar;
+ parserInput.$parseUntil = tok => {
+ let quote = '';
+ let returnVal = null;
+ let inComment = false;
+ let blockDepth = 0;
+ const blockStack = [];
+ const parseGroups = [];
+ const length = input.length;
+ const startPos = parserInput.i;
+ let lastPos = parserInput.i;
+ let i = parserInput.i;
+ let loop = true;
+ let testChar;
+
if (typeof tok === 'string') {
- testChar = function (char) { return char === tok; };
- }
- else {
- testChar = function (char) { return tok.test(char); };
+ testChar = char => char === tok;
+ } else {
+ testChar = char => tok.test(char);
}
+
do {
- var nextChar = input.charAt(i);
+ let nextChar = input.charAt(i);
if (blockDepth === 0 && testChar(nextChar)) {
- returnVal = input.substr(lastPos, i - lastPos);
+ returnVal = input.slice(lastPos, i);
if (returnVal) {
parseGroups.push(returnVal);
}
@@ -3082,8 +3759,7 @@
returnVal = parseGroups;
skipWhitespace(i - startPos);
loop = false;
- }
- else {
+ } else {
if (inComment) {
if (nextChar === '*' &&
input.charAt(i + 1) === '/') {
@@ -3098,7 +3774,7 @@
case '\\':
i++;
nextChar = input.charAt(i);
- parseGroups.push(input.substr(lastPos, i - lastPos + 1));
+ parseGroups.push(input.slice(lastPos, i + 1));
lastPos = i + 1;
break;
case '/':
@@ -3112,7 +3788,7 @@
case '"':
quote = parserInput.$quoted(i);
if (quote) {
- parseGroups.push(input.substr(lastPos, i - lastPos), quote);
+ parseGroups.push(input.slice(lastPos, i), quote);
i += quote[1].length - 1;
lastPos = i + 1;
}
@@ -3137,11 +3813,10 @@
case '}':
case ')':
case ']': {
- var expected = blockStack.pop();
+ const expected = blockStack.pop();
if (nextChar === expected) {
blockDepth--;
- }
- else {
+ } else {
// move the parser to the error and return expected
skipWhitespace(i - startPos);
returnVal = expected;
@@ -3155,145 +3830,150 @@
}
}
} while (loop);
+
return returnVal ? returnVal : null;
};
+
parserInput.autoCommentAbsorb = true;
parserInput.commentStore = [];
parserInput.finished = false;
+
// Same as $(), but don't change the state of the parser,
// just return the match.
- parserInput.peek = function (tok) {
+ parserInput.peek = tok => {
if (typeof tok === 'string') {
// https://jsperf.com/string-startswith/21
- for (var i_3 = 0; i_3 < tok.length; i_3++) {
- if (input.charAt(parserInput.i + i_3) !== tok.charAt(i_3)) {
+ for (let i = 0; i < tok.length; i++) {
+ if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {
return false;
}
}
return true;
- }
- else {
+ } else {
return tok.test(current);
}
};
+
// Specialization of peek()
// TODO remove or change some currentChar calls to peekChar
- parserInput.peekChar = function (tok) { return input.charAt(parserInput.i) === tok; };
- parserInput.currentChar = function () { return input.charAt(parserInput.i); };
- parserInput.prevChar = function () { return input.charAt(parserInput.i - 1); };
- parserInput.getInput = function () { return input; };
- parserInput.peekNotNumeric = function () {
- var c = input.charCodeAt(parserInput.i);
+ parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;
+
+ parserInput.currentChar = () => input.charAt(parserInput.i);
+
+ parserInput.prevChar = () => input.charAt(parserInput.i - 1);
+
+ parserInput.getInput = () => input;
+
+ parserInput.peekNotNumeric = () => {
+ const c = input.charCodeAt(parserInput.i);
// Is the first char of the dimension 0-9, '.', '+' or '-'
return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;
};
- parserInput.start = function (str, chunkInput, failFunction) {
+
+ parserInput.start = (str) => {
input = str;
parserInput.i = j = currentPos = furthest = 0;
- // chunking apparently makes things quicker (but my tests indicate
- // it might actually make things slower in node at least)
- // and it is a non-perfect parse - it can't recognise
- // unquoted urls, meaning it can't distinguish comments
- // meaning comments with quotes or {}() in them get 'counted'
- // and then lead to parse errors.
- // In addition if the chunking chunks in the wrong place we might
- // not be able to parse a parser statement in one go
- // this is officially deprecated but can be switched on via an option
- // in the case it causes too much performance issues.
- if (chunkInput) {
- chunks = chunker(str, failFunction);
- }
- else {
- chunks = [str];
- }
+
+ chunks = [str];
current = chunks[0];
+
skipWhitespace(0);
};
- parserInput.end = function () {
- var message;
- var isFinished = parserInput.i >= input.length;
+
+ parserInput.end = () => {
+ let message;
+ const isFinished = parserInput.i >= input.length;
+
if (parserInput.i < furthest) {
message = furthestPossibleErrorMessage;
parserInput.i = furthest;
}
return {
- isFinished: isFinished,
+ isFinished,
furthest: parserInput.i,
furthestPossibleErrorMessage: message,
furthestReachedEnd: parserInput.i >= input.length - 1,
furthestChar: input[parserInput.i]
};
};
+
return parserInput;
- });
+ };
- function makeRegistry(base) {
+ function makeRegistry( base ) {
return {
_data: {},
- add: function (name, func) {
+ add: function(name, func) {
// precautionary case conversion, as later querying of
// the registry by function-caller uses lower case as well.
name = name.toLowerCase();
+
// eslint-disable-next-line no-prototype-builtins
if (this._data.hasOwnProperty(name)) ;
this._data[name] = func;
},
- addMultiple: function (functions) {
- var _this = this;
- Object.keys(functions).forEach(function (name) {
- _this.add(name, functions[name]);
- });
+ addMultiple: function(functions) {
+ Object.keys(functions).forEach(
+ name => {
+ this.add(name, functions[name]);
+ });
},
- get: function (name) {
- return this._data[name] || (base && base.get(name));
+ get: function(name) {
+ return this._data[name] || ( base && base.get( name ));
},
- getLocalFunctions: function () {
+ getLocalFunctions: function() {
return this._data;
},
- inherit: function () {
- return makeRegistry(this);
+ inherit: function() {
+ return makeRegistry( this );
},
- create: function (base) {
+ create: function(base) {
return makeRegistry(base);
}
};
}
- var functionRegistry = makeRegistry(null);
- var MediaSyntaxOptions = {
+ var functionRegistry = makeRegistry( null );
+
+ const MediaSyntaxOptions = {
queryInParens: true
};
- var ContainerSyntaxOptions = {
+
+ const ContainerSyntaxOptions = {
queryInParens: true
};
- var Anonymous = function (value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {
- this.value = value;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.mapLines = mapLines;
- this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;
- this.allowRoot = true;
- this.copyVisibilityInfo(visibilityInfo);
- };
- Anonymous.prototype = Object.assign(new Node(), {
- type: 'Anonymous',
- eval: function () {
- return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());
- },
- compare: function (other) {
- return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;
- },
- isRulesetLike: function () {
- return this.rulesetLike;
- },
- genCSS: function (context, output) {
- this.nodeVisible = Boolean(this.value);
- if (this.nodeVisible) {
- output.add(this.value, this._fileInfo, this._index, this.mapLines);
+ /**
+ * Deprecation registry for Less.js
+ *
+ * Each deprecation has a unique ID and description.
+ * Repetition limiting caps warnings at 5 per deprecation type per parse.
+ * Use --quiet-deprecations to suppress all deprecation warnings.
+ */
+
+ const MAX_REPETITIONS = 5;
+
+ class DeprecationHandler {
+ constructor() {
+ this._counts = {};
+ }
+
+ shouldWarn(deprecationId) {
+ if (!deprecationId) { return true; }
+ const count = (this._counts[deprecationId] || 0) + 1;
+ this._counts[deprecationId] = count;
+ return count <= MAX_REPETITIONS;
+ }
+
+ summarize(logger) {
+ for (const id of Object.keys(this._counts)) {
+ const omitted = this._counts[id] - MAX_REPETITIONS;
+ if (omitted > 0) {
+ logger.warn(`${omitted} repetitive "${id}" deprecation warning(s) omitted.`);
+ }
}
}
- });
+ }
//
// less.js - parser
@@ -3327,58 +4007,79 @@
// a terminal string or regexp, or a non-terminal function to call.
// It also takes care of moving all the indices forwards.
//
- var Parser = function Parser(context, imports, fileInfo, currentIndex) {
+
+ const Parser = function Parser(context, imports, fileInfo, currentIndex) {
currentIndex = currentIndex || 0;
- var parsers;
- var parserInput = getParserInput();
+ let parsers;
+ const parserInput = getParserInput();
+
function error(msg, type) {
- throw new LessError({
- index: parserInput.i,
- filename: fileInfo.filename,
- type: type || 'Syntax',
- message: msg
- }, imports);
+ throw new LessError(
+ {
+ index: parserInput.i,
+ filename: fileInfo.filename,
+ type: type || 'Syntax',
+ message: msg
+ },
+ imports
+ );
}
+
+ const deprecationHandler = new DeprecationHandler();
+
/**
- *
* @param {string} msg
* @param {number} index
* @param {string} type
+ * @param {string} [deprecationId] - stable deprecation ID for repetition limiting
*/
- function warn(msg, index, type) {
- if (!context.quiet) {
- logger$1.warn((new LessError({
- index: index !== null && index !== void 0 ? index : parserInput.i,
- filename: fileInfo.filename,
- type: type ? "".concat(type.toUpperCase(), " WARNING") : 'WARNING',
- message: msg
- }, imports)).toString());
- }
+ function warn(msg, index, type, deprecationId) {
+ if (context.quiet) { return; }
+ if (deprecationId && context.quietDeprecations) { return; }
+ if (deprecationId && !deprecationHandler.shouldWarn(deprecationId)) { return; }
+
+ logger$1.warn(
+ (new LessError(
+ {
+ index: index ?? parserInput.i,
+ filename: fileInfo.filename,
+ type: type ? `${type.toUpperCase()} WARNING` : 'WARNING',
+ message: msg
+ },
+ imports
+ )).toString()
+ );
}
+
function expect(arg, msg) {
// some older browsers return typeof 'function' for RegExp
- var result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);
+ const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);
if (result) {
return result;
}
+
error(msg || (typeof arg === 'string'
- ? "expected '".concat(arg, "' got '").concat(parserInput.currentChar(), "'")
+ ? `expected '${arg}' got '${parserInput.currentChar()}'`
: 'unexpected token'));
}
+
// Specialization of expect()
function expectChar(arg, msg) {
if (parserInput.$char(arg)) {
return arg;
}
- error(msg || "expected '".concat(arg, "' got '").concat(parserInput.currentChar(), "'"));
+ error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);
}
+
function getDebugInfo(index) {
- var filename = fileInfo.filename;
+ const filename = fileInfo.filename;
+
return {
lineNumber: getLocation(index, parserInput.getInput()).line + 1,
fileName: filename
};
}
+
/**
* Used after initial parsing to create nodes on the fly
*
@@ -3388,43 +4089,40 @@
* @param {Object} fileInfo - fileInfo to attach to created nodes
*/
function parseNode(str, parseList, callback) {
- var result;
- var returnNodes = [];
- var parser = parserInput;
+ let result;
+ const returnNodes = [];
+ const parser = parserInput;
+
try {
- parser.start(str, false, function fail(msg, index) {
- callback({
- message: msg,
- index: index + currentIndex
- });
- });
- for (var x = 0, p = void 0; (p = parseList[x]); x++) {
+ parser.start(str);
+ for (let x = 0, p; (p = parseList[x]); x++) {
result = parsers[p]();
returnNodes.push(result || null);
}
- var endInfo = parser.end();
+
+ const endInfo = parser.end();
if (endInfo.isFinished) {
callback(null, returnNodes);
}
else {
callback(true, null);
}
- }
- catch (e) {
+ } catch (e) {
throw new LessError({
index: e.index + currentIndex,
message: e.message
}, imports, fileInfo.filename);
}
}
+
//
// The Parser
//
return {
- parserInput: parserInput,
- imports: imports,
- fileInfo: fileInfo,
- parseNode: parseNode,
+ parserInput,
+ imports,
+ fileInfo,
+ parseNode,
//
// Parse an input string into an abstract syntax tree,
// @param str A string containing 'less' markup
@@ -3432,62 +4130,63 @@
// @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply
//
parse: function (str, callback, additionalData) {
- var root;
- var err = null;
- var globalVars;
- var modifyVars;
- var ignored;
- var preText = '';
+ let root;
+ let err = null;
+ let globalVars;
+ let modifyVars;
+ let ignored;
+ let preText = '';
+
// Optionally disable @plugin parsing
if (additionalData && additionalData.disablePluginRule) {
- parsers.plugin = function () {
+ parsers.plugin = function() {
var dir = parserInput.$re(/^@plugin?\s+/);
if (dir) {
error('@plugin statements are not allowed when disablePluginRule is set to true');
}
};
}
- globalVars = (additionalData && additionalData.globalVars) ? "".concat(Parser.serializeVars(additionalData.globalVars), "\n") : '';
- modifyVars = (additionalData && additionalData.modifyVars) ? "\n".concat(Parser.serializeVars(additionalData.modifyVars)) : '';
+
+ globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\n` : '';
+ modifyVars = (additionalData && additionalData.modifyVars) ? `\n${Parser.serializeVars(additionalData.modifyVars)}` : '';
+
if (context.pluginManager) {
- var preProcessors = context.pluginManager.getPreProcessors();
- for (var i_1 = 0; i_1 < preProcessors.length; i_1++) {
- str = preProcessors[i_1].process(str, { context: context, imports: imports, fileInfo: fileInfo });
+ const preProcessors = context.pluginManager.getPreProcessors();
+ for (let i = 0; i < preProcessors.length; i++) {
+ str = preProcessors[i].process(str, { context, imports, fileInfo });
}
}
+
if (globalVars || (additionalData && additionalData.banner)) {
preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;
ignored = imports.contentsIgnoredChars;
ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;
ignored[fileInfo.filename] += preText.length;
}
+
str = str.replace(/\r\n?/g, '\n');
// Remove potential UTF Byte Order Mark
str = preText + str.replace(/^\uFEFF/, '') + modifyVars;
imports.contents[fileInfo.filename] = str;
+
// Start with the primary rule.
// The whole syntax tree is held under a Ruleset node,
// with the `root` property set to true, so no `{}` are
// output. The callback is called when the input is parsed.
try {
- parserInput.start(str, context.chunkInput, function fail(msg, index) {
- throw new LessError({
- index: index,
- type: 'Parse',
- message: msg,
- filename: fileInfo.filename
- }, imports);
- });
+ parserInput.start(str);
+
tree.Node.prototype.parse = this;
root = new tree.Ruleset(null, this.parsers.primary());
tree.Node.prototype.rootNode = root;
root.root = true;
root.firstRoot = true;
root.functionRegistry = functionRegistry.inherit();
- }
- catch (e) {
+
+ } catch (e) {
return callback(new LessError(e, imports, fileInfo.filename));
}
+
// If `i` is smaller than the `input.length - 1`,
// it means the parser wasn't able to parse the whole
// string, so we've got a parsing error.
@@ -3496,48 +4195,53 @@
// showing the line where the parse error occurred.
// We split it up into two parts (the part which parsed,
// and the part which didn't), so we can color them differently.
- var endInfo = parserInput.end();
+ const endInfo = parserInput.end();
if (!endInfo.isFinished) {
- var message = endInfo.furthestPossibleErrorMessage;
+
+ let message = endInfo.furthestPossibleErrorMessage;
+
if (!message) {
message = 'Unrecognised input';
if (endInfo.furthestChar === '}') {
message += '. Possibly missing opening \'{\'';
- }
- else if (endInfo.furthestChar === ')') {
+ } else if (endInfo.furthestChar === ')') {
message += '. Possibly missing opening \'(\'';
- }
- else if (endInfo.furthestReachedEnd) {
+ } else if (endInfo.furthestReachedEnd) {
message += '. Possibly missing something';
}
}
+
err = new LessError({
type: 'Parse',
- message: message,
+ message,
index: endInfo.furthest,
filename: fileInfo.filename
}, imports);
}
- var finish = function (e) {
+
+ const finish = e => {
e = err || e || imports.error;
+
if (e) {
if (!(e instanceof LessError)) {
e = new LessError(e, imports, fileInfo.filename);
}
+
return callback(e);
}
else {
return callback(null, root);
}
};
+
if (context.processImports !== false) {
new visitors.ImportVisitor(imports, finish)
.run(root);
- }
- else {
+ } else {
return finish();
}
},
+
//
// Here in, the parsing rules/functions
//
@@ -3584,15 +4288,14 @@
// block rule: at the root level.
//
primary: function () {
- var mixin = this.mixin;
- var root = [];
- var node;
+ const mixin = this.mixin;
+ let root = [];
+ let node;
+
while (true) {
while (true) {
node = this.comment();
- if (!node) {
- break;
- }
+ if (!node) { break; }
root.push(node);
}
// always process comments before deciding if finished
@@ -3602,18 +4305,19 @@
if (parserInput.peek('}')) {
break;
}
+
node = this.extendRule();
if (node) {
root = root.concat(node);
continue;
}
+
node = mixin.definition() || this.declaration() || mixin.call(false, false) ||
this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();
if (node) {
root.push(node);
- }
- else {
- var foundSemiColon = false;
+ } else {
+ let foundSemiColon = false;
while (parserInput.$char(';')) {
foundSemiColon = true;
}
@@ -3622,21 +4326,24 @@
}
}
}
+
return root;
},
+
// comments are collected by the main parsing mechanism and then assigned to nodes
// where the current structure allows it
comment: function () {
if (parserInput.commentStore.length) {
- var comment = parserInput.commentStore.shift();
- return new (tree.Comment)(comment.text, comment.isLineComment, comment.index + currentIndex, fileInfo);
+ const comment = parserInput.commentStore.shift();
+ return new(tree.Comment)(comment.text, comment.isLineComment, comment.index + currentIndex, fileInfo);
}
},
+
//
// Entities are tokens which can be found inside an Expression
//
entities: {
- mixinLookup: function () {
+ mixinLookup: function() {
return parsers.mixin.call(true, true);
},
//
@@ -3645,36 +4352,40 @@
// "milky way" 'he\'s the one!'
//
quoted: function (forceEscaped) {
- var str;
- var index = parserInput.i;
- var isEscaped = false;
+ let str;
+ const index = parserInput.i;
+ let isEscaped = false;
+
parserInput.save();
if (parserInput.$char('~')) {
isEscaped = true;
- }
- else if (forceEscaped) {
+ } else if (forceEscaped) {
parserInput.restore();
return;
}
+
str = parserInput.$quoted();
if (!str) {
parserInput.restore();
return;
}
parserInput.forget();
- return new (tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index + currentIndex, fileInfo);
+
+ return new(tree.Quoted)(str.charAt(0), str.slice(1, -1), isEscaped, index + currentIndex, fileInfo);
},
+
//
// A catch-all word, such as:
//
// black border-collapse
//
keyword: function () {
- var k = parserInput.$char('%') || parserInput.$re(/^\[?(?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\]?/);
+ const k = parserInput.$char('%') || parserInput.$re(/^\[?(?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\]?/);
if (k) {
- return tree.Color.fromKeyword(k) || new (tree.Keyword)(k);
+ return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);
}
},
+
//
// A function call
//
@@ -3683,20 +4394,24 @@
// The arguments are parsed with the `entities.arguments` parser.
//
call: function () {
- var name;
- var args;
- var func;
- var index = parserInput.i;
+ let name;
+ let args;
+ let func;
+ const index = parserInput.i;
+
// http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18
if (parserInput.peek(/^url\(/i)) {
return;
}
+
parserInput.save();
+
name = parserInput.$re(/^([\w-]+|%|~|progid:[\w.]+)\(/);
if (!name) {
parserInput.forget();
return;
}
+
name = name[1];
func = this.customFuncCall(name);
if (func) {
@@ -3706,40 +4421,61 @@
return args;
}
}
+
args = this.arguments(args);
+
if (!parserInput.$char(')')) {
parserInput.restore('Could not parse call arguments or missing \')\'');
return;
}
+
parserInput.forget();
- return new (tree.Call)(name, args, index + currentIndex, fileInfo);
+
+ return new(tree.Call)(name, args, index + currentIndex, fileInfo);
},
+
declarationCall: function () {
- var validCall;
- var args;
- var index = parserInput.i;
+ let validCall;
+ let args;
+ const index = parserInput.i;
+
parserInput.save();
+
validCall = parserInput.$re(/^[\w]+\(/);
if (!validCall) {
parserInput.forget();
return;
}
+
validCall = validCall.substring(0, validCall.length - 1);
- var rule = this.ruleProperty();
- var value;
+
+ // CSS at-rule keywords should never be parsed as declaration calls
+ if (/^(and|or|not|only|layer)$/i.test(validCall)) {
+ parserInput.restore();
+ return;
+ }
+
+ let rule = this.ruleProperty();
+ let value;
+
if (rule) {
value = this.value();
}
+
if (rule && value) {
args = [new (tree.Declaration)(rule, value, null, null, parserInput.i + currentIndex, fileInfo, true)];
}
+
if (!parserInput.$char(')')) {
parserInput.restore('Could not parse call arguments or missing \')\'');
return;
}
+
parserInput.forget();
- return new (tree.Call)(validCall, args, index + currentIndex, fileInfo);
+
+ return new(tree.Call)(validCall, args, index + currentIndex, fileInfo);
},
+
//
// Parsing rules for functions with non-standard args, e.g.:
//
@@ -3748,49 +4484,58 @@
// This is a quick prototype, to be modified/improved when
// more custom-parsed funcs come (e.g. `selector(...)`)
//
+
customFuncCall: function (name) {
/* Ideally the table is to be moved out of here for faster perf.,
but it's quite tricky since it relies on all these `parsers`
and `expect` available only here */
return {
- alpha: f(parsers.ieAlpha, true),
+ alpha: f(parsers.ieAlpha, true),
boolean: f(condition),
- 'if': f(condition)
+ 'if': f(condition)
}[name.toLowerCase()];
+
function f(parse, stop) {
return {
- parse: parse,
- stop: stop // when true - stop after parse() and return its result,
+ parse, // parsing function
+ stop // when true - stop after parse() and return its result,
// otherwise continue for plain args
};
}
+
function condition() {
return [expect(parsers.condition, 'expected condition')];
}
},
+
arguments: function (prevArgs) {
- var argsComma = prevArgs || [];
- var argsSemiColon = [];
- var isSemiColonSeparated;
- var value;
+ let argsComma = prevArgs || [];
+ const argsSemiColon = [];
+ let isSemiColonSeparated;
+ let value;
+
parserInput.save();
+
while (true) {
if (prevArgs) {
prevArgs = false;
- }
- else {
+ } else {
value = parsers.detachedRuleset() || this.assignment() || parsers.expression();
if (!value) {
break;
}
+
if (value.value && value.value.length == 1) {
value = value.value[0];
}
+
argsComma.push(value);
}
+
if (parserInput.$char(',')) {
continue;
}
+
if (parserInput.$char(';') || isSemiColonSeparated) {
isSemiColonSeparated = true;
value = (argsComma.length < 1) ? argsComma[0]
@@ -3799,23 +4544,26 @@
argsComma = [];
}
}
+
parserInput.forget();
return isSemiColonSeparated ? argsSemiColon : argsComma;
},
literal: function () {
return this.dimension() ||
- this.color() ||
- this.quoted() ||
- this.unicodeDescriptor();
+ this.color() ||
+ this.quoted() ||
+ this.unicodeDescriptor();
},
+
// Assignments are argument entities for calls.
// They are present in ie filter properties as shown below.
//
// filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )
//
+
assignment: function () {
- var key;
- var value;
+ let key;
+ let value;
parserInput.save();
key = parserInput.$re(/^\w+(?=\s?=)/i);
if (!key) {
@@ -3829,12 +4577,12 @@
value = parsers.entity();
if (value) {
parserInput.forget();
- return new (tree.Assignment)(key, value);
- }
- else {
+ return new(tree.Assignment)(key, value);
+ } else {
parserInput.restore();
}
},
+
//
// Parse url() tokens
//
@@ -3843,22 +4591,29 @@
// to be enclosed within a string, so it can't be parsed as an Expression.
//
url: function () {
- var value;
- var index = parserInput.i;
+ let value;
+ const index = parserInput.i;
+
parserInput.autoCommentAbsorb = false;
+
if (!parserInput.$str('url(')) {
parserInput.autoCommentAbsorb = true;
return;
}
+
value = this.quoted() || this.variable() || this.property() ||
- parserInput.$re(/^(?:(?:\\[()'"])|[^()'"])+/) || '';
+ parserInput.$re(/^(?:(?:\\[()'"])|[^()'"])+/) || '';
+
parserInput.autoCommentAbsorb = true;
+
expectChar(')');
- return new (tree.URL)((value.value !== undefined ||
+
+ return new(tree.URL)((value.value !== undefined ||
value instanceof tree.Variable ||
value instanceof tree.Property) ?
- value : new (tree.Anonymous)(value, index), index + currentIndex, fileInfo);
+ value : new(tree.Anonymous)(value, index), index + currentIndex, fileInfo);
},
+
//
// A Variable entity, such as `@fink`, in
//
@@ -3868,31 +4623,35 @@
// see `parsers.variable`.
//
variable: function () {
- var ch;
- var name;
- var index = parserInput.i;
+ let ch;
+ let name;
+ const index = parserInput.i;
+
parserInput.save();
if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\w-]+/))) {
ch = parserInput.currentChar();
- if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\s/)) {
+ if ((ch === '(' && !parserInput.prevChar().match(/^\s/))
+ || (ch === '[' && !parserInput.prevChar().match(/^\s/))) {
// this may be a VariableCall lookup
- var result = parsers.variableCall(name);
+ const result = parsers.variableCall(name);
if (result) {
parserInput.forget();
return result;
}
}
parserInput.forget();
- return new (tree.Variable)(name, index + currentIndex, fileInfo);
+ return new(tree.Variable)(name, index + currentIndex, fileInfo);
}
parserInput.restore();
},
+
// A variable entity using the protective {} e.g. @{var}
variableCurly: function () {
- var curly;
- var index = parserInput.i;
+ let curly;
+ const index = parserInput.i;
+
if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\{([\w-]+)\}/))) {
- return new (tree.Variable)("@".concat(curly[1]), index + currentIndex, fileInfo);
+ return new(tree.Variable)(`@${curly[1]}`, index + currentIndex, fileInfo);
}
},
//
@@ -3901,20 +4660,14 @@
// background-color: $color
//
property: function () {
- var name;
- var index = parserInput.i;
+ let name;
+ const index = parserInput.i;
+
if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\$[\w-]+/))) {
- return new (tree.Property)(name, index + currentIndex, fileInfo);
- }
- },
- // A property entity useing the protective {} e.g. ${prop}
- propertyCurly: function () {
- var curly;
- var index = parserInput.i;
- if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\$\{([\w-]+)\}/))) {
- return new (tree.Property)("$".concat(curly[1]), index + currentIndex, fileInfo);
+ return new(tree.Property)(name, index + currentIndex, fileInfo);
}
},
+
//
// A Hexadecimal color
//
@@ -3923,33 +4676,36 @@
// `rgb` and `hsl` colors are parsed through the `entities.call` parser.
//
color: function () {
- var rgb;
+ let rgb;
parserInput.save();
+
if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\w.#[])?/))) {
if (!rgb[2]) {
parserInput.forget();
- return new (tree.Color)(rgb[1], undefined, rgb[0]);
+ return new(tree.Color)(rgb[1], undefined, rgb[0]);
}
}
parserInput.restore();
},
+
colorKeyword: function () {
parserInput.save();
- var autoCommentAbsorb = parserInput.autoCommentAbsorb;
+ const autoCommentAbsorb = parserInput.autoCommentAbsorb;
parserInput.autoCommentAbsorb = false;
- var k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);
+ const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);
parserInput.autoCommentAbsorb = autoCommentAbsorb;
if (!k) {
parserInput.forget();
return;
}
parserInput.restore();
- var color = tree.Color.fromKeyword(k);
+ const color = tree.Color.fromKeyword(k);
if (color) {
parserInput.$str(k);
return color;
}
},
+
//
// A Dimension, that is, a number and a unit
//
@@ -3959,57 +4715,67 @@
if (parserInput.peekNotNumeric()) {
return;
}
- var value = parserInput.$re(/^([+-]?\d*\.?\d+)(%|[a-z_]+)?/i);
+
+ const value = parserInput.$re(/^([+-]?\d*\.?\d+)(%|[a-z_]+)?/i);
if (value) {
- return new (tree.Dimension)(value[1], value[2]);
+ return new(tree.Dimension)(value[1], value[2]);
}
},
+
//
// A unicode descriptor, as is used in unicode-range
//
// U+0?? or U+00A1-00A9
//
unicodeDescriptor: function () {
- var ud;
+ let ud;
+
ud = parserInput.$re(/^U\+[0-9a-fA-F?]+(-[0-9a-fA-F?]+)?/);
if (ud) {
- return new (tree.UnicodeDescriptor)(ud[0]);
+ return new(tree.UnicodeDescriptor)(ud[0]);
}
},
+
//
// JavaScript code to be evaluated
//
// `window.location.href`
//
javascript: function () {
- var js;
- var index = parserInput.i;
+ let js;
+ const index = parserInput.i;
+
parserInput.save();
- var escape = parserInput.$char('~');
- var jsQuote = parserInput.$char('`');
+
+ const escape = parserInput.$char('~');
+ const jsQuote = parserInput.$char('`');
+
if (!jsQuote) {
parserInput.restore();
return;
}
+
js = parserInput.$re(/^[^`]*`/);
if (js) {
+ warn('Inline JavaScript evaluation (backtick expressions) is deprecated and will be removed in Less 5.x. Use Less functions or custom plugins instead.', index, 'DEPRECATED', 'js-eval');
parserInput.forget();
- return new (tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index + currentIndex, fileInfo);
+ return new(tree.JavaScript)(js.slice(0, -1), Boolean(escape), index + currentIndex, fileInfo);
}
parserInput.restore('invalid javascript definition');
}
},
+
//
// The variable part of a variable definition. Used in the `rule` parser
//
// @fink:
//
variable: function () {
- var name;
- if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\w-]+)\s*:/))) {
- return name[1];
- }
+ let name;
+
+ if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\w-]+)\s*:/))) { return name[1]; }
},
+
//
// Call a variable value to retrieve a detached ruleset
// or a value from a detached ruleset's rules.
@@ -4019,22 +4785,28 @@
// color: @fink[@color];
//
variableCall: function (parsedName) {
- var lookups;
- var i = parserInput.i;
- var inValue = !!parsedName;
- var name = parsedName;
+ let lookups;
+ const i = parserInput.i;
+ const inValue = !!parsedName;
+ let name = parsedName;
+
parserInput.save();
+
if (name || (parserInput.currentChar() === '@'
&& (name = parserInput.$re(/^(@[\w-]+)(\(\s*\))?/)))) {
+
lookups = this.mixin.ruleLookups();
+
if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {
parserInput.restore('Missing \'[...]\' lookup in variable call');
return;
}
+
if (!inValue) {
name = name[1];
}
- var call = new tree.VariableCall(name, i, fileInfo);
+
+ const call = new tree.VariableCall(name, i, fileInfo);
if (!inValue && parsers.end()) {
parserInput.forget();
return call;
@@ -4044,27 +4816,32 @@
return new tree.NamespaceValue(call, lookups, i, fileInfo);
}
}
+
parserInput.restore();
},
+
//
// extend syntax - used to extend selectors
//
- extend: function (isRule) {
- var elements;
- var e;
- var index = parserInput.i;
- var option;
- var extendList;
- var extend;
+ extend: function(isRule) {
+ let elements;
+ let e;
+ const index = parserInput.i;
+ let option;
+ let extendList;
+ let extend;
+
if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {
return;
}
+
do {
option = null;
elements = null;
- var first = true;
+ let first = true;
while (!(option = parserInput.$re(/^(!?all)(?=\s*(\)|,))/))) {
e = this.element();
+
if (!e) {
break;
}
@@ -4075,38 +4852,43 @@
if (!first && e.combinator.value) {
warn('Targeting complex selectors can have unexpected behavior, and this behavior may change in the future.', index);
}
+
first = false;
if (elements) {
elements.push(e);
- }
- else {
- elements = [e];
+ } else {
+ elements = [ e ];
}
}
+
option = option && option[1];
if (!elements) {
error('Missing target selector for :extend().');
}
- extend = new (tree.Extend)(new (tree.Selector)(elements), option, index + currentIndex, fileInfo);
+ extend = new(tree.Extend)(new(tree.Selector)(elements), option, index + currentIndex, fileInfo);
if (extendList) {
extendList.push(extend);
- }
- else {
- extendList = [extend];
+ } else {
+ extendList = [ extend ];
}
} while (parserInput.$char(','));
+
expect(/^\)/);
+
if (isRule) {
expect(/^;/);
}
+
return extendList;
},
+
//
// extendRule - used in a rule to extend all the parent selectors
//
- extendRule: function () {
+ extendRule: function() {
return this.extend(true);
},
+
//
// Mixins
//
@@ -4128,31 +4910,34 @@
// selector for now.
//
call: function (inValue, getLookup) {
- var s = parserInput.currentChar();
- var important = false;
- var lookups;
- var index = parserInput.i;
- var elements;
- var args;
- var hasParens;
- var parensIndex;
- var parensWS = false;
- if (s !== '.' && s !== '#') {
- return;
- }
+ const s = parserInput.currentChar();
+ let important = false;
+ let lookups;
+ const index = parserInput.i;
+ let elements;
+ let args;
+ let hasParens;
+ let parensIndex;
+ let parensWS = false;
+
+ if (s !== '.' && s !== '#') { return; }
+
parserInput.save(); // stop us absorbing part of an invalid selector
+
elements = this.elements();
+
if (elements) {
parensIndex = parserInput.i;
- if (parserInput.$char('(')) {
- parensWS = parserInput.isWhitespace(-2);
+ parensWS = parserInput.isWhitespace(-1);
+ if (parserInput.$char('(')) {
args = this.args(true).args;
expectChar(')');
hasParens = true;
if (parensWS) {
- warn('Whitespace between a mixin name and parentheses for a mixin call is deprecated', parensIndex, 'DEPRECATED');
+ warn('Whitespace between a mixin name and parentheses for a mixin call is deprecated', parensIndex, 'DEPRECATED', 'mixin-call-whitespace');
}
}
+
if (getLookup !== false) {
lookups = this.ruleLookups();
}
@@ -4160,78 +4945,83 @@
parserInput.restore();
return;
}
+
if (inValue && !lookups && !hasParens) {
// This isn't a valid in-value mixin call
parserInput.restore();
return;
}
+
if (!inValue && parsers.important()) {
important = true;
}
+
if (inValue || parsers.end()) {
parserInput.forget();
- var mixin = new (tree.mixin.Call)(elements, args, index + currentIndex, fileInfo, !lookups && important);
+ const mixin = new(tree.mixin.Call)(elements, args, index + currentIndex, fileInfo, !lookups && important);
if (lookups) {
return new tree.NamespaceValue(mixin, lookups);
}
else {
if (!hasParens) {
- warn('Calling a mixin without parentheses is deprecated', parensIndex, 'DEPRECATED');
+ warn('Calling a mixin without parentheses is deprecated', parensIndex, 'DEPRECATED', 'mixin-call-no-parens');
}
return mixin;
}
}
}
+
parserInput.restore();
},
/**
* Matching elements for mixins
* (Start with . or # and can have > )
*/
- elements: function () {
- var elements;
- var e;
- var c;
- var elem;
- var elemIndex;
- var re = /^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;
+ elements: function() {
+ let elements;
+ let e;
+ let c;
+ let elem;
+ let elemIndex;
+ const re = /^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;
while (true) {
elemIndex = parserInput.i;
e = parserInput.$re(re);
+
if (!e) {
break;
}
- elem = new (tree.Element)(c, e, false, elemIndex + currentIndex, fileInfo);
+ elem = new(tree.Element)(c, e, false, elemIndex + currentIndex, fileInfo);
if (elements) {
elements.push(elem);
- }
- else {
- elements = [elem];
+ } else {
+ elements = [ elem ];
}
c = parserInput.$char('>');
}
return elements;
},
args: function (isCall) {
- var entities = parsers.entities;
- var returner = { args: null, variadic: false };
- var expressions = [];
- var argsSemiColon = [];
- var argsComma = [];
- var isSemiColonSeparated;
- var expressionContainsNamed;
- var name;
- var nameLoop;
- var value;
- var arg;
- var expand;
- var hasSep = true;
+ const entities = parsers.entities;
+ const returner = { args:null, variadic: false };
+ let expressions = [];
+ const argsSemiColon = [];
+ const argsComma = [];
+ let isSemiColonSeparated;
+ let expressionContainsNamed;
+ let name;
+ let nameLoop;
+ let value;
+ let arg;
+ let expand;
+ let hasSep = true;
+
parserInput.save();
+
while (true) {
if (isCall) {
arg = parsers.detachedRuleset() || parsers.expression();
- }
- else {
+ } else {
parserInput.commentStore.length = 0;
if (parserInput.$str('...')) {
returner.variadic = true;
@@ -4244,24 +5034,27 @@
}
arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);
}
+
if (!arg || !hasSep) {
break;
}
+
nameLoop = null;
if (arg.throwAwayComments) {
arg.throwAwayComments();
}
value = arg;
- var val = null;
+ let val = null;
+
if (isCall) {
// Variable
if (arg.value && arg.value.length == 1) {
val = arg.value[0];
}
- }
- else {
+ } else {
val = arg;
}
+
if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {
if (parserInput.$char(':')) {
if (expressions.length > 0) {
@@ -4270,20 +5063,20 @@
}
expressionContainsNamed = true;
}
+
value = parsers.detachedRuleset() || parsers.expression();
+
if (!value) {
if (isCall) {
error('could not understand value for named argument');
- }
- else {
+ } else {
parserInput.restore();
returner.args = [];
return returner;
}
}
nameLoop = (name = val.name);
- }
- else if (parserInput.$str('...')) {
+ } else if (parserInput.$str('...')) {
if (!isCall) {
returner.variadic = true;
if (parserInput.$char(';') && !isSemiColonSeparated) {
@@ -4292,39 +5085,46 @@
(isSemiColonSeparated ? argsSemiColon : argsComma)
.push({ name: arg.name, variadic: true });
break;
- }
- else {
+ } else {
expand = true;
}
- }
- else if (!isCall) {
+ } else if (!isCall) {
name = nameLoop = val.name;
value = null;
}
}
+
if (value) {
expressions.push(value);
}
- argsComma.push({ name: nameLoop, value: value, expand: expand });
+
+ argsComma.push({ name:nameLoop, value, expand });
+
if (parserInput.$char(',')) {
hasSep = true;
continue;
}
hasSep = parserInput.$char(';') === ';';
+
if (hasSep || isSemiColonSeparated) {
+
if (expressionContainsNamed) {
error('Cannot mix ; and , as delimiter types');
}
+
isSemiColonSeparated = true;
+
if (expressions.length > 1) {
- value = new (tree.Value)(expressions);
+ value = new(tree.Value)(expressions);
}
- argsSemiColon.push({ name: name, value: value, expand: expand });
+ argsSemiColon.push({ name, value, expand });
+
name = null;
expressions = [];
expressionContainsNamed = false;
}
}
+
parserInput.forget();
returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;
return returner;
@@ -4349,23 +5149,27 @@
// the `{...}` block.
//
definition: function () {
- var name;
- var params = [];
- var match;
- var ruleset;
- var cond;
- var variadic = false;
+ let name;
+ let params = [];
+ let match;
+ let ruleset;
+ let cond;
+ let variadic = false;
if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||
parserInput.peek(/^[^{]*\}/)) {
return;
}
+
parserInput.save();
+
match = parserInput.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/);
if (match) {
name = match[1];
- var argInfo = this.args(false);
+
+ const argInfo = this.args(false);
params = argInfo.args;
variadic = argInfo.variadic;
+
// .mixincall("@{a}");
// looks a bit like a mixin definition..
// also
@@ -4375,29 +5179,34 @@
parserInput.restore('Missing closing \')\'');
return;
}
+
parserInput.commentStore.length = 0;
+
if (parserInput.$str('when')) { // Guard
cond = expect(parsers.conditions, 'expected condition');
}
+
ruleset = parsers.block();
+
if (ruleset) {
parserInput.forget();
- return new (tree.mixin.Definition)(name, params, ruleset, cond, variadic);
- }
- else {
+ return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);
+ } else {
parserInput.restore();
}
- }
- else {
+ } else {
parserInput.restore();
}
},
- ruleLookups: function () {
- var rule;
- var lookups = [];
+
+ ruleLookups: function() {
+ let rule;
+ const lookups = [];
+
if (parserInput.currentChar() !== '[') {
return;
}
+
while (true) {
parserInput.save();
rule = this.lookupValue();
@@ -4412,21 +5221,27 @@
return lookups;
}
},
- lookupValue: function () {
+
+ lookupValue: function() {
parserInput.save();
+
if (!parserInput.$char('[')) {
parserInput.restore();
return;
}
- var name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);
+
+ const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);
+
if (!parserInput.$char(']')) {
parserInput.restore();
return;
}
+
if (name || name === '') {
parserInput.forget();
return name;
}
+
parserInput.restore();
}
},
@@ -4435,11 +5250,13 @@
// and can be found inside a rule's value.
//
entity: function () {
- var entities = this.entities;
+ const entities = this.entities;
+
return this.comment() || entities.literal() || entities.variable() || entities.url() ||
entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||
entities.javascript();
},
+
//
// A Declaration terminator. Note that we use `peek()` to check for '}',
// because the `block` rule will be expecting it, but we still need to make sure
@@ -4448,26 +5265,27 @@
end: function () {
return parserInput.$char(';') || parserInput.peek('}');
},
+
//
// IE's alpha function
//
// alpha(opacity=88)
//
ieAlpha: function () {
- var value;
+ let value;
+
// http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18
- if (!parserInput.$re(/^opacity=/i)) {
- return;
- }
+ if (!parserInput.$re(/^opacity=/i)) { return; }
value = parserInput.$re(/^\d+/);
if (!value) {
value = expect(parsers.entities.variable, 'Could not parse alpha');
- value = "@{".concat(value.name.slice(1), "}");
+ value = `@{${value.name.slice(1)}}`;
}
expectChar(')');
- return new tree.Quoted('', "alpha(opacity=".concat(value, ")"));
+ return new tree.Quoted('', `alpha(opacity=${value})`);
},
- /**
+
+ /**
* A Selector Element
*
* div
@@ -4480,54 +5298,54 @@
* and an element name, such as a tag a class, or `*`.
*/
element: function () {
- var e;
- var c;
- var v;
- var index = parserInput.i;
+ let e;
+ let c;
+ let v;
+ const index = parserInput.i;
+
c = this.combinator();
+
/** This selector parser is quite simplistic and will pass a number of invalid selectors. */
e = parserInput.$re(/^(?:\d+\.\d+|\d+)%/) ||
// eslint-disable-next-line no-control-regex
parserInput.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||
parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||
- parserInput.$re(/^\([^&()@]+\)/) || parserInput.$re(/^[.#:](?=@)/) ||
+ parserInput.$re(/^\([^&()@]+\)/) || parserInput.$re(/^[.#:](?=@)/) ||
this.entities.variableCurly();
+
if (!e) {
parserInput.save();
if (parserInput.$char('(')) {
if ((v = this.selector(false))) {
- var selectors = [];
+ let selectors = [];
while (parserInput.$char(',')) {
selectors.push(v);
selectors.push(new Anonymous(','));
v = this.selector(false);
}
selectors.push(v);
+
if (parserInput.$char(')')) {
if (selectors.length > 1) {
e = new (tree.Paren)(new Selector(selectors));
- }
- else {
- e = new (tree.Paren)(v);
+ } else {
+ e = new(tree.Paren)(v);
}
parserInput.forget();
- }
- else {
+ } else {
parserInput.restore('Missing closing \')\'');
}
- }
- else {
+ } else {
parserInput.restore('Missing closing \')\'');
}
- }
- else {
+ } else {
parserInput.forget();
}
}
- if (e) {
- return new (tree.Element)(c, e, e instanceof tree.Variable, index + currentIndex, fileInfo);
- }
+
+ if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index + currentIndex, fileInfo); }
},
+
//
// Combinators combine elements together, in a Selector.
//
@@ -4538,32 +5356,30 @@
// we deal with this in *combinator.js*.
//
combinator: function () {
- var c = parserInput.currentChar();
+ let c = parserInput.currentChar();
+
if (c === '/') {
parserInput.save();
- var slashedCombinator = parserInput.$re(/^\/[a-z]+\//i);
+ const slashedCombinator = parserInput.$re(/^\/[a-z]+\//i);
if (slashedCombinator) {
parserInput.forget();
- return new (tree.Combinator)(slashedCombinator);
+ return new(tree.Combinator)(slashedCombinator);
}
parserInput.restore();
}
+
if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {
parserInput.i++;
if (c === '^' && parserInput.currentChar() === '^') {
c = '^^';
parserInput.i++;
}
- while (parserInput.isWhitespace()) {
- parserInput.i++;
- }
- return new (tree.Combinator)(c);
- }
- else if (parserInput.isWhitespace(-1)) {
- return new (tree.Combinator)(' ');
- }
- else {
- return new (tree.Combinator)(null);
+ while (parserInput.isWhitespace()) { parserInput.i++; }
+ return new(tree.Combinator)(c);
+ } else if (parserInput.isWhitespace(-1)) {
+ return new(tree.Combinator)(' ');
+ } else {
+ return new(tree.Combinator)(null);
}
},
//
@@ -4576,43 +5392,35 @@
// Selectors are made out of one or more Elements, see above.
//
selector: function (isLess) {
- var index = parserInput.i;
- var elements;
- var extendList;
- var c;
- var e;
- var allExtends;
- var when;
- var condition;
+ const index = parserInput.i;
+ let elements;
+ let extendList;
+ let c;
+ let e;
+ let allExtends;
+ let when;
+ let condition;
isLess = isLess !== false;
while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {
if (when) {
condition = expect(this.conditions, 'expected condition');
- }
- else if (condition) {
+ } else if (condition) {
error('CSS guard can only be used at the end of selector');
- }
- else if (extendList) {
+ } else if (extendList) {
if (allExtends) {
allExtends = allExtends.concat(extendList);
- }
- else {
+ } else {
allExtends = extendList;
}
- }
- else {
- if (allExtends) {
- error('Extend can only be used at the end of selector');
- }
+ } else {
+ if (allExtends) { error('Extend can only be used at the end of selector'); }
c = parserInput.currentChar();
- if (Array.isArray(e)) {
- e.forEach(function (ele) { return elements.push(ele); });
- }
- if (elements) {
+ if (Array.isArray(e)){
+ e.forEach(ele => elements.push(ele));
+ } if (elements) {
elements.push(e);
- }
- else {
- elements = [e];
+ } else {
+ elements = [ e ];
}
e = null;
}
@@ -4620,16 +5428,13 @@
break;
}
}
- if (elements) {
- return new (tree.Selector)(elements, allExtends, condition, index + currentIndex, fileInfo);
- }
- if (allExtends) {
- error('Extend must be used to extend a selector, it cannot be used on its own');
- }
+
+ if (elements) { return new(tree.Selector)(elements, allExtends, condition, index + currentIndex, fileInfo); }
+ if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }
},
selectors: function () {
- var s;
- var selectors;
+ let s;
+ let selectors;
while (true) {
s = this.selector();
if (!s) {
@@ -4637,17 +5442,14 @@
}
if (selectors) {
selectors.push(s);
- }
- else {
- selectors = [s];
+ } else {
+ selectors = [ s ];
}
parserInput.commentStore.length = 0;
if (s.condition && selectors.length > 1) {
error('Guards are only currently allowed on a single selector.');
}
- if (!parserInput.$char(',')) {
- break;
- }
+ if (!parserInput.$char(',')) { break; }
if (s.condition) {
error('Guards are only currently allowed on a single selector.');
}
@@ -4656,21 +5458,22 @@
return selectors;
},
attribute: function () {
- if (!parserInput.$char('[')) {
- return;
- }
- var entities = this.entities;
- var key;
- var val;
- var op;
+ if (!parserInput.$char('[')) { return; }
+
+ const entities = this.entities;
+ let key;
+ let val;
+ let op;
//
// case-insensitive flag
// e.g. [attr operator value i]
//
- var cif;
+ let cif;
+
if (!(key = entities.variableCurly())) {
key = expect(/^(?:[_A-Za-z0-9-*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/);
}
+
op = parserInput.$re(/^[|~*$^]?=/);
if (op) {
val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\w-]+/) || entities.variableCurly();
@@ -4678,30 +5481,35 @@
cif = parserInput.$re(/^[iIsS]/);
}
}
+
expectChar(']');
- return new (tree.Attribute)(key, op, val, cif);
+
+ return new(tree.Attribute)(key, op, val, cif);
},
+
//
// The `block` rule is used by `ruleset` and `mixin.definition`.
// It's a wrapper around the `primary` rule, with added `{}`.
//
block: function () {
- var content;
+ let content;
if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {
return content;
}
},
- blockRuleset: function () {
- var block = this.block();
+
+ blockRuleset: function() {
+ let block = this.block();
if (block) {
- block = new tree.Ruleset(null, block);
+ return new tree.Ruleset(null, block);
}
- return block;
},
- detachedRuleset: function () {
- var argInfo;
- var params;
- var variadic;
+
+ detachedRuleset: function() {
+ let argInfo;
+ let params;
+ let variadic;
+
parserInput.save();
if (parserInput.$re(/^[.#]\(/)) {
/**
@@ -4718,7 +5526,7 @@
return;
}
}
- var blockRuleset = this.blockRuleset();
+ const blockRuleset = this.blockRuleset();
if (blockRuleset) {
parserInput.forget();
if (params) {
@@ -4728,64 +5536,71 @@
}
parserInput.restore();
},
+
//
// div, .class, body > p {...}
//
ruleset: function () {
- var selectors;
- var rules;
- var debugInfo;
+ let selectors;
+ let rules;
+ let debugInfo;
+
parserInput.save();
+
if (context.dumpLineNumbers) {
debugInfo = getDebugInfo(parserInput.i);
}
+
selectors = this.selectors();
+
if (selectors && (rules = this.block())) {
parserInput.forget();
- var ruleset = new (tree.Ruleset)(selectors, rules, context.strictImports);
+ const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);
if (context.dumpLineNumbers) {
ruleset.debugInfo = debugInfo;
}
return ruleset;
- }
- else {
+ } else {
parserInput.restore();
}
},
declaration: function () {
- var name;
- var value;
- var index = parserInput.i;
- var hasDR;
- var c = parserInput.currentChar();
- var important;
- var merge;
- var isVariable;
- if (c === '.' || c === '#' || c === '&' || c === ':') {
- return;
- }
+ let name;
+ let value;
+ const index = parserInput.i;
+ let hasDR;
+ const c = parserInput.currentChar();
+ let important;
+ let merge;
+ let isVariable;
+
+ if (c === '.' || c === '#' || c === '&' || c === ':') { return; }
+
parserInput.save();
+
name = this.variable() || this.ruleProperty();
if (name) {
isVariable = typeof name === 'string';
+
if (isVariable) {
value = this.detachedRuleset();
if (value) {
hasDR = true;
}
}
+
parserInput.commentStore.length = 0;
if (!value) {
// a name returned by this.ruleProperty() is always an array of the form:
// [string-1, ..., string-n, ""] or [string-1, ..., string-n, "+"]
// where each item is a tree.Keyword or tree.Variable
merge = !isVariable && name.length > 1 && name.pop().value;
+
// Custom property values get permissive parsing
if (name[0].value && name[0].value.slice(0, 2) === '--') {
if (parserInput.$char(';')) {
value = new Anonymous('');
- }
- else {
+ } else {
value = this.permissiveValue(/[;}]/, true);
}
}
@@ -4797,15 +5612,16 @@
if (value) {
parserInput.forget();
// anonymous values absorb the end ';' which is required for them to work
- return new (tree.Declaration)(name, value, false, merge, index + currentIndex, fileInfo);
+ return new(tree.Declaration)(name, value, false, merge, index + currentIndex, fileInfo);
}
+
if (!value) {
value = this.value();
}
+
if (value) {
important = this.important();
- }
- else if (isVariable) {
+ } else if (isVariable) {
/**
* As a last resort, try permissiveValue
*
@@ -4815,23 +5631,23 @@
value = this.permissiveValue();
}
}
+
if (value && (this.end() || hasDR)) {
parserInput.forget();
- return new (tree.Declaration)(name, value, important, merge, index + currentIndex, fileInfo);
+ return new(tree.Declaration)(name, value, important, merge, index + currentIndex, fileInfo);
}
else {
parserInput.restore();
}
- }
- else {
+ } else {
parserInput.restore();
}
},
anonymousValue: function () {
- var index = parserInput.i;
- var match = parserInput.$re(/^([^.#@$+/'"*`(;{}-]*);/);
+ const index = parserInput.i;
+ const match = parserInput.$re(/^([^.#@$+/'"*`(;{}-]*);/);
if (match) {
- return new (tree.Anonymous)(match[1], index + currentIndex);
+ return new(tree.Anonymous)(match[1], index + currentIndex);
}
},
/**
@@ -4842,23 +5658,23 @@
* First, it will try to parse comments and entities to reach
* the end. This is mostly like the Expression parser except no
* math is allowed.
- *
+ *
* @param {RexExp} untilTokens - Characters to stop parsing at
*/
permissiveValue: function (untilTokens) {
- var i;
- var e;
- var done;
- var value;
- var tok = untilTokens || ';';
- var index = parserInput.i;
- var result = [];
+ let i;
+ let e;
+ let done;
+ let value;
+ const tok = untilTokens || ';';
+ const index = parserInput.i;
+ const result = [];
+
function testCurrentChar() {
- var char = parserInput.currentChar();
+ const char = parserInput.currentChar();
if (typeof tok === 'string') {
return char === tok;
- }
- else {
+ } else {
return tok.test(char);
}
}
@@ -4881,9 +5697,11 @@
parserInput.$char(',');
}
} while (e);
+
done = testCurrentChar();
+
if (value.length > 0) {
- value = new (tree.Expression)(value);
+ value = new(tree.Expression)(value);
if (done) {
return value;
}
@@ -4896,17 +5714,19 @@
}
}
parserInput.save();
+
value = parserInput.$parseUntil(tok);
+
if (value) {
if (typeof value === 'string') {
- error("Expected '".concat(value, "'"), 'Parse');
+ error(`Expected '${value}'`, 'Parse');
}
if (value.length === 1 && value[0] === ' ') {
parserInput.forget();
return new tree.Anonymous('', index);
}
/** @type {string} */
- var item = void 0;
+ let item;
for (i = 0; i < value.length; i++) {
item = value[i];
if (Array.isArray(item)) {
@@ -4918,14 +5738,14 @@
item = item.trim();
}
// Treat like quoted values, but replace vars like unquoted expressions
- var quote = new tree.Quoted('\'', item, true, index, fileInfo);
- var variableRegex = /@([\w-]+)/g;
- var propRegex = /\$([\w-]+)/g;
+ const quote = new tree.Quoted('\'', item, true, index, fileInfo);
+ const variableRegex = /@([\w-]+)/g;
+ const propRegex = /\$([\w-]+)/g;
if (variableRegex.test(item)) {
- warn('@[ident] in unknown values will not be evaluated as variables in the future. Use @{[ident]}', index, 'DEPRECATED');
+ warn('@[ident] in unknown values will not be evaluated as variables in the future. Use @{[ident]}', index, 'DEPRECATED', 'variable-in-unknown-value');
}
if (propRegex.test(item)) {
- warn('$[ident] in unknown values will not be evaluated as property references in the future. Use ${[ident]}', index, 'DEPRECATED');
+ warn('$[ident] in unknown values will not be evaluated as property references in the future. Use ${[ident]}', index, 'DEPRECATED', 'property-in-unknown-value');
}
quote.variableRegex = /@([\w-]+)|@{([\w-]+)}/g;
quote.propRegex = /\$([\w-]+)|\${([\w-]+)}/g;
@@ -4937,6 +5757,7 @@
}
parserInput.restore();
},
+
//
// An @import atrule
//
@@ -4948,20 +5769,24 @@
// stored in `import`, which we pass to the Import constructor.
//
'import': function () {
- var path;
- var features;
- var index = parserInput.i;
- var dir = parserInput.$re(/^@import\s+/);
+ let path;
+ let features;
+ const index = parserInput.i;
+
+ const dir = parserInput.$re(/^@import\s+/);
+
if (dir) {
- var options = (dir ? this.importOptions() : null) || {};
+ const options = (dir ? this.importOptions() : null) || {};
+
if ((path = this.entities.quoted() || this.entities.url())) {
features = this.mediaFeatures({});
+
if (!parserInput.$char(';')) {
parserInput.i = index;
error('missing semi-colon or unrecognised media features on import');
}
- features = features && new (tree.Value)(features);
- return new (tree.Import)(path, features, options, index + currentIndex, fileInfo);
+ features = features && new(tree.Value)(features);
+ return new(tree.Import)(path, features, options, index + currentIndex, fileInfo);
}
else {
parserInput.i = index;
@@ -4969,15 +5794,15 @@
}
}
},
- importOptions: function () {
- var o;
- var options = {};
- var optionName;
- var value;
+
+ importOptions: function() {
+ let o;
+ const options = {};
+ let optionName;
+ let value;
+
// list of options, surrounded by parens
- if (!parserInput.$char('(')) {
- return null;
- }
+ if (!parserInput.$char('(')) { return null; }
do {
o = this.importOption();
if (o) {
@@ -4994,27 +5819,27 @@
break;
}
options[optionName] = value;
- if (!parserInput.$char(',')) {
- break;
- }
+ if (!parserInput.$char(',')) { break; }
}
} while (o);
expectChar(')');
return options;
},
- importOption: function () {
- var opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);
+
+ importOption: function() {
+ const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);
if (opt) {
return opt[1];
}
},
+
mediaFeature: function (syntaxOptions) {
- var entities = this.entities;
- var nodes = [];
- var e;
- var p;
- var rangeP;
- var spacing = false;
+ const entities = this.entities;
+ const nodes = [];
+ let e;
+ let p;
+ let rangeP;
+ let spacing = false;
parserInput.save();
do {
parserInput.save();
@@ -5022,23 +5847,27 @@
spacing = true;
}
parserInput.restore();
+
e = entities.declarationCall.bind(this)() || entities.keyword() || entities.variable() || entities.mixinLookup();
if (e) {
nodes.push(e);
- }
- else if (parserInput.$char('(')) {
+ if (e.type === 'Variable' ||
+ (e.type === 'Keyword' && /^(and|or|not|only)$/i.test(e.value))) {
+ spacing = true;
+ }
+ } else if (parserInput.$char('(')) {
p = this.property();
parserInput.save();
if (!p && syntaxOptions.queryInParens && parserInput.$re(/^[0-9a-z-]*\s*([<>]=|<=|>=|[<>]|=)/)) {
parserInput.restore();
p = this.condition();
+
parserInput.save();
rangeP = this.atomicCondition(null, p.rvalue);
if (!rangeP) {
parserInput.restore();
}
- }
- else {
+ } else {
parserInput.restore();
e = this.value();
}
@@ -5046,105 +5875,115 @@
if (p && !e) {
nodes.push(new (tree.Paren)(new (tree.QueryInParens)(p.op, p.lvalue, p.rvalue, rangeP ? rangeP.op : null, rangeP ? rangeP.rvalue : null, p._index)));
e = p;
- }
- else if (p && e) {
+ } else if (p && e) {
nodes.push(new (tree.Paren)(new (tree.Declaration)(p, e, null, null, parserInput.i + currentIndex, fileInfo, true)));
if (!spacing) {
nodes[nodes.length - 1].noSpacing = true;
}
spacing = false;
- }
- else if (e) {
- nodes.push(new (tree.Paren)(e));
+ } else if (e) {
+ nodes.push(new(tree.Paren)(e));
spacing = false;
- }
- else {
+ } else {
error('badly formed media feature definition');
}
- }
- else {
+ } else {
error('Missing closing \')\'', 'Parse');
}
}
} while (e);
+
parserInput.forget();
if (nodes.length > 0) {
- return new (tree.Expression)(nodes);
+ return new(tree.Expression)(nodes);
}
},
+
mediaFeatures: function (syntaxOptions) {
- var entities = this.entities;
- var features = [];
- var e;
+ const entities = this.entities;
+ const features = [];
+ let e;
do {
e = this.mediaFeature(syntaxOptions);
if (e) {
features.push(e);
- if (!parserInput.$char(',')) {
- break;
- }
+ if (!parserInput.$char(',')) { break; }
else if (!features[features.length - 1].noSpacing) {
features[features.length - 1].noSpacing = false;
}
- }
- else {
+ } else {
e = entities.variable() || entities.mixinLookup();
if (e) {
features.push(e);
- if (!parserInput.$char(',')) {
- break;
- }
+ if (!parserInput.$char(',')) { break; }
else if (!features[features.length - 1].noSpacing) {
features[features.length - 1].noSpacing = false;
}
}
}
} while (e);
+
return features.length > 0 ? features : null;
},
+
prepareAndGetNestableAtRule: function (treeType, index, debugInfo, syntaxOptions) {
- var features = this.mediaFeatures(syntaxOptions);
- var rules = this.block();
+ const features = this.mediaFeatures(syntaxOptions);
+
+ const rules = this.block();
+
if (!rules) {
error('media definitions require block statements after any features');
}
+
parserInput.forget();
- var atRule = new (treeType)(rules, features, index + currentIndex, fileInfo);
+
+ const atRule = new (treeType)(rules, features, index + currentIndex, fileInfo);
if (context.dumpLineNumbers) {
atRule.debugInfo = debugInfo;
}
+
return atRule;
},
+
nestableAtRule: function () {
- var debugInfo;
- var index = parserInput.i;
+ let debugInfo;
+ const index = parserInput.i;
+
if (context.dumpLineNumbers) {
debugInfo = getDebugInfo(index);
}
parserInput.save();
+
if (parserInput.$peekChar('@')) {
if (parserInput.$str('@media')) {
return this.prepareAndGetNestableAtRule(tree.Media, index, debugInfo, MediaSyntaxOptions);
}
+
if (parserInput.$str('@container')) {
return this.prepareAndGetNestableAtRule(tree.Container, index, debugInfo, ContainerSyntaxOptions);
}
}
+
parserInput.restore();
},
+
//
+
// A @plugin directive, used to import plugins dynamically.
//
// @plugin (args) "lib";
//
plugin: function () {
- var path;
- var args;
- var options;
- var index = parserInput.i;
- var dir = parserInput.$re(/^@plugin\s+/);
+ let path;
+ let args;
+ let options;
+ const index = parserInput.i;
+ const dir = parserInput.$re(/^@plugin\s+/);
+
if (dir) {
+ warn('The @plugin directive is deprecated and will be removed in Less 5.x. Use --plugin CLI option or the programmatic plugin API instead.', index, 'DEPRECATED', 'at-plugin');
args = this.pluginArgs();
+
if (args) {
options = {
pluginArgs: args,
@@ -5154,12 +5993,14 @@
else {
options = { isPlugin: true };
}
+
if ((path = this.entities.quoted() || this.entities.url())) {
+
if (!parserInput.$char(';')) {
parserInput.i = index;
error('missing semi-colon on @plugin');
}
- return new (tree.Import)(path, null, options, index + currentIndex, fileInfo);
+ return new(tree.Import)(path, null, options, index + currentIndex, fileInfo);
}
else {
parserInput.i = index;
@@ -5167,14 +6008,15 @@
}
}
},
- pluginArgs: function () {
+
+ pluginArgs: function() {
// list of options, surrounded by parens
parserInput.save();
if (!parserInput.$char('(')) {
parserInput.restore();
return null;
}
- var args = parserInput.$re(/^\s*([^);]+)\)\s*/);
+ const args = parserInput.$re(/^\s*([^);]+)\)\s*/);
if (args[1]) {
parserInput.forget();
return args[1].trim();
@@ -5224,6 +6066,7 @@
else {
parserInput.forget();
}
+
return [rules, value, isKeywordList];
},
//
@@ -5232,33 +6075,36 @@
// @charset "utf-8";
//
atrule: function () {
- var index = parserInput.i;
- var name;
- var value;
- var rules;
- var nonVendorSpecificName;
- var hasIdentifier;
- var hasExpression;
- var hasUnknown;
- var hasBlock = true;
- var isRooted = true;
- var isKeywordList = false;
- if (parserInput.currentChar() !== '@') {
- return;
- }
+ const index = parserInput.i;
+ let name;
+ let value;
+ let rules;
+ let nonVendorSpecificName;
+ let hasIdentifier;
+ let hasExpression;
+ let hasUnknown;
+ let hasBlock = true;
+ let isRooted = true;
+ let isKeywordList = false;
+
+ if (parserInput.currentChar() !== '@') { return; }
+
value = this['import']() || this.plugin() || this.nestableAtRule();
if (value) {
return value;
}
+
parserInput.save();
+
name = parserInput.$re(/^@[a-z-]+/);
- if (!name) {
- return;
- }
+
+ if (!name) { return; }
+
nonVendorSpecificName = name;
if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {
- nonVendorSpecificName = "@".concat(name.slice(name.indexOf('-', 2) + 1));
+ nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;
}
+
switch (nonVendorSpecificName) {
case '@charset':
hasIdentifier = true;
@@ -5287,33 +6133,35 @@
hasUnknown = true;
break;
}
+
parserInput.commentStore.length = 0;
+
if (hasIdentifier) {
value = this.entity();
if (!value) {
- error("expected ".concat(name, " identifier"));
+ error(`expected ${name} identifier`);
}
- }
- else if (hasExpression) {
+ } else if (hasExpression) {
value = this.expression();
if (!value) {
- error("expected ".concat(name, " expression"));
+ error(`expected ${name} expression`);
}
- }
- else if (hasUnknown) {
- var unknownPackage = this.atruleUnknown(value, name, hasBlock);
+ } else if (hasUnknown) {
+ const unknownPackage = this.atruleUnknown(value, name, hasBlock);
value = unknownPackage[0];
hasBlock = unknownPackage[1];
}
+
if (hasBlock) {
- var blockPackage = this.atruleBlock(rules, value, isRooted, isKeywordList);
+ let blockPackage = this.atruleBlock(rules, value, isRooted, isKeywordList);
rules = blockPackage[0];
value = blockPackage[1];
isKeywordList = blockPackage[2];
+
if (!rules && !hasUnknown) {
parserInput.restore();
name = parserInput.$re(/^@[a-z-]+/);
- var unknownPackage = this.atruleUnknown(value, name, hasBlock);
+ const unknownPackage = this.atruleUnknown(value, name, hasBlock);
value = unknownPackage[0];
hasBlock = unknownPackage[1];
if (hasBlock) {
@@ -5324,12 +6172,18 @@
}
}
}
+
if (rules || isKeywordList || (!hasBlock && value && parserInput.$char(';'))) {
parserInput.forget();
- return new (tree.AtRule)(name, value, rules, index + currentIndex, fileInfo, context.dumpLineNumbers ? getDebugInfo(index) : null, isRooted);
+ return new(tree.AtRule)(name, value, rules, index + currentIndex, fileInfo,
+ context.dumpLineNumbers ? getDebugInfo(index) : null,
+ isRooted
+ );
}
+
parserInput.restore('at-rule options not recognised');
},
+
//
// A Value is a comma-delimited list of Expressions
//
@@ -5339,20 +6193,20 @@
// and before the `;`.
//
value: function () {
- var e;
- var expressions = [];
- var index = parserInput.i;
+ let e;
+ const expressions = [];
+ const index = parserInput.i;
+
do {
e = this.expression();
if (e) {
expressions.push(e);
- if (!parserInput.$char(',')) {
- break;
- }
+ if (!parserInput.$char(',')) { break; }
}
} while (e);
+
if (expressions.length > 0) {
- return new (tree.Value)(expressions, index + currentIndex);
+ return new(tree.Value)(expressions, index + currentIndex);
}
},
important: function () {
@@ -5361,14 +6215,15 @@
}
},
sub: function () {
- var a;
- var e;
+ let a;
+ let e;
+
parserInput.save();
if (parserInput.$char('(')) {
a = this.addition();
if (a && parserInput.$char(')')) {
parserInput.forget();
- e = new (tree.Expression)([a]);
+ e = new(tree.Expression)([a]);
e.parens = true;
return e;
}
@@ -5379,19 +6234,22 @@
},
colorOperand: function () {
parserInput.save();
+
// hsl or rgb or lch operand
- var match = parserInput.$re(/^[lchrgbs]\s+/);
+ const match = parserInput.$re(/^[lchrgbs]\s+/);
if (match) {
+ parserInput.forget();
return new tree.Keyword(match[0]);
}
+
parserInput.restore();
},
multiplication: function () {
- var m;
- var a;
- var op;
- var operation;
- var isSpaced;
+ let m;
+ let a;
+ let op;
+ let operation;
+ let isSpaced;
m = this.operand();
if (m) {
isSpaced = parserInput.isWhitespace(-1);
@@ -5399,39 +6257,39 @@
if (parserInput.peek(/^\/[*/]/)) {
break;
}
+
parserInput.save();
+
op = parserInput.$char('/') || parserInput.$char('*');
if (!op) {
- var index = parserInput.i;
+ let index = parserInput.i;
op = parserInput.$str('./');
if (op) {
- warn('./ operator is deprecated', index, 'DEPRECATED');
+ warn('./ operator is deprecated', index, 'DEPRECATED', 'dot-slash-operator');
}
}
- if (!op) {
- parserInput.forget();
- break;
- }
- a = this.operand();
- if (!a) {
- parserInput.restore();
- break;
- }
+
+ if (!op) { parserInput.forget(); break; }
+
+ a = this.operand();
+
+ if (!a) { parserInput.restore(); break; }
parserInput.forget();
+
m.parensInOp = true;
a.parensInOp = true;
- operation = new (tree.Operation)(op, [operation || m, a], isSpaced);
+ operation = new(tree.Operation)(op, [operation || m, a], isSpaced);
isSpaced = parserInput.isWhitespace(-1);
}
return operation || m;
}
},
addition: function () {
- var m;
- var a;
- var op;
- var operation;
- var isSpaced;
+ let m;
+ let a;
+ let op;
+ let operation;
+ let isSpaced;
m = this.multiplication();
if (m) {
isSpaced = parserInput.isWhitespace(-1);
@@ -5444,19 +6302,21 @@
if (!a) {
break;
}
+
m.parensInOp = true;
a.parensInOp = true;
- operation = new (tree.Operation)(op, [operation || m, a], isSpaced);
+ operation = new(tree.Operation)(op, [operation || m, a], isSpaced);
isSpaced = parserInput.isWhitespace(-1);
}
return operation || m;
}
},
conditions: function () {
- var a;
- var b;
- var index = parserInput.i;
- var condition;
+ let a;
+ let b;
+ const index = parserInput.i;
+ let condition;
+
a = this.condition(true);
if (a) {
while (true) {
@@ -5467,41 +6327,41 @@
if (!b) {
break;
}
- condition = new (tree.Condition)('or', condition || a, b, index + currentIndex);
+ condition = new(tree.Condition)('or', condition || a, b, index + currentIndex);
}
return condition || a;
}
},
condition: function (needsParens) {
- var result;
- var logical;
- var next;
+ let result;
+ let logical;
+ let next;
function or() {
return parserInput.$str('or');
}
+
result = this.conditionAnd(needsParens);
if (!result) {
- return;
+ return ;
}
logical = or();
if (logical) {
next = this.condition(needsParens);
if (next) {
- result = new (tree.Condition)(logical, result, next);
- }
- else {
- return;
+ result = new(tree.Condition)(logical, result, next);
+ } else {
+ return ;
}
}
return result;
},
conditionAnd: function (needsParens) {
- var result;
- var logical;
- var next;
- var self = this;
+ let result;
+ let logical;
+ let next;
+ const self = this;
function insideCondition() {
- var cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);
+ const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);
if (!cond && !needsParens) {
return self.atomicCondition(needsParens);
}
@@ -5510,25 +6370,25 @@
function and() {
return parserInput.$str('and');
}
+
result = insideCondition();
if (!result) {
- return;
+ return ;
}
logical = and();
if (logical) {
next = this.conditionAnd(needsParens);
if (next) {
- result = new (tree.Condition)(logical, result, next);
- }
- else {
- return;
+ result = new(tree.Condition)(logical, result, next);
+ } else {
+ return ;
}
}
return result;
},
negatedCondition: function (needsParens) {
if (parserInput.$str('not')) {
- var result = this.parenthesisCondition(needsParens);
+ const result = this.parenthesisCondition(needsParens);
if (result) {
result.negate = !result.negate;
}
@@ -5537,123 +6397,127 @@
},
parenthesisCondition: function (needsParens) {
function tryConditionFollowedByParenthesis(me) {
- var body;
+ let body;
parserInput.save();
body = me.condition(needsParens);
if (!body) {
parserInput.restore();
- return;
+ return ;
}
if (!parserInput.$char(')')) {
parserInput.restore();
- return;
+ return ;
}
parserInput.forget();
return body;
}
- var body;
+
+ let body;
parserInput.save();
if (!parserInput.$str('(')) {
parserInput.restore();
- return;
+ return ;
}
body = tryConditionFollowedByParenthesis(this);
if (body) {
parserInput.forget();
return body;
}
+
body = this.atomicCondition(needsParens);
if (!body) {
parserInput.restore();
- return;
+ return ;
}
if (!parserInput.$char(')')) {
- parserInput.restore("expected ')' got '".concat(parserInput.currentChar(), "'"));
- return;
+ parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);
+ return ;
}
parserInput.forget();
return body;
},
atomicCondition: function (needsParens, preparsedCond) {
- var entities = this.entities;
- var index = parserInput.i;
- var a;
- var b;
- var c;
- var op;
- var cond = (function () {
+ const entities = this.entities;
+ const index = parserInput.i;
+ let a;
+ let b;
+ let c;
+ let op;
+
+ const cond = (function() {
return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();
}).bind(this);
+
if (preparsedCond) {
a = preparsedCond;
- }
- else {
+ } else {
a = cond();
}
+
if (a) {
if (parserInput.$char('>')) {
if (parserInput.$char('=')) {
op = '>=';
- }
- else {
+ } else {
op = '>';
}
- }
- else if (parserInput.$char('<')) {
+ } else
+ if (parserInput.$char('<')) {
if (parserInput.$char('=')) {
op = '<=';
- }
- else {
+ } else {
op = '<';
}
- }
- else if (parserInput.$char('=')) {
+ } else
+ if (parserInput.$char('=')) {
if (parserInput.$char('>')) {
op = '=>';
- }
- else if (parserInput.$char('<')) {
+ } else if (parserInput.$char('<')) {
op = '=<';
- }
- else {
+ } else {
op = '=';
}
}
if (op) {
b = cond();
if (b) {
- c = new (tree.Condition)(op, a, b, index + currentIndex, false);
- }
- else {
+ c = new(tree.Condition)(op, a, b, index + currentIndex, false);
+ } else {
error('expected expression');
}
- }
- else if (!preparsedCond) {
- c = new (tree.Condition)('=', a, new (tree.Keyword)('true'), index + currentIndex, false);
+ } else if (!preparsedCond) {
+ c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index + currentIndex, false);
}
return c;
}
},
+
//
// An operand is anything that can be part of an operation,
// such as a Color, or a Variable
//
operand: function () {
- var entities = this.entities;
- var negate;
+ const entities = this.entities;
+ let negate;
+
if (parserInput.peek(/^-[@$(]/)) {
negate = parserInput.$char('-');
}
- var o = this.sub() || entities.dimension() ||
- entities.color() || entities.variable() ||
- entities.property() || entities.call() ||
- entities.quoted(true) || entities.colorKeyword() ||
- this.colorOperand() || entities.mixinLookup();
+
+ let o = this.sub() || entities.dimension() ||
+ entities.color() || entities.variable() ||
+ entities.property() || entities.call() ||
+ entities.quoted(true) || entities.colorKeyword() ||
+ this.colorOperand() || entities.mixinLookup();
+
if (negate) {
o.parensInOp = true;
- o = new (tree.Negative)(o);
+ o = new(tree.Negative)(o);
}
+
return o;
},
+
//
// Expressions either represent mathematical operations,
// or white-space delimited Entities.
@@ -5662,10 +6526,11 @@
// @var * 2
//
expression: function () {
- var entities = [];
- var e;
- var delim;
- var index = parserInput.i;
+ const entities = [];
+ let e;
+ let delim;
+ const index = parserInput.i;
+
do {
e = this.comment();
if (e && !e.isLineComment) {
@@ -5673,58 +6538,66 @@
continue;
}
e = this.addition() || this.entity();
+
if (e instanceof tree.Comment) {
e = null;
}
+
if (e) {
entities.push(e);
// operations do not allow keyword "/" dimension (e.g. small/20px) so we support that here
if (!parserInput.peek(/^\/[/*]/)) {
delim = parserInput.$char('/');
if (delim) {
- entities.push(new (tree.Anonymous)(delim, index + currentIndex));
+ entities.push(new(tree.Anonymous)(delim, index + currentIndex));
}
}
}
} while (e);
if (entities.length > 0) {
- return new (tree.Expression)(entities);
+ return new(tree.Expression)(entities);
}
},
property: function () {
- var name = parserInput.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);
+ const name = parserInput.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);
if (name) {
return name[1];
}
},
ruleProperty: function () {
- var name = [];
- var index = [];
- var s;
- var k;
+ let name = [];
+ const index = [];
+ let s;
+ let k;
+
parserInput.save();
- var simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\s*:/);
+
+ const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\s*:/);
if (simpleProperty) {
- name = [new (tree.Keyword)(simpleProperty[1])];
+ name = [new(tree.Keyword)(simpleProperty[1])];
parserInput.forget();
return name;
}
+
function match(re) {
- var i = parserInput.i;
- var chunk = parserInput.$re(re);
+ const i = parserInput.i;
+ const chunk = parserInput.$re(re);
if (chunk) {
index.push(i);
return name.push(chunk[1]);
}
}
+
match(/^(\*?)/);
while (true) {
if (!match(/^((?:[\w-]+)|(?:[@$]\{[\w-]+\}))/)) {
break;
}
}
+
if ((name.length > 1) && match(/^((?:\+_|\+)?)\s*:/)) {
parserInput.forget();
+
// at last, we have the complete match now. move forward,
// convert name particles to tree objects and return:
if (name[0] === '') {
@@ -5734,10 +6607,10 @@
for (k = 0; k < name.length; k++) {
s = name[k];
name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?
- new (tree.Keyword)(s) :
+ new(tree.Keyword)(s) :
(s.charAt(0) === '@' ?
- new (tree.Variable)("@".concat(s.slice(2, -1)), index[k] + currentIndex, fileInfo) :
- new (tree.Property)("$".concat(s.slice(2, -1)), index[k] + currentIndex, fileInfo));
+ new(tree.Variable)(`@${s.slice(2, -1)}`, index[k] + currentIndex, fileInfo) :
+ new(tree.Property)(`$${s.slice(2, -1)}`, index[k] + currentIndex, fileInfo));
}
return name;
}
@@ -5746,18 +6619,20 @@
}
};
};
- Parser.serializeVars = function (vars) {
- var s = '';
- for (var name_1 in vars) {
- if (Object.hasOwnProperty.call(vars, name_1)) {
- var value = vars[name_1];
- s += "".concat(((name_1[0] === '@') ? '' : '@') + name_1, ": ").concat(value).concat((String(value).slice(-1) === ';') ? '' : ';');
+ Parser.serializeVars = vars => {
+ let s = '';
+
+ for (const name in vars) {
+ if (Object.hasOwnProperty.call(vars, name)) {
+ const value = vars[name];
+ s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;
}
}
+
return s;
};
- var Selector = function (elements, extendList, condition, index, currentFileInfo, visibilityInfo) {
+ const Selector = function(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {
this.extendList = extendList;
this.condition = condition;
this.evaldCondition = !condition;
@@ -5768,9 +6643,11 @@
this.copyVisibilityInfo(visibilityInfo);
this.setParent(this.elements, this);
};
+
Selector.prototype = Object.assign(new Node(), {
type: 'Selector',
- accept: function (visitor) {
+
+ accept(visitor) {
if (this.elements) {
this.elements = visitor.visitArray(this.elements);
}
@@ -5781,87 +6658,116 @@
this.condition = visitor.visit(this.condition);
}
},
- createDerived: function (elements, extendList, evaldCondition) {
+
+ createDerived(elements, extendList, evaldCondition) {
elements = this.getElements(elements);
- var newSelector = new Selector(elements, extendList || this.extendList, null, this.getIndex(), this.fileInfo(), this.visibilityInfo());
+ const newSelector = new Selector(elements, extendList || this.extendList,
+ null, this.getIndex(), this.fileInfo(), this.visibilityInfo());
newSelector.evaldCondition = (!isNullOrUndefined(evaldCondition)) ? evaldCondition : this.evaldCondition;
newSelector.mediaEmpty = this.mediaEmpty;
return newSelector;
},
- getElements: function (els) {
+
+ getElements(els) {
if (!els) {
return [new Element('', '&', false, this._index, this._fileInfo)];
}
if (typeof els === 'string') {
- new Parser(this.parse.context, this.parse.importManager, this._fileInfo, this._index).parseNode(els, ['selector'], function (err, result) {
- if (err) {
- throw new LessError({
- index: err.index,
- message: err.message
- }, this.parse.imports, this._fileInfo.filename);
- }
- els = result[0].elements;
- });
+ new Parser(this.parse.context, this.parse.importManager, this._fileInfo, this._index).parseNode(
+ els,
+ ['selector'],
+ function(err, result) {
+ if (err) {
+ throw new LessError({
+ index: err.index,
+ message: err.message
+ }, this.parse.imports, this._fileInfo.filename);
+ }
+ els = result[0].elements;
+ });
}
return els;
},
- createEmptySelectors: function () {
- var el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];
+
+ createEmptySelectors() {
+ const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];
sels[0].mediaEmpty = true;
return sels;
},
- match: function (other) {
- var elements = this.elements;
- var len = elements.length;
- var olen;
- var i;
+
+ match(other) {
+ const elements = this.elements;
+ const len = elements.length;
+ let olen;
+ let i;
+
other = other.mixinElements();
olen = other.length;
if (olen === 0 || len < olen) {
return 0;
- }
- else {
+ } else {
for (i = 0; i < olen; i++) {
if (elements[i].value !== other[i]) {
return 0;
}
}
}
+
return olen; // return number of matched elements
},
- mixinElements: function () {
+
+ mixinElements() {
if (this.mixinElements_) {
return this.mixinElements_;
}
- var elements = this.elements.map(function (v) {
+
+ let elements = this.elements.map( function(v) {
return v.combinator.value + (v.value.value || v.value);
}).join('').match(/[,*.\w-]([\w-]|(\\.))*/g);
+
if (elements) {
if (elements[0] === '&') {
elements.shift();
}
- }
- else {
+ } else {
elements = [];
}
+
return (this.mixinElements_ = elements);
},
- isJustParentSelector: function () {
+
+ isJustParentSelector() {
return !this.mediaEmpty &&
this.elements.length === 1 &&
this.elements[0].value === '&' &&
(this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');
},
- eval: function (context) {
- var evaldCondition = this.condition && this.condition.eval(context);
- var elements = this.elements;
- var extendList = this.extendList;
- elements = elements && elements.map(function (e) { return e.eval(context); });
- extendList = extendList && extendList.map(function (extend) { return extend.eval(context); });
+
+ eval(context) {
+ const evaldCondition = this.condition && this.condition.eval(context);
+ let elements = this.elements;
+ let extendList = this.extendList;
+
+ if (elements) {
+ const evaldElements = new Array(elements.length);
+ for (let i = 0; i < elements.length; i++) {
+ evaldElements[i] = elements[i].eval(context);
+ }
+ elements = evaldElements;
+ }
+ if (extendList) {
+ const evaldExtends = new Array(extendList.length);
+ for (let i = 0; i < extendList.length; i++) {
+ evaldExtends[i] = extendList[i].eval(context);
+ }
+ extendList = evaldExtends;
+ }
+
return this.createDerived(elements, extendList, evaldCondition);
},
- genCSS: function (context, output) {
- var i, element;
+
+ genCSS(context, output) {
+ let i, element;
if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {
output.add(' ', this.fileInfo(), this.getIndex());
}
@@ -5870,80 +6776,45 @@
element.genCSS(context, output);
}
},
- getIsOutput: function () {
- return this.evaldCondition;
- }
- });
- var Value = function (value) {
- if (!value) {
- throw new Error('Value requires an array argument');
- }
- if (!Array.isArray(value)) {
- this.value = [value];
- }
- else {
- this.value = value;
- }
- };
- Value.prototype = Object.assign(new Node(), {
- type: 'Value',
- accept: function (visitor) {
- if (this.value) {
- this.value = visitor.visitArray(this.value);
- }
- },
- eval: function (context) {
- if (this.value.length === 1) {
- return this.value[0].eval(context);
- }
- else {
- return new Value(this.value.map(function (v) {
- return v.eval(context);
- }));
- }
- },
- genCSS: function (context, output) {
- var i;
- for (i = 0; i < this.value.length; i++) {
- this.value[i].genCSS(context, output);
- if (i + 1 < this.value.length) {
- output.add((context && context.compress) ? ',' : ', ');
- }
- }
+ getIsOutput() {
+ return this.evaldCondition;
}
});
- var Keyword = function (value) {
+ const Keyword = function(value) {
this.value = value;
};
+
Keyword.prototype = Object.assign(new Node(), {
type: 'Keyword',
- genCSS: function (context, output) {
- if (this.value === '%') {
- throw { type: 'Syntax', message: 'Invalid % without number' };
- }
+
+ genCSS(context, output) {
+ if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }
output.add(this.value);
}
});
+
Keyword.True = new Keyword('true');
Keyword.False = new Keyword('false');
- var MATH$1 = Math$1;
+ const MATH$1 = Math$1;
+
function evalName(context, name) {
- var value = '';
- var i;
- var n = name.length;
- var output = { add: function (s) { value += s; } };
+ let value = '';
+ let i;
+ const n = name.length;
+ const output = {add: function (s) {value += s;}};
for (i = 0; i < n; i++) {
name[i].eval(context).genCSS(context, output);
}
return value;
}
- var Declaration = function (name, value, important, merge, index, currentFileInfo, inline, variable) {
+
+ const Declaration = function(name, value, important, merge, index, currentFileInfo, inline, variable) {
this.name = name;
this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);
- this.important = important ? " ".concat(important.trim()) : '';
+ this.important = important ? ` ${important.trim()}` : '';
this.merge = merge;
this._index = index;
this._fileInfo = currentFileInfo;
@@ -5953,9 +6824,11 @@
this.allowRoot = true;
this.setParent(this.value, this);
};
+
Declaration.prototype = Object.assign(new Node(), {
type: 'Declaration',
- genCSS: function (context, output) {
+
+ genCSS(context, output) {
output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());
try {
this.value.genCSS(context, output);
@@ -5967,8 +6840,9 @@
}
output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);
},
- eval: function (context) {
- var mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;
+
+ eval(context) {
+ let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;
if (typeof name !== 'string') {
// expand 'primitive' name directly to get
// things faster (~10% for benchmark.less):
@@ -5976,6 +6850,7 @@
name[0].value : evalName(context, name);
variable = false; // never treat expanded interpolation as new variable name
}
+
// @todo remove when parens-division is default
if (name === 'font' && context.math === MATH$1.ALWAYS) {
mathBypass = true;
@@ -5985,16 +6860,23 @@
try {
context.importantScope.push({});
evaldValue = this.value.eval(context);
+
if (!this.variable && evaldValue.type === 'DetachedRuleset') {
throw { message: 'Rulesets cannot be evaluated on a property.',
index: this.getIndex(), filename: this.fileInfo().filename };
}
- var important = this.important;
- var importantResult = context.importantScope.pop();
+ let important = this.important;
+ const importantResult = context.importantScope.pop();
if (!important && importantResult.important) {
important = importantResult.important;
}
- return new Declaration(name, evaldValue, important, this.merge, this.getIndex(), this.fileInfo(), this.inline, variable);
+
+ return new Declaration(name,
+ evaldValue,
+ important,
+ this.merge,
+ this.getIndex(), this.fileInfo(), this.inline,
+ variable);
}
catch (e) {
if (typeof e.index !== 'number') {
@@ -6009,69 +6891,20 @@
}
}
},
- makeImportant: function () {
- return new Declaration(this.name, this.value, '!important', this.merge, this.getIndex(), this.fileInfo(), this.inline);
- }
- });
-
- function asComment(ctx) {
- return "/* line ".concat(ctx.debugInfo.lineNumber, ", ").concat(ctx.debugInfo.fileName, " */\n");
- }
- function asMediaQuery(ctx) {
- var filenameWithProtocol = ctx.debugInfo.fileName;
- if (!/^[a-z]+:\/\//i.test(filenameWithProtocol)) {
- filenameWithProtocol = "file://".concat(filenameWithProtocol);
- }
- return "@media -sass-debug-info{filename{font-family:".concat(filenameWithProtocol.replace(/([.:/\\])/g, function (a) {
- if (a == '\\') {
- a = '/';
- }
- return "\\".concat(a);
- }), "}line{font-family:\\00003").concat(ctx.debugInfo.lineNumber, "}}\n");
- }
- function debugInfo(context, ctx, lineSeparator) {
- var result = '';
- if (context.dumpLineNumbers && !context.compress) {
- switch (context.dumpLineNumbers) {
- case 'comments':
- result = asComment(ctx);
- break;
- case 'mediaquery':
- result = asMediaQuery(ctx);
- break;
- case 'all':
- result = asComment(ctx) + (lineSeparator || '') + asMediaQuery(ctx);
- break;
- }
- }
- return result;
- }
- var Comment = function (value, isLineComment, index, currentFileInfo) {
- this.value = value;
- this.isLineComment = isLineComment;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.allowRoot = true;
- };
- Comment.prototype = Object.assign(new Node(), {
- type: 'Comment',
- genCSS: function (context, output) {
- if (this.debugInfo) {
- output.add(debugInfo(context, this), this.fileInfo(), this.getIndex());
- }
- output.add(this.value);
- },
- isSilent: function (context) {
- var isCompressed = context.compress && this.value[2] !== '!';
- return this.isLineComment || isCompressed;
+ makeImportant() {
+ return new Declaration(this.name,
+ this.value,
+ '!important',
+ this.merge,
+ this.getIndex(), this.fileInfo(), this.inline);
}
});
- var defaultFunc = {
+ const defaultFunc = {
eval: function () {
- var v = this.value_;
- var e = this.error_;
+ const v = this.value_;
+ const e = this.error_;
if (e) {
throw e;
}
@@ -6090,7 +6923,7 @@
}
};
- var Ruleset = function (selectors, rules, strictImports, visibilityInfo) {
+ const Ruleset = function(selectors, rules, strictImports, visibilityInfo) {
this.selectors = selectors;
this.rules = rules;
this._lookups = {};
@@ -6099,40 +6932,46 @@
this.strictImports = strictImports;
this.copyVisibilityInfo(visibilityInfo);
this.allowRoot = true;
+
this.setParent(this.selectors, this);
this.setParent(this.rules, this);
};
+
Ruleset.prototype = Object.assign(new Node(), {
type: 'Ruleset',
isRuleset: true,
- isRulesetLike: function () { return true; },
- accept: function (visitor) {
+
+ isRulesetLike() { return true; },
+
+ accept(visitor) {
if (this.paths) {
this.paths = visitor.visitArray(this.paths, true);
- }
- else if (this.selectors) {
+ } else if (this.selectors) {
this.selectors = visitor.visitArray(this.selectors);
}
if (this.rules && this.rules.length) {
this.rules = visitor.visitArray(this.rules);
}
},
- eval: function (context) {
- var selectors;
- var selCnt;
- var selector;
- var i;
- var hasVariable;
- var hasOnePassingSelector = false;
+
+ eval(context) {
+ let selectors;
+ let selCnt;
+ let selector;
+ let i;
+ let hasVariable;
+ let hasOnePassingSelector = false;
+
if (this.selectors && (selCnt = this.selectors.length)) {
selectors = new Array(selCnt);
defaultFunc.error({
type: 'Syntax',
message: 'it is currently only allowed in parametric mixin guards,'
});
+
for (i = 0; i < selCnt; i++) {
selector = this.selectors[i].eval(context);
- for (var j = 0; j < selector.elements.length; j++) {
+ for (let j = 0; j < selector.elements.length; j++) {
if (selector.elements[j].isVariable) {
hasVariable = true;
break;
@@ -6143,80 +6982,89 @@
hasOnePassingSelector = true;
}
}
+
if (hasVariable) {
- var toParseSelectors = new Array(selCnt);
+ const toParseSelectors = new Array(selCnt);
for (i = 0; i < selCnt; i++) {
selector = selectors[i];
toParseSelectors[i] = selector.toCSS(context);
}
- var startingIndex = selectors[0].getIndex();
- var selectorFileInfo = selectors[0].fileInfo();
- new Parser(context, this.parse.importManager, selectorFileInfo, startingIndex).parseNode(toParseSelectors.join(','), ['selectors'], function (err, result) {
- if (result) {
- selectors = flattenArray(result);
- }
- });
+ const startingIndex = selectors[0].getIndex();
+ const selectorFileInfo = selectors[0].fileInfo();
+ new Parser(context, this.parse.importManager, selectorFileInfo, startingIndex).parseNode(
+ toParseSelectors.join(','),
+ ['selectors'],
+ function(err, result) {
+ if (result) {
+ selectors = flattenArray(result);
+ }
+ });
}
+
defaultFunc.reset();
- }
- else {
+ } else {
hasOnePassingSelector = true;
}
- var rules = this.rules ? copyArray(this.rules) : null;
- var ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());
- var rule;
- var subRule;
+
+ let rules = this.rules ? copyArray(this.rules) : null;
+ const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());
+ let rule;
+ let subRule;
+
ruleset.originalRuleset = this;
ruleset.root = this.root;
ruleset.firstRoot = this.firstRoot;
ruleset.allowImports = this.allowImports;
+
if (this.debugInfo) {
ruleset.debugInfo = this.debugInfo;
}
+
if (!hasOnePassingSelector) {
rules.length = 0;
}
+
+ // push the current ruleset to the frames stack
+ const ctxFrames = context.frames;
+
// inherit a function registry from the frames stack when possible;
// otherwise from the global registry
- ruleset.functionRegistry = (function (frames) {
- var i = 0;
- var n = frames.length;
- var found;
- for (; i !== n; ++i) {
- found = frames[i].functionRegistry;
- if (found) {
- return found;
- }
- }
- return functionRegistry;
- }(context.frames)).inherit();
- // push the current ruleset to the frames stack
- var ctxFrames = context.frames;
+ let foundRegistry;
+ for (let fi = 0, fn = ctxFrames.length; fi !== fn; ++fi) {
+ foundRegistry = ctxFrames[fi].functionRegistry;
+ if (foundRegistry) { break; }
+ }
+ ruleset.functionRegistry = (foundRegistry || functionRegistry).inherit();
ctxFrames.unshift(ruleset);
+
// currrent selectors
- var ctxSelectors = context.selectors;
+ let ctxSelectors = context.selectors;
if (!ctxSelectors) {
context.selectors = ctxSelectors = [];
}
ctxSelectors.unshift(this.selectors);
+
// Evaluate imports
if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {
ruleset.evalImports(context);
}
+
// Store the frames around mixin definitions,
// so they can be evaluated like closures when the time comes.
- var rsRules = ruleset.rules;
+ const rsRules = ruleset.rules;
for (i = 0; (rule = rsRules[i]); i++) {
if (rule.evalFirst) {
rsRules[i] = rule.eval(context);
}
}
- var mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;
+
+ const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;
+
// Evaluate mixin calls.
for (i = 0; (rule = rsRules[i]); i++) {
if (rule.type === 'MixinCall') {
/* jshint loopfunc:true */
- rules = rule.eval(context).filter(function (r) {
+ rules = rule.eval(context).filter(function(r) {
if ((r instanceof Declaration) && r.variable) {
// do not pollute the scope if the variable is
// already there. consider returning false here
@@ -6228,10 +7076,9 @@
rsRules.splice.apply(rsRules, [i, 1].concat(rules));
i += rules.length - 1;
ruleset.resetCache();
- }
- else if (rule.type === 'VariableCall') {
+ } else if (rule.type === 'VariableCall') {
/* jshint loopfunc:true */
- rules = rule.eval(context).rules.filter(function (r) {
+ rules = rule.eval(context).rules.filter(function(r) {
if ((r instanceof Declaration) && r.variable) {
// do not pollute the scope at all
return false;
@@ -6243,12 +7090,14 @@
ruleset.resetCache();
}
}
+
// Evaluate everything else
for (i = 0; (rule = rsRules[i]); i++) {
if (!rule.evalFirst) {
rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;
}
}
+
// Evaluate everything else
for (i = 0; (rule = rsRules[i]); i++) {
// for rulesets, check if it is a css guard and can be removed
@@ -6256,7 +7105,8 @@
// check if it can be folded in (e.g. & where)
if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {
rsRules.splice(i--, 1);
- for (var j = 0; (subRule = rule.rules[j]); j++) {
+
+ for (let j = 0; (subRule = rule.rules[j]); j++) {
if (subRule instanceof Node) {
subRule.copyVisibilityInfo(rule.visibilityInfo());
if (!(subRule instanceof Declaration) || !subRule.variable) {
@@ -6267,70 +7117,79 @@
}
}
}
+
// Pop the stack
ctxFrames.shift();
ctxSelectors.shift();
+
if (context.mediaBlocks) {
for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {
context.mediaBlocks[i].bubbleSelectors(selectors);
}
}
+
return ruleset;
},
- evalImports: function (context) {
- var rules = this.rules;
- var i;
- var importRules;
- if (!rules) {
- return;
- }
+
+ evalImports(context) {
+ const rules = this.rules;
+ let i;
+ let importRules;
+ if (!rules) { return; }
+
for (i = 0; i < rules.length; i++) {
if (rules[i].type === 'Import') {
importRules = rules[i].eval(context);
if (importRules && (importRules.length || importRules.length === 0)) {
rules.splice.apply(rules, [i, 1].concat(importRules));
i += importRules.length - 1;
- }
- else {
+ } else {
rules.splice(i, 1, importRules);
}
this.resetCache();
}
}
},
- makeImportant: function () {
- var result = new Ruleset(this.selectors, this.rules.map(function (r) {
+
+ makeImportant() {
+ const result = new Ruleset(this.selectors, this.rules.map(function (r) {
if (r.makeImportant) {
return r.makeImportant();
- }
- else {
+ } else {
return r;
}
}), this.strictImports, this.visibilityInfo());
+
return result;
},
- matchArgs: function (args) {
+
+ matchArgs(args) {
return !args || args.length === 0;
},
+
// lets you call a css selector with a guard
- matchCondition: function (args, context) {
- var lastSelector = this.selectors[this.selectors.length - 1];
+ matchCondition(args, context) {
+ const lastSelector = this.selectors[this.selectors.length - 1];
if (!lastSelector.evaldCondition) {
return false;
}
if (lastSelector.condition &&
- !lastSelector.condition.eval(new contexts.Eval(context, context.frames))) {
+ !lastSelector.condition.eval(
+ new contexts.Eval(context,
+ context.frames))) {
return false;
}
return true;
},
- resetCache: function () {
+
+ resetCache() {
this._rulesets = null;
this._variables = null;
this._properties = null;
this._lookups = {};
},
- variables: function () {
+
+ variables() {
if (!this._variables) {
this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {
if (r instanceof Declaration && r.variable === true) {
@@ -6340,11 +7199,10 @@
// so we need to go inside import statements.
// guard against root being a string (in the case of inlined less)
if (r.type === 'Import' && r.root && r.root.variables) {
- var vars = r.root.variables();
- for (var name_1 in vars) {
- // eslint-disable-next-line no-prototype-builtins
- if (vars.hasOwnProperty(name_1)) {
- hash[name_1] = r.root.variable(name_1);
+ const vars = r.root.variables();
+ for (const name in vars) {
+ if (Object.prototype.hasOwnProperty.call(vars, name)) {
+ hash[name] = r.root.variable(name);
}
}
}
@@ -6353,18 +7211,19 @@
}
return this._variables;
},
- properties: function () {
+
+ properties() {
if (!this._properties) {
this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {
if (r instanceof Declaration && r.variable !== true) {
- var name_2 = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?
+ const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?
r.name[0].value : r.name;
// Properties don't overwrite as they can merge
- if (!hash["$".concat(name_2)]) {
- hash["$".concat(name_2)] = [r];
+ if (!hash[`$${name}`]) {
+ hash[`$${name}`] = [ r ];
}
else {
- hash["$".concat(name_2)].push(r);
+ hash[`$${name}`].push(r);
}
}
return hash;
@@ -6372,45 +7231,52 @@
}
return this._properties;
},
- variable: function (name) {
- var decl = this.variables()[name];
+
+ variable(name) {
+ const decl = this.variables()[name];
if (decl) {
return this.parseValue(decl);
}
},
- property: function (name) {
- var decl = this.properties()[name];
+
+ property(name) {
+ const decl = this.properties()[name];
if (decl) {
return this.parseValue(decl);
}
},
- lastDeclaration: function () {
- for (var i_1 = this.rules.length; i_1 > 0; i_1--) {
- var decl = this.rules[i_1 - 1];
+
+ lastDeclaration() {
+ for (let i = this.rules.length; i > 0; i--) {
+ const decl = this.rules[i - 1];
if (decl instanceof Declaration) {
return this.parseValue(decl);
}
}
},
- parseValue: function (toParse) {
- var self = this;
+
+ parseValue(toParse) {
+ const self = this;
function transformDeclaration(decl) {
if (decl.value instanceof Anonymous && !decl.parsed) {
if (typeof decl.value.value === 'string') {
- new Parser(this.parse.context, this.parse.importManager, decl.fileInfo(), decl.value.getIndex()).parseNode(decl.value.value, ['value', 'important'], function (err, result) {
- if (err) {
- decl.parsed = true;
- }
- if (result) {
- decl.value = result[0];
- decl.important = result[1] || '';
- decl.parsed = true;
- }
- });
- }
- else {
+ new Parser(this.parse.context, this.parse.importManager, decl.fileInfo(), decl.value.getIndex()).parseNode(
+ decl.value.value,
+ ['value', 'important'],
+ function(err, result) {
+ if (err) {
+ decl.parsed = true;
+ }
+ if (result) {
+ decl.value = result[0];
+ decl.important = result[1] || '';
+ decl.parsed = true;
+ }
+ });
+ } else {
decl.parsed = true;
}
+
return decl;
}
else {
@@ -6421,63 +7287,65 @@
return transformDeclaration.call(self, toParse);
}
else {
- var nodes_1 = [];
- toParse.forEach(function (n) {
- nodes_1.push(transformDeclaration.call(self, n));
- });
- return nodes_1;
+ const nodes = [];
+ for (let ti = 0; ti < toParse.length; ti++) {
+ nodes.push(transformDeclaration.call(self, toParse[ti]));
+ }
+ return nodes;
}
},
- rulesets: function () {
- if (!this.rules) {
- return [];
- }
- var filtRules = [];
- var rules = this.rules;
- var i;
- var rule;
+
+ rulesets() {
+ if (!this.rules) { return []; }
+
+ const filtRules = [];
+ const rules = this.rules;
+ let i;
+ let rule;
+
for (i = 0; (rule = rules[i]); i++) {
if (rule.isRuleset) {
filtRules.push(rule);
}
}
+
return filtRules;
},
- prependRule: function (rule) {
- var rules = this.rules;
+
+ prependRule(rule) {
+ const rules = this.rules;
if (rules) {
- rules.unshift(rule);
- }
- else {
- this.rules = [rule];
+ rules.unshift(rule);
+ } else {
+ this.rules = [ rule ];
}
this.setParent(rule, this);
},
- find: function (selector, self, filter) {
+
+ find(selector, self, filter) {
self = self || this;
- var rules = [];
- var match;
- var foundMixins;
- var key = selector.toCSS();
- if (key in this._lookups) {
- return this._lookups[key];
- }
+ const rules = [];
+ let match;
+ let foundMixins;
+ const key = selector.toCSS();
+
+ if (key in this._lookups) { return this._lookups[key]; }
+
this.rulesets().forEach(function (rule) {
if (rule !== self) {
- for (var j = 0; j < rule.selectors.length; j++) {
+ for (let j = 0; j < rule.selectors.length; j++) {
match = selector.match(rule.selectors[j]);
if (match) {
if (selector.elements.length > match) {
if (!filter || filter(rule)) {
foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);
- for (var i_2 = 0; i_2 < foundMixins.length; ++i_2) {
- foundMixins[i_2].path.push(rule);
+ for (let i = 0; i < foundMixins.length; ++i) {
+ foundMixins[i].path.push(rule);
}
Array.prototype.push.apply(rules, foundMixins);
}
- }
- else {
- rules.push({ rule: rule, path: [] });
+ } else {
+ rules.push({ rule, path: []});
}
break;
}
@@ -6487,678 +7355,436 @@
this._lookups[key] = rules;
return rules;
},
- genCSS: function (context, output) {
- var i;
- var j;
- var charsetRuleNodes = [];
- var ruleNodes = [];
- var // Line number debugging
- debugInfo$1;
- var rule;
- var path;
+
+ genCSS(context, output) {
+ let i;
+ let j;
+ const charsetRuleNodes = [];
+ let ruleNodes = [];
+
+ let // Line number debugging
+ debugInfo$1;
+
+ let rule;
+ let path;
+
context.tabLevel = (context.tabLevel || 0);
+
if (!this.root) {
context.tabLevel++;
}
- var tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');
- var tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');
- var sep;
- var charsetNodeIndex = 0;
- var importNodeIndex = 0;
+
+ const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');
+ const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');
+ let sep;
+
+ let charsetNodeIndex = 0;
+ let importNodeIndex = 0;
for (i = 0; (rule = this.rules[i]); i++) {
if (rule instanceof Comment) {
if (importNodeIndex === i) {
importNodeIndex++;
}
ruleNodes.push(rule);
- }
- else if (rule.isCharset && rule.isCharset()) {
+ } else if (rule.isCharset && rule.isCharset()) {
ruleNodes.splice(charsetNodeIndex, 0, rule);
charsetNodeIndex++;
importNodeIndex++;
- }
- else if (rule.type === 'Import') {
+ } else if (rule.type === 'Import') {
ruleNodes.splice(importNodeIndex, 0, rule);
importNodeIndex++;
- }
- else {
+ } else {
ruleNodes.push(rule);
}
}
ruleNodes = charsetRuleNodes.concat(ruleNodes);
+
// If this is the root node, we don't render
// a selector, or {}.
if (!this.root) {
debugInfo$1 = debugInfo(context, this, tabSetStr);
+
if (debugInfo$1) {
output.add(debugInfo$1);
output.add(tabSetStr);
}
- var paths = this.paths;
- var pathCnt = paths.length;
- var pathSubCnt = void 0;
- sep = context.compress ? ',' : (",\n".concat(tabSetStr));
+
+ const paths = this.paths;
+ const pathCnt = paths.length;
+ let pathSubCnt;
+
+ sep = context.compress ? ',' : (`,\n${tabSetStr}`);
+
for (i = 0; i < pathCnt; i++) {
path = paths[i];
- if (!(pathSubCnt = path.length)) {
- continue;
- }
- if (i > 0) {
- output.add(sep);
- }
+ if (!(pathSubCnt = path.length)) { continue; }
+ if (i > 0) { output.add(sep); }
+
context.firstSelector = true;
- path[0].genCSS(context, output);
- context.firstSelector = false;
- for (j = 1; j < pathSubCnt; j++) {
- path[j].genCSS(context, output);
- }
- }
- output.add((context.compress ? '{' : ' {\n') + tabRuleStr);
- }
- // Compile rules and rulesets
- for (i = 0; (rule = ruleNodes[i]); i++) {
- if (i + 1 === ruleNodes.length) {
- context.lastRule = true;
- }
- var currentLastRule = context.lastRule;
- if (rule.isRulesetLike(rule)) {
- context.lastRule = false;
- }
- if (rule.genCSS) {
- rule.genCSS(context, output);
- }
- else if (rule.value) {
- output.add(rule.value.toString());
- }
- context.lastRule = currentLastRule;
- if (!context.lastRule && rule.isVisible()) {
- output.add(context.compress ? '' : ("\n".concat(tabRuleStr)));
- }
- else {
- context.lastRule = false;
- }
- }
- if (!this.root) {
- output.add((context.compress ? '}' : "\n".concat(tabSetStr, "}")));
- context.tabLevel--;
- }
- if (!output.isEmpty() && !context.compress && this.firstRoot) {
- output.add('\n');
- }
- },
- joinSelectors: function (paths, context, selectors) {
- for (var s = 0; s < selectors.length; s++) {
- this.joinSelector(paths, context, selectors[s]);
- }
- },
- joinSelector: function (paths, context, selector) {
- function createParenthesis(elementsToPak, originalElement) {
- var replacementParen, j;
- if (elementsToPak.length === 0) {
- replacementParen = new Paren(elementsToPak[0]);
- }
- else {
- var insideParent = new Array(elementsToPak.length);
- for (j = 0; j < elementsToPak.length; j++) {
- insideParent[j] = new Element(null, elementsToPak[j], originalElement.isVariable, originalElement._index, originalElement._fileInfo);
- }
- replacementParen = new Paren(new Selector(insideParent));
- }
- return replacementParen;
- }
- function createSelector(containedElement, originalElement) {
- var element, selector;
- element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);
- selector = new Selector([element]);
- return selector;
- }
- // joins selector path from `beginningPath` with selector path in `addPath`
- // `replacedElement` contains element that is being replaced by `addPath`
- // returns concatenated path
- function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {
- var newSelectorPath, lastSelector, newJoinedSelector;
- // our new selector path
- newSelectorPath = [];
- // construct the joined selector - if & is the first thing this will be empty,
- // if not newJoinedSelector will be the last set of elements in the selector
- if (beginningPath.length > 0) {
- newSelectorPath = copyArray(beginningPath);
- lastSelector = newSelectorPath.pop();
- newJoinedSelector = originalSelector.createDerived(copyArray(lastSelector.elements));
- }
- else {
- newJoinedSelector = originalSelector.createDerived([]);
- }
- if (addPath.length > 0) {
- // /deep/ is a CSS4 selector - (removed, so should deprecate)
- // that is valid without anything in front of it
- // so if the & does not have a combinator that is "" or " " then
- // and there is a combinator on the parent, then grab that.
- // this also allows + a { & .b { .a & { ... though not sure why you would want to do that
- var combinator = replacedElement.combinator;
- var parentEl = addPath[0].elements[0];
- if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {
- combinator = parentEl.combinator;
- }
- // join the elements so far with the first part of the parent
- newJoinedSelector.elements.push(new Element(combinator, parentEl.value, replacedElement.isVariable, replacedElement._index, replacedElement._fileInfo));
- newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));
- }
- // now add the joined selector - but only if it is not empty
- if (newJoinedSelector.elements.length !== 0) {
- newSelectorPath.push(newJoinedSelector);
- }
- // put together the parent selectors after the join (e.g. the rest of the parent)
- if (addPath.length > 1) {
- var restOfPath = addPath.slice(1);
- restOfPath = restOfPath.map(function (selector) {
- return selector.createDerived(selector.elements, []);
- });
- newSelectorPath = newSelectorPath.concat(restOfPath);
- }
- return newSelectorPath;
- }
- // joins selector path from `beginningPath` with every selector path in `addPaths` array
- // `replacedElement` contains element that is being replaced by `addPath`
- // returns array with all concatenated paths
- function addAllReplacementsIntoPath(beginningPath, addPaths, replacedElement, originalSelector, result) {
- var j;
- for (j = 0; j < beginningPath.length; j++) {
- var newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);
- result.push(newSelectorPath);
- }
- return result;
- }
- function mergeElementsOnToSelectors(elements, selectors) {
- var i, sel;
- if (elements.length === 0) {
- return;
- }
- if (selectors.length === 0) {
- selectors.push([new Selector(elements)]);
- return;
- }
- for (i = 0; (sel = selectors[i]); i++) {
- // if the previous thing in sel is a parent this needs to join on to it
- if (sel.length > 0) {
- sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));
- }
- else {
- sel.push(new Selector(elements));
- }
- }
- }
- // replace all parent selectors inside `inSelector` by content of `context` array
- // resulting selectors are returned inside `paths` array
- // returns true if `inSelector` contained at least one parent selector
- function replaceParentSelector(paths, context, inSelector) {
- // The paths are [[Selector]]
- // The first list is a list of comma separated selectors
- // The inner list is a list of inheritance separated selectors
- // e.g.
- // .a, .b {
- // .c {
- // }
- // }
- // == [[.a] [.c]] [[.b] [.c]]
- //
- var i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;
- function findNestedSelector(element) {
- var maybeSelector;
- if (!(element.value instanceof Paren)) {
- return null;
- }
- maybeSelector = element.value.value;
- if (!(maybeSelector instanceof Selector)) {
- return null;
- }
- return maybeSelector;
- }
- // the elements from the current selector so far
- currentElements = [];
- // the current list of new selectors to add to the path.
- // We will build it up. We initiate it with one empty selector as we "multiply" the new selectors
- // by the parents
- newSelectors = [
- []
- ];
- for (i = 0; (el = inSelector.elements[i]); i++) {
- // non parent reference elements just get added
- if (el.value !== '&') {
- var nestedSelector = findNestedSelector(el);
- if (nestedSelector !== null) {
- // merge the current list of non parent selector elements
- // on to the current list of selectors to add
- mergeElementsOnToSelectors(currentElements, newSelectors);
- var nestedPaths = [];
- var replaced = void 0;
- var replacedNewSelectors = [];
- replaced = replaceParentSelector(nestedPaths, context, nestedSelector);
- hadParentSelector = hadParentSelector || replaced;
- // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors
- for (k = 0; k < nestedPaths.length; k++) {
- var replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);
- addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);
- }
- newSelectors = replacedNewSelectors;
- currentElements = [];
- }
- else {
- currentElements.push(el);
- }
- }
- else {
- hadParentSelector = true;
- // the new list of selectors to add
- selectorsMultiplied = [];
- // merge the current list of non parent selector elements
- // on to the current list of selectors to add
- mergeElementsOnToSelectors(currentElements, newSelectors);
- // loop through our current selectors
- for (j = 0; j < newSelectors.length; j++) {
- sel = newSelectors[j];
- // if we don't have any parent paths, the & might be in a mixin so that it can be used
- // whether there are parents or not
- if (context.length === 0) {
- // the combinator used on el should now be applied to the next element instead so that
- // it is not lost
- if (sel.length > 0) {
- sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));
- }
- selectorsMultiplied.push(sel);
- }
- else {
- // and the parent selectors
- for (k = 0; k < context.length; k++) {
- // We need to put the current selectors
- // then join the last selector's elements on to the parents selectors
- var newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);
- // add that to our new set of selectors
- selectorsMultiplied.push(newSelectorPath);
- }
- }
- }
- // our new selectors has been multiplied, so reset the state
- newSelectors = selectorsMultiplied;
- currentElements = [];
- }
- }
- // if we have any elements left over (e.g. .a& .b == .b)
- // add them on to all the current selectors
- mergeElementsOnToSelectors(currentElements, newSelectors);
- for (i = 0; i < newSelectors.length; i++) {
- length = newSelectors[i].length;
- if (length > 0) {
- paths.push(newSelectors[i]);
- lastSelector = newSelectors[i][length - 1];
- newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);
- }
- }
- return hadParentSelector;
- }
- function deriveSelector(visibilityInfo, deriveFrom) {
- var newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);
- newSelector.copyVisibilityInfo(visibilityInfo);
- return newSelector;
- }
- // joinSelector code follows
- var i, newPaths, hadParentSelector;
- newPaths = [];
- hadParentSelector = replaceParentSelector(newPaths, context, selector);
- if (!hadParentSelector) {
- if (context.length > 0) {
- newPaths = [];
- for (i = 0; i < context.length; i++) {
- var concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));
- concatenated.push(selector);
- newPaths.push(concatenated);
+ path[0].genCSS(context, output);
+
+ context.firstSelector = false;
+ for (j = 1; j < pathSubCnt; j++) {
+ path[j].genCSS(context, output);
}
}
- else {
- newPaths = [[selector]];
- }
- }
- for (i = 0; i < newPaths.length; i++) {
- paths.push(newPaths[i]);
- }
- }
- });
- var Unit = function (numerator, denominator, backupUnit) {
- this.numerator = numerator ? copyArray(numerator).sort() : [];
- this.denominator = denominator ? copyArray(denominator).sort() : [];
- if (backupUnit) {
- this.backupUnit = backupUnit;
- }
- else if (numerator && numerator.length) {
- this.backupUnit = numerator[0];
- }
- };
- Unit.prototype = Object.assign(new Node(), {
- type: 'Unit',
- clone: function () {
- return new Unit(copyArray(this.numerator), copyArray(this.denominator), this.backupUnit);
- },
- genCSS: function (context, output) {
- // Dimension checks the unit is singular and throws an error if in strict math mode.
- var strictUnits = context && context.strictUnits;
- if (this.numerator.length === 1) {
- output.add(this.numerator[0]); // the ideal situation
- }
- else if (!strictUnits && this.backupUnit) {
- output.add(this.backupUnit);
- }
- else if (!strictUnits && this.denominator.length) {
- output.add(this.denominator[0]);
+ output.add((context.compress ? '{' : ' {\n') + tabRuleStr);
}
- },
- toString: function () {
- var i, returnStr = this.numerator.join('*');
- for (i = 0; i < this.denominator.length; i++) {
- returnStr += "/".concat(this.denominator[i]);
+
+ // Compile rules and rulesets
+ for (i = 0; (rule = ruleNodes[i]); i++) {
+
+ if (i + 1 === ruleNodes.length) {
+ context.lastRule = true;
+ }
+
+ const currentLastRule = context.lastRule;
+ if (rule.isRulesetLike(rule)) {
+ context.lastRule = false;
+ }
+
+ if (rule.genCSS) {
+ rule.genCSS(context, output);
+ } else if (rule.value) {
+ output.add(rule.value.toString());
+ }
+
+ context.lastRule = currentLastRule;
+
+ if (!context.lastRule && rule.isVisible()) {
+ output.add(context.compress ? '' : (`\n${tabRuleStr}`));
+ } else {
+ context.lastRule = false;
+ }
}
- return returnStr;
- },
- compare: function (other) {
- return this.is(other.toString()) ? 0 : undefined;
- },
- is: function (unitString) {
- return this.toString().toUpperCase() === unitString.toUpperCase();
- },
- isLength: function () {
- return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());
- },
- isEmpty: function () {
- return this.numerator.length === 0 && this.denominator.length === 0;
- },
- isSingular: function () {
- return this.numerator.length <= 1 && this.denominator.length === 0;
- },
- map: function (callback) {
- var i;
- for (i = 0; i < this.numerator.length; i++) {
- this.numerator[i] = callback(this.numerator[i], false);
+
+ if (!this.root) {
+ output.add((context.compress ? '}' : `\n${tabSetStr}}`));
+ context.tabLevel--;
}
- for (i = 0; i < this.denominator.length; i++) {
- this.denominator[i] = callback(this.denominator[i], true);
+
+ if (!output.isEmpty() && !context.compress && this.firstRoot) {
+ output.add('\n');
}
},
- usedUnits: function () {
- var group;
- var result = {};
- var mapUnit;
- var groupName;
- mapUnit = function (atomicUnit) {
- // eslint-disable-next-line no-prototype-builtins
- if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {
- result[groupName] = atomicUnit;
- }
- return atomicUnit;
- };
- for (groupName in unitConversions) {
- // eslint-disable-next-line no-prototype-builtins
- if (unitConversions.hasOwnProperty(groupName)) {
- group = unitConversions[groupName];
- this.map(mapUnit);
- }
+
+ joinSelectors(paths, context, selectors) {
+ for (let s = 0; s < selectors.length; s++) {
+ this.joinSelector(paths, context, selectors[s]);
}
- return result;
},
- cancel: function () {
- var counter = {};
- var atomicUnit;
- var i;
- for (i = 0; i < this.numerator.length; i++) {
- atomicUnit = this.numerator[i];
- counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;
- }
- for (i = 0; i < this.denominator.length; i++) {
- atomicUnit = this.denominator[i];
- counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;
- }
- this.numerator = [];
- this.denominator = [];
- for (atomicUnit in counter) {
- // eslint-disable-next-line no-prototype-builtins
- if (counter.hasOwnProperty(atomicUnit)) {
- var count = counter[atomicUnit];
- if (count > 0) {
- for (i = 0; i < count; i++) {
- this.numerator.push(atomicUnit);
- }
- }
- else if (count < 0) {
- for (i = 0; i < -count; i++) {
- this.denominator.push(atomicUnit);
- }
+
+ joinSelector(paths, context, selector) {
+
+ function createParenthesis(elementsToPak, originalElement) {
+ let replacementParen, j;
+ if (elementsToPak.length === 0) {
+ replacementParen = new Paren(elementsToPak[0]);
+ } else {
+ const insideParent = new Array(elementsToPak.length);
+ for (j = 0; j < elementsToPak.length; j++) {
+ insideParent[j] = new Element(
+ null,
+ elementsToPak[j],
+ originalElement.isVariable,
+ originalElement._index,
+ originalElement._fileInfo
+ );
}
+ replacementParen = new Paren(new Selector(insideParent));
}
+ return replacementParen;
}
- this.numerator.sort();
- this.denominator.sort();
- }
- });
- /* eslint-disable no-prototype-builtins */
- //
- // A number with a unit
- //
- var Dimension = function (value, unit) {
- this.value = parseFloat(value);
- if (isNaN(this.value)) {
- throw new Error('Dimension is not a number.');
- }
- this.unit = (unit && unit instanceof Unit) ? unit :
- new Unit(unit ? [unit] : undefined);
- this.setParent(this.unit, this);
- };
- Dimension.prototype = Object.assign(new Node(), {
- type: 'Dimension',
- accept: function (visitor) {
- this.unit = visitor.visit(this.unit);
- },
- // remove when Nodes have JSDoc types
- // eslint-disable-next-line no-unused-vars
- eval: function (context) {
- return this;
- },
- toColor: function () {
- return new Color([this.value, this.value, this.value]);
- },
- genCSS: function (context, output) {
- if ((context && context.strictUnits) && !this.unit.isSingular()) {
- throw new Error("Multiple units in dimension. Correct the units or use the unit function. Bad unit: ".concat(this.unit.toString()));
- }
- var value = this.fround(context, this.value);
- var strValue = String(value);
- if (value !== 0 && value < 0.000001 && value > -0.000001) {
- // would be output 1e-6 etc.
- strValue = value.toFixed(20).replace(/0+$/, '');
+ function createSelector(containedElement, originalElement) {
+ let element, selector;
+ element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);
+ selector = new Selector([element]);
+ return selector;
}
- if (context && context.compress) {
- // Zero values doesn't need a unit
- if (value === 0 && this.unit.isLength()) {
- output.add(strValue);
- return;
+
+ // joins selector path from `beginningPath` with selector path in `addPath`
+ // `replacedElement` contains element that is being replaced by `addPath`
+ // returns concatenated path
+ function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {
+ let newSelectorPath, lastSelector, newJoinedSelector;
+ // our new selector path
+ newSelectorPath = [];
+
+ // construct the joined selector - if & is the first thing this will be empty,
+ // if not newJoinedSelector will be the last set of elements in the selector
+ if (beginningPath.length > 0) {
+ newSelectorPath = copyArray(beginningPath);
+ lastSelector = newSelectorPath.pop();
+ newJoinedSelector = originalSelector.createDerived(copyArray(lastSelector.elements));
}
- // Float values doesn't need a leading zero
- if (value > 0 && value < 1) {
- strValue = (strValue).substr(1);
+ else {
+ newJoinedSelector = originalSelector.createDerived([]);
}
- }
- output.add(strValue);
- this.unit.genCSS(context, output);
- },
- // In an operation between two Dimensions,
- // we default to the first Dimension's unit,
- // so `1px + 2` will yield `3px`.
- operate: function (context, op, other) {
- /* jshint noempty:false */
- var value = this._operate(context, op, this.value, other.value);
- var unit = this.unit.clone();
- if (op === '+' || op === '-') {
- if (unit.numerator.length === 0 && unit.denominator.length === 0) {
- unit = other.unit.clone();
- if (this.unit.backupUnit) {
- unit.backupUnit = this.unit.backupUnit;
+
+ if (addPath.length > 0) {
+ // /deep/ is a CSS4 selector - (removed, so should deprecate)
+ // that is valid without anything in front of it
+ // so if the & does not have a combinator that is "" or " " then
+ // and there is a combinator on the parent, then grab that.
+ // this also allows + a { & .b { .a & { ... though not sure why you would want to do that
+ let combinator = replacedElement.combinator;
+
+ const parentEl = addPath[0].elements[0];
+ if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {
+ combinator = parentEl.combinator;
}
+ // join the elements so far with the first part of the parent
+ newJoinedSelector.elements.push(new Element(
+ combinator,
+ parentEl.value,
+ replacedElement.isVariable,
+ replacedElement._index,
+ replacedElement._fileInfo
+ ));
+ newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));
}
- else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) ;
- else {
- other = other.convertTo(this.unit.usedUnits());
- if (context.strictUnits && other.unit.toString() !== unit.toString()) {
- throw new Error('Incompatible units. Change the units or use the unit function. '
- + "Bad units: '".concat(unit.toString(), "' and '").concat(other.unit.toString(), "'."));
- }
- value = this._operate(context, op, this.value, other.value);
+
+ // now add the joined selector - but only if it is not empty
+ if (newJoinedSelector.elements.length !== 0) {
+ newSelectorPath.push(newJoinedSelector);
}
+
+ // put together the parent selectors after the join (e.g. the rest of the parent)
+ if (addPath.length > 1) {
+ let restOfPath = addPath.slice(1);
+ restOfPath = restOfPath.map(function (selector) {
+ return selector.createDerived(selector.elements, []);
+ });
+ newSelectorPath = newSelectorPath.concat(restOfPath);
+ }
+ return newSelectorPath;
}
- else if (op === '*') {
- unit.numerator = unit.numerator.concat(other.unit.numerator).sort();
- unit.denominator = unit.denominator.concat(other.unit.denominator).sort();
- unit.cancel();
- }
- else if (op === '/') {
- unit.numerator = unit.numerator.concat(other.unit.denominator).sort();
- unit.denominator = unit.denominator.concat(other.unit.numerator).sort();
- unit.cancel();
- }
- return new Dimension(value, unit);
- },
- compare: function (other) {
- var a, b;
- if (!(other instanceof Dimension)) {
- return undefined;
- }
- if (this.unit.isEmpty() || other.unit.isEmpty()) {
- a = this;
- b = other;
- }
- else {
- a = this.unify();
- b = other.unify();
- if (a.unit.compare(b.unit) !== 0) {
- return undefined;
+
+ // joins selector path from `beginningPath` with every selector path in `addPaths` array
+ // `replacedElement` contains element that is being replaced by `addPath`
+ // returns array with all concatenated paths
+ function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {
+ let j;
+ for (j = 0; j < beginningPath.length; j++) {
+ const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);
+ result.push(newSelectorPath);
}
+ return result;
}
- return Node.numericCompare(a.value, b.value);
- },
- unify: function () {
- return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });
- },
- convertTo: function (conversions) {
- var value = this.value;
- var unit = this.unit.clone();
- var i;
- var groupName;
- var group;
- var targetUnit;
- var derivedConversions = {};
- var applyUnit;
- if (typeof conversions === 'string') {
- for (i in unitConversions) {
- if (unitConversions[i].hasOwnProperty(conversions)) {
- derivedConversions = {};
- derivedConversions[i] = conversions;
+
+ function mergeElementsOnToSelectors(elements, selectors) {
+ let i, sel;
+
+ if (elements.length === 0) {
+ return ;
+ }
+ if (selectors.length === 0) {
+ selectors.push([ new Selector(elements) ]);
+ return;
+ }
+
+ for (i = 0; (sel = selectors[i]); i++) {
+ // if the previous thing in sel is a parent this needs to join on to it
+ if (sel.length > 0) {
+ sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));
+ }
+ else {
+ sel.push(new Selector(elements));
}
}
- conversions = derivedConversions;
}
- applyUnit = function (atomicUnit, denominator) {
- if (group.hasOwnProperty(atomicUnit)) {
- if (denominator) {
- value = value / (group[atomicUnit] / group[targetUnit]);
+
+ // replace all parent selectors inside `inSelector` by content of `context` array
+ // resulting selectors are returned inside `paths` array
+ // returns true if `inSelector` contained at least one parent selector
+ function replaceParentSelector(paths, context, inSelector) {
+ // The paths are [[Selector]]
+ // The first list is a list of comma separated selectors
+ // The inner list is a list of inheritance separated selectors
+ // e.g.
+ // .a, .b {
+ // .c {
+ // }
+ // }
+ // == [[.a] [.c]] [[.b] [.c]]
+ //
+ let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;
+ function findNestedSelector(element) {
+ let maybeSelector;
+ if (!(element.value instanceof Paren)) {
+ return null;
}
- else {
- value = value * (group[atomicUnit] / group[targetUnit]);
+
+ maybeSelector = element.value.value;
+ if (!(maybeSelector instanceof Selector)) {
+ return null;
}
- return targetUnit;
+
+ return maybeSelector;
}
- return atomicUnit;
- };
- for (groupName in conversions) {
- if (conversions.hasOwnProperty(groupName)) {
- targetUnit = conversions[groupName];
- group = unitConversions[groupName];
- unit.map(applyUnit);
+
+ // the elements from the current selector so far
+ currentElements = [];
+ // the current list of new selectors to add to the path.
+ // We will build it up. We initiate it with one empty selector as we "multiply" the new selectors
+ // by the parents
+ newSelectors = [
+ []
+ ];
+
+ for (i = 0; (el = inSelector.elements[i]); i++) {
+ // non parent reference elements just get added
+ if (el.value !== '&') {
+ const nestedSelector = findNestedSelector(el);
+ if (nestedSelector !== null) {
+ // merge the current list of non parent selector elements
+ // on to the current list of selectors to add
+ mergeElementsOnToSelectors(currentElements, newSelectors);
+
+ const nestedPaths = [];
+ let replaced;
+ const replacedNewSelectors = [];
+
+ // Check if this is a comma-separated selector list inside the paren
+ // e.g. :not(&.a, &.b) produces Selector([Selector, Anonymous(','), Selector])
+ const hasSubSelectors = nestedSelector.elements.some(e => e instanceof Selector);
+
+ if (hasSubSelectors) {
+ // Process each sub-selector individually
+ const resolvedElements = [];
+ for (const subEl of nestedSelector.elements) {
+ if (subEl instanceof Selector) {
+ const subPaths = [];
+ const subReplaced = replaceParentSelector(subPaths, context, subEl);
+ replaced = replaced || subReplaced;
+ if (subPaths.length > 0 && subPaths[0].length > 0) {
+ resolvedElements.push(subPaths[0][0]);
+ } else {
+ resolvedElements.push(subEl);
+ }
+ } else {
+ resolvedElements.push(subEl);
+ }
+ }
+ hadParentSelector = hadParentSelector || replaced;
+ const resolvedNestedSelector = new Selector(resolvedElements);
+ const replacementSelector = createSelector(createParenthesis([resolvedNestedSelector], el), el);
+ addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);
+ } else {
+ replaced = replaceParentSelector(nestedPaths, context, nestedSelector);
+ hadParentSelector = hadParentSelector || replaced;
+ // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors
+ for (k = 0; k < nestedPaths.length; k++) {
+ const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);
+ addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);
+ }
+ }
+ newSelectors = replacedNewSelectors;
+ currentElements = [];
+ } else {
+ currentElements.push(el);
+ }
+
+ } else {
+ hadParentSelector = true;
+ // the new list of selectors to add
+ selectorsMultiplied = [];
+
+ // merge the current list of non parent selector elements
+ // on to the current list of selectors to add
+ mergeElementsOnToSelectors(currentElements, newSelectors);
+
+ // loop through our current selectors
+ for (j = 0; j < newSelectors.length; j++) {
+ sel = newSelectors[j];
+ // if we don't have any parent paths, the & might be in a mixin so that it can be used
+ // whether there are parents or not
+ if (context.length === 0) {
+ // the combinator used on el should now be applied to the next element instead so that
+ // it is not lost
+ if (sel.length > 0) {
+ sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));
+ }
+ selectorsMultiplied.push(sel);
+ }
+ else {
+ // and the parent selectors
+ for (k = 0; k < context.length; k++) {
+ // We need to put the current selectors
+ // then join the last selector's elements on to the parents selectors
+ const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);
+ // add that to our new set of selectors
+ selectorsMultiplied.push(newSelectorPath);
+ }
+ }
+ }
+
+ // our new selectors has been multiplied, so reset the state
+ newSelectors = selectorsMultiplied;
+ currentElements = [];
+ }
}
- }
- unit.cancel();
- return new Dimension(value, unit);
- }
- });
- var Expression = function (value, noSpacing) {
- this.value = value;
- this.noSpacing = noSpacing;
- if (!value) {
- throw new Error('Expression requires an array parameter');
- }
- };
- Expression.prototype = Object.assign(new Node(), {
- type: 'Expression',
- accept: function (visitor) {
- this.value = visitor.visitArray(this.value);
- },
- eval: function (context) {
- var noSpacing = this.noSpacing;
- var returnValue;
- var mathOn = context.isMathOn();
- var inParenthesis = this.parens;
- var doubleParen = false;
- if (inParenthesis) {
- context.inParenthesis();
- }
- if (this.value.length > 1) {
- returnValue = new Expression(this.value.map(function (e) {
- if (!e.eval) {
- return e;
+ // if we have any elements left over (e.g. .a& .b == .b)
+ // add them on to all the current selectors
+ mergeElementsOnToSelectors(currentElements, newSelectors);
+
+ for (i = 0; i < newSelectors.length; i++) {
+ length = newSelectors[i].length;
+ if (length > 0) {
+ paths.push(newSelectors[i]);
+ lastSelector = newSelectors[i][length - 1];
+ newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);
}
- return e.eval(context);
- }), this.noSpacing);
- }
- else if (this.value.length === 1) {
- if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {
- doubleParen = true;
}
- returnValue = this.value[0].eval(context);
- }
- else {
- returnValue = this;
- }
- if (inParenthesis) {
- context.outOfParenthesis();
+
+ return hadParentSelector;
}
- if (this.parens && this.parensInOp && !mathOn && !doubleParen
- && (!(returnValue instanceof Dimension))) {
- returnValue = new Paren(returnValue);
+
+ function deriveSelector(visibilityInfo, deriveFrom) {
+ const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);
+ newSelector.copyVisibilityInfo(visibilityInfo);
+ return newSelector;
}
- returnValue.noSpacing = returnValue.noSpacing || noSpacing;
- return returnValue;
- },
- genCSS: function (context, output) {
- for (var i_1 = 0; i_1 < this.value.length; i_1++) {
- this.value[i_1].genCSS(context, output);
- if (!this.noSpacing && i_1 + 1 < this.value.length) {
- if (i_1 + 1 < this.value.length && !(this.value[i_1 + 1] instanceof Anonymous) ||
- this.value[i_1 + 1] instanceof Anonymous && this.value[i_1 + 1].value !== ',') {
- output.add(' ');
+
+ // joinSelector code follows
+ let i, newPaths, hadParentSelector;
+
+ newPaths = [];
+ hadParentSelector = replaceParentSelector(newPaths, context, selector);
+
+ if (!hadParentSelector) {
+ if (context.length > 0) {
+ newPaths = [];
+ for (i = 0; i < context.length; i++) {
+
+ const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));
+
+ concatenated.push(selector);
+ newPaths.push(concatenated);
}
}
+ else {
+ newPaths = [[selector]];
+ }
}
- },
- throwAwayComments: function () {
- this.value = this.value.filter(function (v) {
- return !(v instanceof Comment);
- });
+
+ for (i = 0; i < newPaths.length; i++) {
+ paths.push(newPaths[i]);
+ }
+
}
});
- var NestableAtRulePrototype = {
- isRulesetLike: function () {
+ const NestableAtRulePrototype = {
+
+ isRulesetLike() {
return true;
},
- accept: function (visitor) {
+
+ accept(visitor) {
if (this.features) {
this.features = visitor.visit(this.features);
}
@@ -7166,54 +7792,74 @@
this.rules = visitor.visitArray(this.rules);
}
},
+
evalFunction: function () {
if (!this.features || !Array.isArray(this.features.value) || this.features.value.length < 1) {
return;
}
- var exprValues = this.features.value;
- var expr, paren;
- for (var index = 0; index < exprValues.length; ++index) {
+
+ const exprValues = this.features.value;
+ let expr, paren;
+
+ for (let index = 0; index < exprValues.length; ++index) {
expr = exprValues[index];
- if (expr.type === 'Keyword' && index + 1 < exprValues.length && (expr.noSpacing || expr.noSpacing == null)) {
- paren = exprValues[index + 1];
- if (paren.type === 'Paren' && paren.noSpacing) {
- exprValues[index] = new Expression([expr, paren]);
+
+ if ((expr.type === 'Keyword' || expr.type === 'Variable')
+ && index + 1 < exprValues.length
+ && (expr.noSpacing || expr.noSpacing == null)) {
+ paren = exprValues[index + 1];
+
+ if (paren.type === 'Paren' && paren.noSpacing) {
+ exprValues[index]= new Expression([expr, paren]);
exprValues.splice(index + 1, 1);
exprValues[index].noSpacing = true;
}
}
}
},
- evalTop: function (context) {
+
+ evalTop(context) {
this.evalFunction();
- var result = this;
+
+ let result = this;
+
// Render all dependent Media blocks.
if (context.mediaBlocks.length > 1) {
- var selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();
+ const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();
result = new Ruleset(selectors, context.mediaBlocks);
result.multiMedia = true;
result.copyVisibilityInfo(this.visibilityInfo());
this.setParent(result, this);
}
+
delete context.mediaBlocks;
delete context.mediaPath;
+
return result;
},
- evalNested: function (context) {
+
+ evalNested(context) {
this.evalFunction();
- var i;
- var value;
- var path = context.mediaPath.concat([this]);
+
+ let i;
+ let value;
+ const path = context.mediaPath.concat([this]);
+
// Extract the media-query conditions separated with `,` (OR).
for (i = 0; i < path.length; i++) {
if (path[i].type !== this.type) {
- context.mediaBlocks.splice(i, 1);
+ const blockIndex = context.mediaBlocks.indexOf(this);
+ if (blockIndex > -1) {
+ context.mediaBlocks.splice(blockIndex, 1);
+ }
return this;
}
+
value = path[i].features instanceof Value ?
path[i].features.value : path[i].features;
path[i] = Array.isArray(value) ? value : [value];
}
+
// Trace all permutations to generate the resulting media-query.
//
// (a, b and c) with nested (d, e) ->
@@ -7221,36 +7867,39 @@
// a and e
// b and c and d
// b and c and e
- this.features = new Value(this.permute(path).map(function (path) {
- path = path.map(function (fragment) { return fragment.toCSS ? fragment : new Anonymous(fragment); });
+ this.features = new Value(this.permute(path).map(path => {
+ path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));
+
for (i = path.length - 1; i > 0; i--) {
path.splice(i, 0, new Anonymous('and'));
}
+
return new Expression(path);
}));
this.setParent(this.features, this);
+
// Fake a tree-node that doesn't output anything.
return new Ruleset([], []);
},
- permute: function (arr) {
+
+ permute(arr) {
if (arr.length === 0) {
return [];
- }
- else if (arr.length === 1) {
+ } else if (arr.length === 1) {
return arr[0];
- }
- else {
- var result = [];
- var rest = this.permute(arr.slice(1));
- for (var i_1 = 0; i_1 < rest.length; i_1++) {
- for (var j = 0; j < arr[0].length; j++) {
- result.push([arr[0][j]].concat(rest[i_1]));
+ } else {
+ const result = [];
+ const rest = this.permute(arr.slice(1));
+ for (let i = 0; i < rest.length; i++) {
+ for (let j = 0; j < arr[0].length; j++) {
+ result.push([arr[0][j]].concat(rest[i]));
}
}
return result;
}
},
- bubbleSelectors: function (selectors) {
+
+ bubbleSelectors(selectors) {
if (!selectors) {
return;
}
@@ -7259,39 +7908,46 @@
}
};
- var AtRule = function (name, value, rules, index, currentFileInfo, debugInfo, isRooted, visibilityInfo) {
- var _this = this;
- var i;
+ const AtRule = function(
+ name,
+ value,
+ rules,
+ index,
+ currentFileInfo,
+ debugInfo,
+ isRooted,
+ visibilityInfo
+ ) {
+ let i;
var selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();
- this.name = name;
+
+ this.name = name;
this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);
if (rules) {
if (Array.isArray(rules)) {
- var allDeclarations = this.declarationsBlock(rules);
- var allRulesetDeclarations_1 = true;
- rules.forEach(function (rule) {
- if (rule.type === 'Ruleset' && rule.rules)
- allRulesetDeclarations_1 = allRulesetDeclarations_1 && _this.declarationsBlock(rule.rules, true);
+ const allDeclarations = this.declarationsBlock(rules);
+
+ let allRulesetDeclarations = true;
+ rules.forEach(rule => {
+ if (rule.type === 'Ruleset' && rule.rules) allRulesetDeclarations = allRulesetDeclarations && this.declarationsBlock(rule.rules, true);
});
+
if (allDeclarations && !isRooted) {
this.simpleBlock = true;
this.declarations = rules;
- }
- else if (allRulesetDeclarations_1 && rules.length === 1 && !isRooted && !value) {
+ } else if (allRulesetDeclarations && rules.length === 1 && !isRooted && !value) {
this.simpleBlock = true;
this.declarations = rules[0].rules ? rules[0].rules : rules;
- }
- else {
+ } else {
this.rules = rules;
}
- }
- else {
- var allDeclarations = this.declarationsBlock(rules.rules);
+ } else {
+ const allDeclarations = this.declarationsBlock(rules.rules);
+
if (allDeclarations && !isRooted && !value) {
this.simpleBlock = true;
this.declarations = rules.rules;
- }
- else {
+ } else {
this.rules = [rules];
this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();
}
@@ -7311,38 +7967,51 @@
this.copyVisibilityInfo(visibilityInfo);
this.allowRoot = true;
};
- AtRule.prototype = Object.assign(new Node(), __assign(__assign({ type: 'AtRule' }, NestableAtRulePrototype), { declarationsBlock: function (rules, mergeable) {
- if (mergeable === void 0) { mergeable = false; }
+
+ AtRule.prototype = Object.assign(new Node(), {
+ type: 'AtRule',
+
+ ...NestableAtRulePrototype,
+
+ declarationsBlock(rules, mergeable = false) {
if (!mergeable) {
- return rules.filter(function (node) { return (node.type === 'Declaration' || node.type === 'Comment') && !node.merge; }).length === rules.length;
- }
- else {
+ return rules.filter(function (node) { return (node.type === 'Declaration' || node.type === 'Comment') && !node.merge}).length === rules.length;
+ } else {
return rules.filter(function (node) { return (node.type === 'Declaration' || node.type === 'Comment'); }).length === rules.length;
}
- }, keywordList: function (rules) {
+ },
+
+ keywordList(rules) {
if (!Array.isArray(rules)) {
return false;
- }
- else {
+ } else {
return rules.filter(function (node) { return (node.type === 'Keyword' || node.type === 'Comment'); }).length === rules.length;
}
- }, accept: function (visitor) {
- var value = this.value, rules = this.rules, declarations = this.declarations;
+ },
+
+ accept(visitor) {
+ const value = this.value, rules = this.rules, declarations = this.declarations;
+
if (rules) {
this.rules = visitor.visitArray(rules);
- }
- else if (declarations) {
- this.declarations = visitor.visitArray(declarations);
+ } else if (declarations) {
+ this.declarations = visitor.visitArray(declarations);
}
if (value) {
this.value = visitor.visit(value);
}
- }, isRulesetLike: function () {
+ },
+
+ isRulesetLike() {
return this.rules || !this.isCharset();
- }, isCharset: function () {
+ },
+
+ isCharset() {
return '@charset' === this.name;
- }, genCSS: function (context, output) {
- var value = this.value, rules = this.rules || this.declarations;
+ },
+
+ genCSS(context, output) {
+ const value = this.value, rules = this.rules || this.declarations;
output.add(this.name, this.fileInfo(), this.getIndex());
if (value) {
output.add(' ');
@@ -7350,15 +8019,16 @@
}
if (this.simpleBlock) {
this.outputRuleset(context, output, this.declarations);
- }
- else if (rules) {
+ } else if (rules) {
this.outputRuleset(context, output, rules);
- }
- else {
+ } else {
output.add(';');
}
- }, eval: function (context) {
- var mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules || this.declarations;
+ },
+
+ eval(context) {
+ let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules || this.declarations;
+
// media stored inside other atrule should not bubble over it
// backpup media bubbling information
mediaPathBackup = context.mediaPath;
@@ -7366,96 +8036,107 @@
// deleted media bubbling information
context.mediaPath = [];
context.mediaBlocks = [];
+
if (value) {
value = value.eval(context);
- if (value.value && this.keywordList(value.value)) {
- value = new Anonymous(value.value.map(function (keyword) { return keyword.value; }).join(', '), this.getIndex(), this.fileInfo());
- }
}
+
if (rules) {
rules = this.evalRoot(context, rules);
}
if (Array.isArray(rules) && rules[0].rules && Array.isArray(rules[0].rules) && rules[0].rules.length) {
- var allMergeableDeclarations = this.declarationsBlock(rules[0].rules, true);
+ const allMergeableDeclarations = this.declarationsBlock(rules[0].rules, true);
if (allMergeableDeclarations && !this.isRooted && !value) {
- var mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;
mergeRules(rules[0].rules);
rules = rules[0].rules;
- rules.forEach(function (rule) { return rule.merge = false; });
+ rules.forEach(rule => rule.merge = false);
}
}
if (this.simpleBlock && rules) {
rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();
rules = rules.map(function (rule) { return rule.eval(context); });
}
+
// restore media bubbling information
context.mediaPath = mediaPathBackup;
context.mediaBlocks = mediaBlocksBackup;
return new AtRule(this.name, value, rules, this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());
- }, evalRoot: function (context, rules) {
- var ampersandCount = 0;
- var noAmpersandCount = 0;
- var noAmpersands = true;
- var allAmpersands = false;
+ },
+
+ evalRoot(context, rules) {
+ let ampersandCount = 0;
+ let noAmpersandCount = 0;
+ let noAmpersands = true;
+
if (!this.simpleBlock) {
rules = [rules[0].eval(context)];
}
- var precedingSelectors = [];
+
+ let precedingSelectors = [];
if (context.frames.length > 0) {
- var _loop_1 = function (index) {
- var frame = context.frames[index];
- if (frame.type === 'Ruleset' &&
+ for (let index = 0; index < context.frames.length; index++) {
+ const frame = context.frames[index];
+ if (
+ frame.type === 'Ruleset' &&
frame.rules &&
- frame.rules.length > 0) {
+ frame.rules.length > 0
+ ) {
if (frame && !frame.root && frame.selectors && frame.selectors.length > 0) {
precedingSelectors = precedingSelectors.concat(frame.selectors);
}
}
if (precedingSelectors.length > 0) {
- var value_1 = '';
- var output = { add: function (s) { value_1 += s; } };
- for (var i_1 = 0; i_1 < precedingSelectors.length; i_1++) {
- precedingSelectors[i_1].genCSS(context, output);
- }
- if (/^&+$/.test(value_1.replace(/\s+/g, ''))) {
+ const allAmpersandElements = precedingSelectors.every(
+ sel => sel.elements && sel.elements.length > 0 && sel.elements.every(
+ el => el.value === '&'
+ )
+ );
+ if (allAmpersandElements) {
noAmpersands = false;
noAmpersandCount++;
- }
- else {
- allAmpersands = false;
+ } else {
ampersandCount++;
}
}
- };
- for (var index = 0; index < context.frames.length; index++) {
- _loop_1(index);
}
}
- var mixedAmpersands = ampersandCount > 0 && noAmpersandCount > 0 && !allAmpersands && !noAmpersands;
- if ((this.isRooted && ampersandCount > 0 && noAmpersandCount === 0 && !allAmpersands && noAmpersands)
- || !mixedAmpersands) {
+
+ const mixedAmpersands = ampersandCount > 0 && noAmpersandCount > 0 && !noAmpersands;
+ if (
+ (this.isRooted && ampersandCount > 0 && noAmpersandCount === 0 && noAmpersands)
+ || !mixedAmpersands
+ ) {
rules[0].root = true;
}
return rules;
- }, variable: function (name) {
+ },
+
+ variable(name) {
if (this.rules) {
// assuming that there is only one rule at this point - that is how parser constructs the rule
return Ruleset.prototype.variable.call(this.rules[0], name);
}
- }, find: function () {
+ },
+
+ find() {
if (this.rules) {
// assuming that there is only one rule at this point - that is how parser constructs the rule
return Ruleset.prototype.find.apply(this.rules[0], arguments);
}
- }, rulesets: function () {
+ },
+
+ rulesets() {
if (this.rules) {
// assuming that there is only one rule at this point - that is how parser constructs the rule
return Ruleset.prototype.rulesets.apply(this.rules[0]);
}
- }, outputRuleset: function (context, output, rules) {
- var ruleCnt = rules.length;
- var i;
+ },
+
+ outputRuleset(context, output, rules) {
+ const ruleCnt = rules.length;
+ let i;
context.tabLevel = (context.tabLevel | 0) + 1;
+
// Compressed
if (context.compress) {
output.add('{');
@@ -7466,56 +8147,68 @@
context.tabLevel--;
return;
}
+
// Non-compressed
- var tabSetStr = "\n".concat(Array(context.tabLevel).join(' ')), tabRuleStr = "".concat(tabSetStr, " ");
+ const tabSetStr = `\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;
if (!ruleCnt) {
- output.add(" {".concat(tabSetStr, "}"));
- }
- else {
- output.add(" {".concat(tabRuleStr));
+ output.add(` {${tabSetStr}}`);
+ } else {
+ output.add(` {${tabRuleStr}`);
rules[0].genCSS(context, output);
for (i = 1; i < ruleCnt; i++) {
output.add(tabRuleStr);
rules[i].genCSS(context, output);
}
- output.add("".concat(tabSetStr, "}"));
+ output.add(`${tabSetStr}}`);
}
+
context.tabLevel--;
- } }));
+ }
+ });
- var DetachedRuleset = function (ruleset, frames) {
+ const DetachedRuleset = function(ruleset, frames) {
this.ruleset = ruleset;
this.frames = frames;
this.setParent(this.ruleset, this);
};
+
DetachedRuleset.prototype = Object.assign(new Node(), {
type: 'DetachedRuleset',
evalFirst: true,
- accept: function (visitor) {
+
+ accept(visitor) {
this.ruleset = visitor.visit(this.ruleset);
},
- eval: function (context) {
- var frames = this.frames || copyArray(context.frames);
+
+ eval(context) {
+ const frames = this.frames || copyArray(context.frames);
return new DetachedRuleset(this.ruleset, frames);
},
- callEval: function (context) {
+
+ callEval(context) {
return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);
}
});
- var MATH = Math$1;
- var Operation = function (op, operands, isSpaced) {
+ const MATH = Math$1;
+
+
+ const Operation = function(op, operands, isSpaced) {
this.op = op.trim();
this.operands = operands;
this.isSpaced = isSpaced;
};
+
Operation.prototype = Object.assign(new Node(), {
type: 'Operation',
- accept: function (visitor) {
+
+ accept(visitor) {
this.operands = visitor.visitArray(this.operands);
},
- eval: function (context) {
- var a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;
+
+ eval(context) {
+ let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;
+
if (context.isMathOn(this.op)) {
op = this.op === './' ? '/' : this.op;
if (a instanceof Dimension && b instanceof Color) {
@@ -7525,20 +8218,23 @@
b = b.toColor();
}
if (!a.operate || !b.operate) {
- if ((a instanceof Operation || b instanceof Operation)
- && a.op === '/' && context.math === MATH.PARENS_DIVISION) {
+ if (
+ (a instanceof Operation || b instanceof Operation)
+ && a.op === '/' && context.math === MATH.PARENS_DIVISION
+ ) {
return new Operation(this.op, [a, b], this.isSpaced);
}
throw { type: 'Operation',
message: 'Operation on an invalid type' };
}
+
return a.operate(context, op, b);
- }
- else {
+ } else {
return new Operation(this.op, [a, b], this.isSpaced);
}
},
- genCSS: function (context, output) {
+
+ genCSS(context, output) {
this.operands[0].genCSS(context, output);
if (this.isSpaced) {
output.add(' ');
@@ -7551,72 +8247,78 @@
}
});
- var functionCaller = /** @class */ (function () {
- function functionCaller(name, context, index, currentFileInfo) {
+ class functionCaller {
+ constructor(name, context, index, currentFileInfo) {
this.name = name.toLowerCase();
this.index = index;
this.context = context;
this.currentFileInfo = currentFileInfo;
+
this.func = context.frames[0].functionRegistry.get(this.name);
}
- functionCaller.prototype.isValid = function () {
+
+ isValid() {
return Boolean(this.func);
- };
- functionCaller.prototype.call = function (args) {
- var _this = this;
+ }
+
+ call(args) {
if (!(Array.isArray(args))) {
args = [args];
}
- var evalArgs = this.func.evalArgs;
+ const evalArgs = this.func.evalArgs;
if (evalArgs !== false) {
- args = args.map(function (a) { return a.eval(_this.context); });
+ args = args.map(a => a.eval(this.context));
}
- var commentFilter = function (item) { return !(item.type === 'Comment'); };
+ const commentFilter = item => !(item.type === 'Comment');
+
// This code is terrible and should be replaced as per this issue...
// https://github.com/less/less.js/issues/2477
args = args
.filter(commentFilter)
- .map(function (item) {
- if (item.type === 'Expression') {
- var subNodes = item.value.filter(commentFilter);
- if (subNodes.length === 1) {
- // https://github.com/less/less.js/issues/3616
- if (item.parens && subNodes[0].op === '/') {
- return item;
+ .map(item => {
+ if (item.type === 'Expression') {
+ const subNodes = item.value.filter(commentFilter);
+ if (subNodes.length === 1) {
+ // https://github.com/less/less.js/issues/3616
+ if (item.parens && subNodes[0].op === '/') {
+ return item;
+ }
+ return subNodes[0];
+ } else {
+ return new Expression(subNodes);
}
- return subNodes[0];
}
- else {
- return new Expression(subNodes);
- }
- }
- return item;
- });
+ return item;
+ });
+
if (evalArgs === false) {
- return this.func.apply(this, __spreadArray([this.context], args, false));
+ return this.func(this.context, ...args);
}
- return this.func.apply(this, args);
- };
- return functionCaller;
- }());
+
+ return this.func(...args);
+ }
+ }
//
// A function call node.
//
- var Call = function (name, args, index, currentFileInfo) {
+ const Call = function(name, args, index, currentFileInfo) {
this.name = name;
this.args = args;
this.calc = name === 'calc';
this._index = index;
this._fileInfo = currentFileInfo;
};
+
Call.prototype = Object.assign(new Node(), {
type: 'Call',
- accept: function (visitor) {
+
+ accept(visitor) {
if (this.args) {
this.args = visitor.visitArray(this.args);
}
},
+
//
// When evaluating a function call,
// we either find the function in the functionRegistry,
@@ -7628,99 +8330,113 @@
// we try to pass a variable to a function, like: `saturate(@color)`.
// The function should receive the value, not the variable.
//
- eval: function (context) {
- var _this = this;
+ eval(context) {
/**
* Turn off math for calc(), and switch back on for evaluating nested functions
*/
- var currentMathContext = context.mathOn;
+ const currentMathContext = context.mathOn;
context.mathOn = !this.calc;
if (this.calc || context.inCalc) {
context.enterCalc();
}
- var exitCalc = function () {
- if (_this.calc || context.inCalc) {
+
+ const exitCalc = () => {
+ if (this.calc || context.inCalc) {
context.exitCalc();
}
context.mathOn = currentMathContext;
};
- var result;
- var funcCaller = new functionCaller(this.name, context, this.getIndex(), this.fileInfo());
+
+ let result;
+ const funcCaller = new functionCaller(this.name, context, this.getIndex(), this.fileInfo());
+
if (funcCaller.isValid()) {
try {
result = funcCaller.call(this.args);
exitCalc();
- }
- catch (e) {
+ } catch (e) {
// eslint-disable-next-line no-prototype-builtins
if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {
throw e;
}
- throw {
+ throw {
type: e.type || 'Runtime',
- message: "Error evaluating function `".concat(this.name, "`").concat(e.message ? ": ".concat(e.message) : ''),
- index: this.getIndex(),
+ message: `Error evaluating function \`${this.name}\`${e.message ? `: ${e.message}` : ''}`,
+ index: this.getIndex(),
filename: this.fileInfo().filename,
line: e.lineNumber,
column: e.columnNumber
};
}
}
+
if (result !== null && result !== undefined) {
// Results that that are not nodes are cast as Anonymous nodes
// Falsy values or booleans are returned as empty nodes
if (!(result instanceof Node)) {
if (!result || result === true) {
- result = new Anonymous(null);
+ result = new Anonymous(null);
}
else {
- result = new Anonymous(result.toString());
+ result = new Anonymous(result.toString());
}
+
}
result._index = this._index;
result._fileInfo = this._fileInfo;
return result;
}
- var args = this.args.map(function (a) { return a.eval(context); });
+
+ const args = this.args.map(a => a.eval(context));
exitCalc();
+
return new Call(this.name, args, this.getIndex(), this.fileInfo());
},
- genCSS: function (context, output) {
- output.add("".concat(this.name, "("), this.fileInfo(), this.getIndex());
- for (var i_1 = 0; i_1 < this.args.length; i_1++) {
- this.args[i_1].genCSS(context, output);
- if (i_1 + 1 < this.args.length) {
+
+ genCSS(context, output) {
+ output.add(`${this.name}(`, this.fileInfo(), this.getIndex());
+
+ for (let i = 0; i < this.args.length; i++) {
+ this.args[i].genCSS(context, output);
+ if (i + 1 < this.args.length) {
output.add(', ');
}
}
+
output.add(')');
}
});
- var Variable = function (name, index, currentFileInfo) {
+ const Variable = function(name, index, currentFileInfo) {
this.name = name;
this._index = index;
this._fileInfo = currentFileInfo;
};
+
Variable.prototype = Object.assign(new Node(), {
type: 'Variable',
- eval: function (context) {
- var variable, name = this.name;
+
+ eval(context) {
+ let variable, name = this.name;
+
if (name.indexOf('@@') === 0) {
- name = "@".concat(new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value);
+ name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;
}
+
if (this.evaluating) {
throw { type: 'Name',
- message: "Recursive variable definition for ".concat(name),
+ message: `Recursive variable definition for ${name}`,
filename: this.fileInfo().filename,
index: this.getIndex() };
}
+
this.evaluating = true;
+
variable = this.find(context.frames, function (frame) {
- var v = frame.variable(name);
+ const v = frame.variable(name);
if (v) {
if (v.important) {
- var importantScope = context.importantScope[context.importantScope.length - 1];
+ const importantScope = context.importantScope[context.importantScope.length - 1];
importantScope.important = v.important;
}
// If in calc, wrap vars in a function call to cascade evaluate args first
@@ -7735,56 +8451,69 @@
if (variable) {
this.evaluating = false;
return variable;
- }
- else {
+ } else {
throw { type: 'Name',
- message: "variable ".concat(name, " is undefined"),
+ message: `variable ${name} is undefined`,
filename: this.fileInfo().filename,
index: this.getIndex() };
}
},
- find: function (obj, fun) {
- for (var i_1 = 0, r = void 0; i_1 < obj.length; i_1++) {
- r = fun.call(obj, obj[i_1]);
- if (r) {
- return r;
- }
+
+ find(obj, fun) {
+ for (let i = 0, r; i < obj.length; i++) {
+ r = fun.call(obj, obj[i]);
+ if (r) { return r; }
}
return null;
}
});
- var Property = function (name, index, currentFileInfo) {
+ const Property = function(name, index, currentFileInfo) {
this.name = name;
this._index = index;
this._fileInfo = currentFileInfo;
};
+
Property.prototype = Object.assign(new Node(), {
type: 'Property',
- eval: function (context) {
- var property;
- var name = this.name;
+
+ eval(context) {
+ let property;
+ const name = this.name;
// TODO: shorten this reference
- var mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;
+ const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;
+
if (this.evaluating) {
throw { type: 'Name',
- message: "Recursive property reference for ".concat(name),
+ message: `Recursive property reference for ${name}`,
filename: this.fileInfo().filename,
index: this.getIndex() };
}
+
this.evaluating = true;
+
property = this.find(context.frames, function (frame) {
- var v;
- var vArr = frame.property(name);
+ let v;
+ const vArr = frame.property(name);
if (vArr) {
- for (var i_1 = 0; i_1 < vArr.length; i_1++) {
- v = vArr[i_1];
- vArr[i_1] = new Declaration(v.name, v.value, v.important, v.merge, v.index, v.currentFileInfo, v.inline, v.variable);
+ for (let i = 0; i < vArr.length; i++) {
+ v = vArr[i];
+
+ vArr[i] = new Declaration(v.name,
+ v.value,
+ v.important,
+ v.merge,
+ v.index,
+ v.currentFileInfo,
+ v.inline,
+ v.variable
+ );
}
mergeRules(vArr);
+
v = vArr[vArr.length - 1];
if (v.important) {
- var importantScope = context.importantScope[context.importantScope.length - 1];
+ const importantScope = context.importantScope[context.importantScope.length - 1];
importantScope.important = v.important;
}
v = v.value.eval(context);
@@ -7794,53 +8523,63 @@
if (property) {
this.evaluating = false;
return property;
- }
- else {
+ } else {
throw { type: 'Name',
- message: "Property '".concat(name, "' is undefined"),
+ message: `Property '${name}' is undefined`,
filename: this.currentFileInfo.filename,
index: this.index };
}
},
- find: function (obj, fun) {
- for (var i_2 = 0, r = void 0; i_2 < obj.length; i_2++) {
- r = fun.call(obj, obj[i_2]);
- if (r) {
- return r;
- }
+
+ find(obj, fun) {
+ for (let i = 0, r; i < obj.length; i++) {
+ r = fun.call(obj, obj[i]);
+ if (r) { return r; }
}
return null;
}
});
- var Attribute = function (key, op, value, cif) {
+ const Attribute = function(key, op, value, cif) {
this.key = key;
this.op = op;
this.value = value;
this.cif = cif;
};
+
Attribute.prototype = Object.assign(new Node(), {
type: 'Attribute',
- eval: function (context) {
- return new Attribute(this.key.eval ? this.key.eval(context) : this.key, this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value, this.cif);
+
+ eval(context) {
+ return new Attribute(
+ this.key.eval ? this.key.eval(context) : this.key,
+ this.op,
+ (this.value && this.value.eval) ? this.value.eval(context) : this.value,
+ this.cif
+ );
},
- genCSS: function (context, output) {
+
+ genCSS(context, output) {
output.add(this.toCSS(context));
},
- toCSS: function (context) {
- var value = this.key.toCSS ? this.key.toCSS(context) : this.key;
+
+ toCSS(context) {
+ let value = this.key.toCSS ? this.key.toCSS(context) : this.key;
+
if (this.op) {
value += this.op;
value += (this.value.toCSS ? this.value.toCSS(context) : this.value);
}
+
if (this.cif) {
value = value + ' ' + this.cif;
}
- return "[".concat(value, "]");
+
+ return `[${value}]`;
}
});
- var Quoted = function (str, content, escaped, index, currentFileInfo) {
+ const Quoted = function(str, content, escaped, index, currentFileInfo) {
this.escaped = (escaped === undefined) ? true : escaped;
this.value = content || '';
this.quote = str.charAt(0);
@@ -7850,9 +8589,11 @@
this.propRegex = /\$\{([\w-]+)\}/g;
this.allowRoot = escaped;
};
+
Quoted.prototype = Object.assign(new Node(), {
type: 'Quoted',
- genCSS: function (context, output) {
+
+ genCSS(context, output) {
if (!this.escaped) {
output.add(this.quote, this.fileInfo(), this.getIndex());
}
@@ -7861,22 +8602,24 @@
output.add(this.quote);
}
},
- containsVariables: function () {
+
+ containsVariables() {
return this.value.match(this.variableRegex);
},
- eval: function (context) {
- var that = this;
- var value = this.value;
- var variableReplacement = function (_, name1, name2) {
- var v = new Variable("@".concat(name1 !== null && name1 !== void 0 ? name1 : name2), that.getIndex(), that.fileInfo()).eval(context, true);
+
+ eval(context) {
+ const that = this;
+ let value = this.value;
+ const variableReplacement = function (_, name1, name2) {
+ const v = new Variable(`@${name1 ?? name2}`, that.getIndex(), that.fileInfo()).eval(context, true);
return (v instanceof Quoted) ? v.value : v.toCSS();
};
- var propertyReplacement = function (_, name1, name2) {
- var v = new Property("$".concat(name1 !== null && name1 !== void 0 ? name1 : name2), that.getIndex(), that.fileInfo()).eval(context, true);
+ const propertyReplacement = function (_, name1, name2) {
+ const v = new Property(`$${name1 ?? name2}`, that.getIndex(), that.fileInfo()).eval(context, true);
return (v instanceof Quoted) ? v.value : v.toCSS();
};
function iterativeReplace(value, regexp, replacementFnc) {
- var evaluatedValue = value;
+ let evaluatedValue = value;
do {
value = evaluatedValue.toString();
evaluatedValue = value.replace(regexp, replacementFnc);
@@ -7887,39 +8630,45 @@
value = iterativeReplace(value, this.propRegex, propertyReplacement);
return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());
},
- compare: function (other) {
+
+ compare(other) {
// when comparing quoted strings allow the quote to differ
if (other.type === 'Quoted' && !this.escaped && !other.escaped) {
return Node.numericCompare(this.value, other.value);
- }
- else {
+ } else {
return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;
}
}
});
function escapePath(path) {
- return path.replace(/[()'"\s]/g, function (match) { return "\\".concat(match); });
+ return path.replace(/[()'"\s]/g, function(match) { return `\\${match}`; });
}
- var URL = function (val, index, currentFileInfo, isEvald) {
+
+ const URL = function(val, index, currentFileInfo, isEvald) {
this.value = val;
this._index = index;
this._fileInfo = currentFileInfo;
this.isEvald = isEvald;
};
+
URL.prototype = Object.assign(new Node(), {
type: 'Url',
- accept: function (visitor) {
+
+ accept(visitor) {
this.value = visitor.visit(this.value);
},
- genCSS: function (context, output) {
+
+ genCSS(context, output) {
output.add('url(');
this.value.genCSS(context, output);
output.add(')');
},
- eval: function (context) {
- var val = this.value.eval(context);
- var rootpath;
+
+ eval(context) {
+ const val = this.value.eval(context);
+ let rootpath;
+
if (!this.isEvald) {
// Add the rootpath if the URL requires a rewrite
rootpath = this.fileInfo() && this.fileInfo().rootpath;
@@ -7930,32 +8679,34 @@
rootpath = escapePath(rootpath);
}
val.value = context.rewritePath(val.value, rootpath);
- }
- else {
+ } else {
val.value = context.normalizePath(val.value);
}
+
// Add url args if enabled
if (context.urlArgs) {
if (!val.value.match(/^\s*data:/)) {
- var delimiter = val.value.indexOf('?') === -1 ? '?' : '&';
- var urlArgs = delimiter + context.urlArgs;
+ const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';
+ const urlArgs = delimiter + context.urlArgs;
if (val.value.indexOf('#') !== -1) {
- val.value = val.value.replace('#', "".concat(urlArgs, "#"));
- }
- else {
+ val.value = val.value.replace('#', `${urlArgs}#`);
+ } else {
val.value += urlArgs;
}
}
}
}
+
return new URL(val, this.getIndex(), this.fileInfo(), true);
}
});
- var Media = function (value, features, index, currentFileInfo, visibilityInfo) {
+ const Media = function(value, features, index, currentFileInfo, visibilityInfo) {
this._index = index;
this._fileInfo = currentFileInfo;
- var selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();
+
+ const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();
+
this.features = new Value(features);
this.rules = [new Ruleset(selectors, value)];
this.rules[0].allowImports = true;
@@ -7965,31 +8716,46 @@
this.setParent(this.features, this);
this.setParent(this.rules, this);
};
- Media.prototype = Object.assign(new AtRule(), __assign(__assign({ type: 'Media' }, NestableAtRulePrototype), { genCSS: function (context, output) {
+
+ Media.prototype = Object.assign(new AtRule(), {
+ type: 'Media',
+
+ ...NestableAtRulePrototype,
+
+ genCSS(context, output) {
output.add('@media ', this._fileInfo, this._index);
this.features.genCSS(context, output);
this.outputRuleset(context, output, this.rules);
- }, eval: function (context) {
+ },
+
+ eval(context) {
if (!context.mediaBlocks) {
context.mediaBlocks = [];
context.mediaPath = [];
}
- var media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());
+
+ const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());
if (this.debugInfo) {
this.rules[0].debugInfo = this.debugInfo;
media.debugInfo = this.debugInfo;
}
+
media.features = this.features.eval(context);
+
context.mediaPath.push(media);
context.mediaBlocks.push(media);
+
this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();
context.frames.unshift(this.rules[0]);
media.rules = [this.rules[0].eval(context)];
context.frames.shift();
+
context.mediaPath.pop();
+
return context.mediaPath.length === 0 ? media.evalTop(context) :
media.evalNested(context);
- } }));
+ }
+ });
//
// CSS @import node
@@ -8003,18 +8769,18 @@
// `import,push`, we also pass it a callback, which it'll call once
// the file has been fetched, and parsed.
//
- var Import = function (path, features, options, index, currentFileInfo, visibilityInfo) {
+ const Import = function(path, features, options, index, currentFileInfo, visibilityInfo) {
this.options = options;
this._index = index;
this._fileInfo = currentFileInfo;
this.path = path;
this.features = features;
this.allowRoot = true;
+
if (this.options.less !== undefined || this.options.inline) {
this.css = !this.options.less || this.options.inline;
- }
- else {
- var pathValue = this.getPath();
+ } else {
+ const pathValue = this.getPath();
if (pathValue && /[#.&?]css([?;].*)?$/.test(pathValue)) {
this.css = true;
}
@@ -8023,9 +8789,11 @@
this.setParent(this.features, this);
this.setParent(this.path, this);
};
+
Import.prototype = Object.assign(new Node(), {
type: 'Import',
- accept: function (visitor) {
+
+ accept(visitor) {
if (this.features) {
this.features = visitor.visit(this.features);
}
@@ -8034,7 +8802,8 @@
this.root = visitor.visit(this.root);
}
},
- genCSS: function (context, output) {
+
+ genCSS(context, output) {
if (this.css && this.path._fileInfo.reference === undefined) {
output.add('@import ', this._fileInfo, this._index);
this.path.genCSS(context, output);
@@ -8045,62 +8814,73 @@
output.add(';');
}
},
- getPath: function () {
+
+ getPath() {
return (this.path instanceof URL) ?
this.path.value.value : this.path.value;
},
- isVariableImport: function () {
- var path = this.path;
+
+ isVariableImport() {
+ let path = this.path;
if (path instanceof URL) {
path = path.value;
}
if (path instanceof Quoted) {
return path.containsVariables();
}
+
return true;
},
- evalForImport: function (context) {
- var path = this.path;
+
+ evalForImport(context) {
+ let path = this.path;
+
if (path instanceof URL) {
path = path.value;
}
+
return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());
},
- evalPath: function (context) {
- var path = this.path.eval(context);
- var fileInfo = this._fileInfo;
+
+ evalPath(context) {
+ const path = this.path.eval(context);
+ const fileInfo = this._fileInfo;
+
if (!(path instanceof URL)) {
// Add the rootpath if the URL requires a rewrite
- var pathValue = path.value;
+ const pathValue = path.value;
if (fileInfo &&
pathValue &&
context.pathRequiresRewrite(pathValue)) {
path.value = context.rewritePath(pathValue, fileInfo.rootpath);
- }
- else {
+ } else {
path.value = context.normalizePath(path.value);
}
}
+
return path;
},
- eval: function (context) {
- var result = this.doEval(context);
+
+ eval(context) {
+ const result = this.doEval(context);
if (this.options.reference || this.blocksVisibility()) {
if (result.length || result.length === 0) {
result.forEach(function (node) {
node.addVisibilityBlock();
- });
- }
- else {
+ }
+ );
+ } else {
result.addVisibilityBlock();
}
}
return result;
},
- doEval: function (context) {
- var ruleset;
- var registry;
- var features = this.features && this.features.eval(context);
+
+ doEval(context) {
+ let ruleset;
+ let registry;
+ const features = this.features && this.features.eval(context);
+
if (this.options.isPlugin) {
if (this.root && this.root.eval) {
try {
@@ -8112,11 +8892,13 @@
}
}
registry = context.frames[0] && context.frames[0].functionRegistry;
- if (registry && this.root && this.root.functions) {
- registry.addMultiple(this.root.functions);
+ if ( registry && this.root && this.root.functions ) {
+ registry.addMultiple( this.root.functions );
}
+
return [];
}
+
if (this.skip) {
if (typeof this.skip === 'function') {
this.skip = this.skip();
@@ -8126,12 +8908,12 @@
}
}
if (this.features) {
- var featureValue = this.features.value;
+ let featureValue = this.features.value;
if (Array.isArray(featureValue) && featureValue.length >= 1) {
- var expr = featureValue[0];
+ const expr = featureValue[0];
if (expr.type === 'Expression' && Array.isArray(expr.value) && expr.value.length >= 2) {
featureValue = expr.value;
- var isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'
+ const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'
&& featureValue[1].type === 'Paren';
if (isLayer) {
this.css = false;
@@ -8140,14 +8922,15 @@
}
}
if (this.options.inline) {
- var contents = new Anonymous(this.root, 0, {
- filename: this.importedFilename,
- reference: this.path._fileInfo && this.path._fileInfo.reference
- }, true, true);
+ const contents = new Anonymous(this.root, 0,
+ {
+ filename: this.importedFilename,
+ reference: this.path._fileInfo && this.path._fileInfo.reference
+ }, true, true);
+
return this.features ? new Media([contents], this.features.value) : [contents];
- }
- else if (this.css || this.layerCss) {
- var newImport = new Import(this.evalPath(context), features, this.options, this._index);
+ } else if (this.css || this.layerCss) {
+ const newImport = new Import(this.evalPath(context), features, this.options, this._index);
if (this.layerCss) {
newImport.css = this.layerCss;
newImport.path._fileInfo = this._fileInfo;
@@ -8156,15 +8939,14 @@
throw this.error;
}
return newImport;
- }
- else if (this.root) {
+ } else if (this.root) {
if (this.features) {
- var featureValue = this.features.value;
+ let featureValue = this.features.value;
if (Array.isArray(featureValue) && featureValue.length === 1) {
- var expr = featureValue[0];
+ const expr = featureValue[0];
if (expr.type === 'Expression' && Array.isArray(expr.value) && expr.value.length >= 2) {
featureValue = expr.value;
- var isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'
+ const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'
&& featureValue[1].type === 'Paren';
if (isLayer) {
this.layerCss = true;
@@ -8178,15 +8960,15 @@
}
ruleset = new Ruleset(null, copyArray(this.root.rules));
ruleset.evalImports(context);
+
return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;
- }
- else {
+ } else {
if (this.features) {
- var featureValue = this.features.value;
+ let featureValue = this.features.value;
if (Array.isArray(featureValue) && featureValue.length >= 1) {
featureValue = featureValue[0].value;
if (Array.isArray(featureValue) && featureValue.length >= 2) {
- var isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'
+ const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'
&& featureValue[1].type === 'Paren';
if (isLayer) {
this.css = true;
@@ -8203,30 +8985,34 @@
}
});
- var JsEvalNode = function () { };
+ const JsEvalNode = function() {};
+
JsEvalNode.prototype = Object.assign(new Node(), {
- evaluateJavaScript: function (expression, context) {
- var result;
- var that = this;
- var evalContext = {};
+ evaluateJavaScript(expression, context) {
+ let result;
+ const that = this;
+ const evalContext = {};
+
if (!context.javascriptEnabled) {
throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',
filename: this.fileInfo().filename,
index: this.getIndex() };
}
+
expression = expression.replace(/@\{([\w-]+)\}/g, function (_, name) {
- return that.jsify(new Variable("@".concat(name), that.getIndex(), that.fileInfo()).eval(context));
+ return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));
});
+
try {
- expression = new Function("return (".concat(expression, ")"));
- }
- catch (e) {
- throw { message: "JavaScript evaluation error: ".concat(e.message, " from `").concat(expression, "`"),
+ expression = new Function(`return (${expression})`);
+ } catch (e) {
+ throw { message: `JavaScript evaluation error: ${e.message} from \`${expression}\`` ,
filename: this.fileInfo().filename,
index: this.getIndex() };
}
- var variables = context.frames[0].variables();
- for (var k in variables) {
+
+ const variables = context.frames[0].variables();
+ for (const k in variables) {
// eslint-disable-next-line no-prototype-builtins
if (variables.hasOwnProperty(k)) {
evalContext[k.slice(1)] = {
@@ -8237,96 +9023,102 @@
};
}
}
+
try {
result = expression.call(evalContext);
- }
- catch (e) {
- throw { message: "JavaScript evaluation error: '".concat(e.name, ": ").concat(e.message.replace(/["]/g, '\''), "'"),
+ } catch (e) {
+ throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/["]/g, '\'')}'` ,
filename: this.fileInfo().filename,
index: this.getIndex() };
}
return result;
},
- jsify: function (obj) {
+
+ jsify(obj) {
if (Array.isArray(obj.value) && (obj.value.length > 1)) {
- return "[".concat(obj.value.map(function (v) { return v.toCSS(); }).join(', '), "]");
- }
- else {
+ return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;
+ } else {
return obj.toCSS();
}
}
});
- var JavaScript = function (string, escaped, index, currentFileInfo) {
+ const JavaScript = function(string, escaped, index, currentFileInfo) {
this.escaped = escaped;
this.expression = string;
this._index = index;
this._fileInfo = currentFileInfo;
};
+
JavaScript.prototype = Object.assign(new JsEvalNode(), {
type: 'JavaScript',
- eval: function (context) {
- var result = this.evaluateJavaScript(this.expression, context);
- var type = typeof result;
+
+ eval(context) {
+ const result = this.evaluateJavaScript(this.expression, context);
+ const type = typeof result;
+
if (type === 'number' && !isNaN(result)) {
return new Dimension(result);
- }
- else if (type === 'string') {
- return new Quoted("\"".concat(result, "\""), result, this.escaped, this._index);
- }
- else if (Array.isArray(result)) {
+ } else if (type === 'string') {
+ return new Quoted(`"${result}"`, result, this.escaped, this._index);
+ } else if (Array.isArray(result)) {
return new Anonymous(result.join(', '));
- }
- else {
+ } else {
return new Anonymous(result);
}
}
});
- var Assignment = function (key, val) {
+ const Assignment = function(key, val) {
this.key = key;
this.value = val;
};
+
Assignment.prototype = Object.assign(new Node(), {
type: 'Assignment',
- accept: function (visitor) {
+
+ accept(visitor) {
this.value = visitor.visit(this.value);
},
- eval: function (context) {
+
+ eval(context) {
if (this.value.eval) {
return new Assignment(this.key, this.value.eval(context));
}
return this;
},
- genCSS: function (context, output) {
- output.add("".concat(this.key, "="));
+
+ genCSS(context, output) {
+ output.add(`${this.key}=`);
if (this.value.genCSS) {
this.value.genCSS(context, output);
- }
- else {
+ } else {
output.add(this.value);
}
}
});
- var Condition = function (op, l, r, i, negate) {
+ const Condition = function(op, l, r, i, negate) {
this.op = op.trim();
this.lvalue = l;
this.rvalue = r;
this._index = i;
this.negate = negate;
};
+
Condition.prototype = Object.assign(new Node(), {
type: 'Condition',
- accept: function (visitor) {
+
+ accept(visitor) {
this.lvalue = visitor.visit(this.lvalue);
this.rvalue = visitor.visit(this.rvalue);
},
- eval: function (context) {
- var result = (function (op, a, b) {
+
+ eval(context) {
+ const result = (function (op, a, b) {
switch (op) {
case 'and': return a && b;
- case 'or': return a || b;
+ case 'or': return a || b;
default:
switch (Node.compare(a, b)) {
case -1:
@@ -8340,67 +9132,46 @@
}
}
})(this.op, this.lvalue.eval(context), this.rvalue.eval(context));
+
return this.negate ? !result : result;
}
});
- var QueryInParens = function (op, l, m, op2, r, i) {
+ const QueryInParens = function (op, l, m, op2, r, i) {
this.op = op.trim();
this.lvalue = l;
this.mvalue = m;
this.op2 = op2 ? op2.trim() : null;
this.rvalue = r;
this._index = i;
- this.mvalues = [];
};
+
QueryInParens.prototype = Object.assign(new Node(), {
type: 'QueryInParens',
- accept: function (visitor) {
+
+ accept(visitor) {
this.lvalue = visitor.visit(this.lvalue);
this.mvalue = visitor.visit(this.mvalue);
if (this.rvalue) {
this.rvalue = visitor.visit(this.rvalue);
}
},
- eval: function (context) {
- this.lvalue = this.lvalue.eval(context);
- var variableDeclaration;
- var rule;
- for (var i_1 = 0; (rule = context.frames[i_1]); i_1++) {
- if (rule.type === 'Ruleset') {
- variableDeclaration = rule.rules.find(function (r) {
- if ((r instanceof Declaration) && r.variable) {
- return true;
- }
- return false;
- });
- if (variableDeclaration) {
- break;
- }
- }
- }
- if (!this.mvalueCopy) {
- this.mvalueCopy = copy(this.mvalue);
- }
- if (variableDeclaration) {
- this.mvalue = this.mvalueCopy;
- this.mvalue = this.mvalue.eval(context);
- this.mvalues.push(this.mvalue);
- }
- else {
- this.mvalue = this.mvalue.eval(context);
- }
- if (this.rvalue) {
- this.rvalue = this.rvalue.eval(context);
- }
- return this;
+
+ eval(context) {
+ const node = new QueryInParens(
+ this.op,
+ this.lvalue.eval(context),
+ this.mvalue.eval(context),
+ this.op2,
+ this.rvalue ? this.rvalue.eval(context) : null,
+ this._index
+ );
+ return node;
},
- genCSS: function (context, output) {
+
+ genCSS(context, output) {
this.lvalue.genCSS(context, output);
output.add(' ' + this.op + ' ');
- if (this.mvalues.length > 0) {
- this.mvalue = this.mvalues.shift();
- }
this.mvalue.genCSS(context, output);
if (this.rvalue) {
output.add(' ' + this.op2 + ' ');
@@ -8409,10 +9180,12 @@
},
});
- var Container = function (value, features, index, currentFileInfo, visibilityInfo) {
+ const Container = function(value, features, index, currentFileInfo, visibilityInfo) {
this._index = index;
this._fileInfo = currentFileInfo;
- var selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();
+
+ const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();
+
this.features = new Value(features);
this.rules = [new Ruleset(selectors, value)];
this.rules[0].allowImports = true;
@@ -8422,49 +9195,72 @@
this.setParent(this.features, this);
this.setParent(this.rules, this);
};
- Container.prototype = Object.assign(new AtRule(), __assign(__assign({ type: 'Container' }, NestableAtRulePrototype), { genCSS: function (context, output) {
+
+ Container.prototype = Object.assign(new AtRule(), {
+ type: 'Container',
+
+ ...NestableAtRulePrototype,
+
+ genCSS(context, output) {
output.add('@container ', this._fileInfo, this._index);
this.features.genCSS(context, output);
this.outputRuleset(context, output, this.rules);
- }, eval: function (context) {
+ },
+
+ eval(context) {
+ if (this._evaluated) {
+ return this;
+ }
if (!context.mediaBlocks) {
context.mediaBlocks = [];
context.mediaPath = [];
}
- var media = new Container(null, [], this._index, this._fileInfo, this.visibilityInfo());
+
+ const media = new Container(null, [], this._index, this._fileInfo, this.visibilityInfo());
+ media._evaluated = true;
if (this.debugInfo) {
this.rules[0].debugInfo = this.debugInfo;
media.debugInfo = this.debugInfo;
}
+
media.features = this.features.eval(context);
+
context.mediaPath.push(media);
context.mediaBlocks.push(media);
+
this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();
context.frames.unshift(this.rules[0]);
media.rules = [this.rules[0].eval(context)];
context.frames.shift();
+
context.mediaPath.pop();
+
return context.mediaPath.length === 0 ? media.evalTop(context) :
media.evalNested(context);
- } }));
+ }
+ });
- var UnicodeDescriptor = function (value) {
+ const UnicodeDescriptor = function(value) {
this.value = value;
};
+
UnicodeDescriptor.prototype = Object.assign(new Node(), {
type: 'UnicodeDescriptor'
});
- var Negative = function (node) {
+ const Negative = function(node) {
this.value = node;
};
+
Negative.prototype = Object.assign(new Node(), {
type: 'Negative',
- genCSS: function (context, output) {
+
+ genCSS(context, output) {
output.add('-');
this.value.genCSS(context, output);
},
- eval: function (context) {
+
+ eval(context) {
if (context.isMathOn()) {
return (new Operation('*', [new Dimension(-1), this.value])).eval(context);
}
@@ -8472,7 +9268,7 @@
}
});
- var Extend = function (selector, option, index, currentFileInfo, visibilityInfo) {
+ const Extend = function(selector, option, index, currentFileInfo, visibilityInfo) {
this.selector = selector;
this.option = option;
this.object_id = Extend.next_id++;
@@ -8481,6 +9277,7 @@
this._fileInfo = currentFileInfo;
this.copyVisibilityInfo(visibilityInfo);
this.allowRoot = true;
+
switch (option) {
case '!all':
case 'all':
@@ -8494,22 +9291,28 @@
}
this.setParent(this.selector, this);
};
+
Extend.prototype = Object.assign(new Node(), {
type: 'Extend',
- accept: function (visitor) {
+
+ accept(visitor) {
this.selector = visitor.visit(this.selector);
},
- eval: function (context) {
+
+ eval(context) {
return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());
},
+
// remove when Nodes have JSDoc types
// eslint-disable-next-line no-unused-vars
- clone: function (context) {
+ clone(context) {
return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());
},
+
// it concatenates (joins) all selectors in selector array
- findSelfSelectors: function (selectors) {
- var selfElements = [], i, selectorElements;
+ findSelfSelectors(selectors) {
+ let selfElements = [], i, selectorElements;
+
for (i = 0; i < selectors.length; i++) {
selectorElements = selectors[i].elements;
// duplicate the logic in genCSS function inside the selector node.
@@ -8519,24 +9322,29 @@
}
selfElements = selfElements.concat(selectors[i].elements);
}
+
this.selfSelectors = [new Selector(selfElements)];
this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());
}
});
+
Extend.next_id = 0;
- var VariableCall = function (variable, index, currentFileInfo) {
+ const VariableCall = function(variable, index, currentFileInfo) {
this.variable = variable;
this._index = index;
this._fileInfo = currentFileInfo;
this.allowRoot = true;
};
+
VariableCall.prototype = Object.assign(new Node(), {
type: 'VariableCall',
- eval: function (context) {
- var rules;
- var detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);
- var error = new LessError({ message: "Could not evaluate variable call ".concat(this.variable) });
+
+ eval(context) {
+ let rules;
+ let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);
+ const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});
+
if (!detachedRuleset.ruleset) {
if (detachedRuleset.rules) {
rules = detachedRuleset;
@@ -8552,6 +9360,7 @@
}
detachedRuleset = new DetachedRuleset(rules);
}
+
if (detachedRuleset.ruleset) {
return detachedRuleset.callEval(context);
}
@@ -8559,18 +9368,22 @@
}
});
- var NamespaceValue = function (ruleCall, lookups, index, fileInfo) {
+ const NamespaceValue = function(ruleCall, lookups, index, fileInfo) {
this.value = ruleCall;
this.lookups = lookups;
this._index = index;
this._fileInfo = fileInfo;
};
+
NamespaceValue.prototype = Object.assign(new Node(), {
type: 'NamespaceValue',
- eval: function (context) {
- var i, name, rules = this.value.eval(context);
+
+ eval(context) {
+ let i, name, rules = this.value.eval(context);
+
for (i = 0; i < this.lookups.length; i++) {
name = this.lookups[i];
+
/**
* Eval'd DRs return rulesets.
* Eval'd mixins return rules, so let's make a ruleset if we need it.
@@ -8579,36 +9392,39 @@
if (Array.isArray(rules)) {
rules = new Ruleset([new Selector()], rules);
}
+
if (name === '') {
rules = rules.lastDeclaration();
}
else if (name.charAt(0) === '@') {
if (name.charAt(1) === '@') {
- name = "@".concat(new Variable(name.substr(1)).eval(context).value);
+ name = `@${new Variable(name.slice(1)).eval(context).value}`;
}
if (rules.variables) {
rules = rules.variable(name);
}
+
if (!rules) {
throw { type: 'Name',
- message: "variable ".concat(name, " not found"),
+ message: `variable ${name} not found`,
filename: this.fileInfo().filename,
index: this.getIndex() };
}
}
else {
if (name.substring(0, 2) === '$@') {
- name = "$".concat(new Variable(name.substr(1)).eval(context).value);
+ name = `$${new Variable(name.slice(1)).eval(context).value}`;
}
else {
- name = name.charAt(0) === '$' ? name : "$".concat(name);
+ name = name.charAt(0) === '$' ? name : `$${name}`;
}
if (rules.properties) {
rules = rules.property(name);
}
+
if (!rules) {
throw { type: 'Name',
- message: "property \"".concat(name.substr(1), "\" not found"),
+ message: `property "${name.slice(1)}" not found`,
filename: this.fileInfo().filename,
index: this.getIndex() };
}
@@ -8616,6 +9432,7 @@
// We pick the last one (the "cascaded" value)
rules = rules[rules.length - 1];
}
+
if (rules.value) {
rules = rules.eval(context).value;
}
@@ -8627,7 +9444,7 @@
}
});
- var Definition = function (name, params, rules, condition, variadic, frames, visibilityInfo) {
+ const Definition = function(name, params, rules, condition, variadic, frames, visibilityInfo) {
this.name = name || 'anonymous mixin';
this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];
this.params = params;
@@ -8636,7 +9453,7 @@
this.arity = params.length;
this.rules = rules;
this._lookups = {};
- var optionalParameters = [];
+ const optionalParameters = [];
this.required = params.reduce(function (count, p) {
if (!p.name || (p.name && !p.value)) {
return count + 1;
@@ -8651,10 +9468,12 @@
this.copyVisibilityInfo(visibilityInfo);
this.allowRoot = true;
};
+
Definition.prototype = Object.assign(new Ruleset(), {
type: 'MixinDefinition',
evalFirst: true,
- accept: function (visitor) {
+
+ accept(visitor) {
if (this.params && this.params.length) {
this.params = visitor.visitArray(this.params);
}
@@ -8663,26 +9482,31 @@
this.condition = visitor.visit(this.condition);
}
},
- evalParams: function (context, mixinEnv, args, evaldArguments) {
+
+ evalParams(context, mixinEnv, args, evaldArguments) {
/* jshint boss:true */
- var frame = new Ruleset(null, null);
- var varargs;
- var arg;
- var params = copyArray(this.params);
- var i;
- var j;
- var val;
- var name;
- var isNamedFound;
- var argIndex;
- var argsLength = 0;
+ const frame = new Ruleset(null, null);
+
+ let varargs;
+ let arg;
+ const params = copyArray(this.params);
+ let i;
+ let j;
+ let val;
+ let name;
+ let isNamedFound;
+ let argIndex;
+ let argsLength = 0;
+
if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {
frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();
}
mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));
+
if (args) {
args = copyArray(args);
argsLength = args.length;
+
for (i = 0; i < argsLength; i++) {
arg = args[i];
if (name = (arg && arg.name)) {
@@ -8699,19 +9523,18 @@
args.splice(i, 1);
i--;
continue;
- }
- else {
- throw { type: 'Runtime', message: "Named argument for ".concat(this.name, " ").concat(args[i].name, " not found") };
+ } else {
+ throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };
}
}
}
}
argIndex = 0;
for (i = 0; i < params.length; i++) {
- if (evaldArguments[i]) {
- continue;
- }
+ if (evaldArguments[i]) { continue; }
+
arg = args && args[argIndex];
+
if (name = params[i].name) {
if (params[i].variadic) {
varargs = [];
@@ -8719,8 +9542,7 @@
varargs.push(args[j].value.eval(context));
}
frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));
- }
- else {
+ } else {
val = arg && arg.value;
if (val) {
// This was a mixin call, pass in a detached ruleset of it's eval'd rules
@@ -8730,18 +9552,18 @@
else {
val = val.eval(context);
}
- }
- else if (params[i].value) {
+ } else if (params[i].value) {
val = params[i].value.eval(mixinEnv);
frame.resetCache();
+ } else {
+ throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };
}
- else {
- throw { type: 'Runtime', message: "wrong number of arguments for ".concat(this.name, " (").concat(argsLength, " for ").concat(this.arity, ")") };
- }
+
frame.prependRule(new Declaration(name, val));
evaldArguments[i] = val;
}
}
+
if (params[i].variadic && args) {
for (j = argIndex; j < argsLength; j++) {
evaldArguments[j] = args[j].value.eval(context);
@@ -8749,31 +9571,37 @@
}
argIndex++;
}
+
return frame;
},
- makeImportant: function () {
- var rules = !this.rules ? this.rules : this.rules.map(function (r) {
+
+ makeImportant() {
+ const rules = !this.rules ? this.rules : this.rules.map(function (r) {
if (r.makeImportant) {
return r.makeImportant(true);
- }
- else {
+ } else {
return r;
}
});
- var result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);
+ const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);
return result;
},
- eval: function (context) {
+
+ eval(context) {
return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || copyArray(context.frames));
},
- evalCall: function (context, args, important) {
- var _arguments = [];
- var mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;
- var frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);
- var rules;
- var ruleset;
+
+ evalCall(context, args, important) {
+ const _arguments = [];
+ const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;
+ const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);
+ let rules;
+ let ruleset;
+
frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));
+
rules = copyArray(this.rules);
+
ruleset = new Ruleset(null, rules);
ruleset.originalRuleset = this;
ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));
@@ -8782,26 +9610,31 @@
}
return ruleset;
},
- matchCondition: function (args, context) {
- if (this.condition && !this.condition.eval(new contexts.Eval(context, [this.evalParams(context, /* the parameter variables */ new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]
- .concat(this.frames || []) // the parent namespace/mixin frames
- .concat(context.frames)))) { // the current environment frames
+
+ matchCondition(args, context) {
+ if (this.condition && !this.condition.eval(
+ new contexts.Eval(context,
+ [this.evalParams(context, /* the parameter variables */
+ new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]
+ .concat(this.frames || []) // the parent namespace/mixin frames
+ .concat(context.frames)))) { // the current environment frames
return false;
}
return true;
},
- matchArgs: function (args, context) {
- var allArgsCnt = (args && args.length) || 0;
- var len;
- var optionalParameters = this.optionalParameters;
- var requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {
+
+ matchArgs(args, context) {
+ const allArgsCnt = (args && args.length) || 0;
+ let len;
+ const optionalParameters = this.optionalParameters;
+ const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {
if (optionalParameters.indexOf(p.name) < 0) {
return count + 1;
- }
- else {
+ } else {
return count;
}
}, 0);
+
if (!this.variadic) {
if (requiredArgsCnt < this.required) {
return false;
@@ -8809,17 +9642,18 @@
if (allArgsCnt > this.params.length) {
return false;
}
- }
- else {
+ } else {
if (requiredArgsCnt < (this.required - 1)) {
return false;
}
}
+
// check patterns
len = Math.min(requiredArgsCnt, this.arity);
- for (var i_1 = 0; i_1 < len; i_1++) {
- if (!this.params[i_1].name && !this.params[i_1].variadic) {
- if (args[i_1].value.eval(context).toCSS() != this.params[i_1].value.eval(context).toCSS()) {
+
+ for (let i = 0; i < len; i++) {
+ if (!this.params[i].name && !this.params[i].variadic) {
+ if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {
return false;
}
}
@@ -8828,7 +9662,7 @@
}
});
- var MixinCall = function (elements, args, index, currentFileInfo, important) {
+ const MixinCall = function(elements, args, index, currentFileInfo, important) {
this.selector = new Selector(elements);
this.arguments = args || [];
this._index = index;
@@ -8837,9 +9671,11 @@
this.allowRoot = true;
this.setParent(this.selector, this);
};
+
MixinCall.prototype = Object.assign(new Node(), {
type: 'MixinCall',
- accept: function (visitor) {
+
+ accept(visitor) {
if (this.selector) {
this.selector = visitor.visit(this.selector);
}
@@ -8847,34 +9683,38 @@
this.arguments = visitor.visitArray(this.arguments);
}
},
- eval: function (context) {
- var mixins;
- var mixin;
- var mixinPath;
- var args = [];
- var arg;
- var argValue;
- var rules = [];
- var match = false;
- var i;
- var m;
- var f;
- var isRecursive;
- var isOneFound;
- var candidates = [];
- var candidate;
- var conditionResult = [];
- var defaultResult;
- var defFalseEitherCase = -1;
- var defNone = 0;
- var defTrue = 1;
- var defFalse = 2;
- var count;
- var originalRuleset;
- var noArgumentsFilter;
+
+ eval(context) {
+ let mixins;
+ let mixin;
+ let mixinPath;
+ const args = [];
+ let arg;
+ let argValue;
+ const rules = [];
+ let match = false;
+ let i;
+ let m;
+ let f;
+ let isRecursive;
+ let isOneFound;
+ const candidates = [];
+ let candidate;
+ const conditionResult = [];
+ let defaultResult;
+ const defFalseEitherCase = -1;
+ const defNone = 0;
+ const defTrue = 1;
+ const defFalse = 2;
+ let count;
+ let originalRuleset;
+ let noArgumentsFilter;
+
this.selector = this.selector.eval(context);
+
function calcDefGroup(mixin, mixinPath) {
- var f, p, namespace;
+ let f, p, namespace;
+
for (f = 0; f < 2; f++) {
conditionResult[f] = true;
defaultFunc.value(f);
@@ -8893,31 +9733,36 @@
return conditionResult[1] ?
defTrue : defFalse;
}
+
return defNone;
}
return defFalseEitherCase;
}
+
for (i = 0; i < this.arguments.length; i++) {
arg = this.arguments[i];
argValue = arg.value.eval(context);
if (arg.expand && Array.isArray(argValue.value)) {
argValue = argValue.value;
for (m = 0; m < argValue.length; m++) {
- args.push({ value: argValue[m] });
+ args.push({value: argValue[m]});
}
- }
- else {
- args.push({ name: arg.name, value: argValue });
+ } else {
+ args.push({name: arg.name, value: argValue});
}
}
- noArgumentsFilter = function (rule) { return rule.matchArgs(null, context); };
+
+ noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};
+
for (i = 0; i < context.frames.length; i++) {
if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {
isOneFound = true;
+
// To make `default()` function independent of definition order we have two "subpasses" here.
// At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),
// and build candidate list with corresponding flags. Then, when we know all possible matches,
// we make a final decision.
+
for (m = 0; m < mixins.length; m++) {
mixin = mixins[m].rule;
mixinPath = mixins[m].path;
@@ -8931,30 +9776,36 @@
if (isRecursive) {
continue;
}
+
if (mixin.matchArgs(args, context)) {
- candidate = { mixin: mixin, group: calcDefGroup(mixin, mixinPath) };
+ candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};
+
if (candidate.group !== defFalseEitherCase) {
candidates.push(candidate);
}
+
match = true;
}
}
+
defaultFunc.reset();
+
count = [0, 0, 0];
for (m = 0; m < candidates.length; m++) {
count[candidates[m].group]++;
}
+
if (count[defNone] > 0) {
defaultResult = defFalse;
- }
- else {
+ } else {
defaultResult = defTrue;
if ((count[defTrue] + count[defFalse]) > 1) {
throw { type: 'Runtime',
- message: "Ambiguous use of `default()` found when matching for `".concat(this.format(args), "`"),
+ message: `Ambiguous use of \`default()\` found when matching for \`${this.format(args)}\``,
index: this.getIndex(), filename: this.fileInfo().filename };
}
}
+
for (m = 0; m < candidates.length; m++) {
candidate = candidates[m].group;
if ((candidate === defNone) || (candidate === defaultResult)) {
@@ -8965,33 +9816,33 @@
mixin = new Definition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());
mixin.originalRuleset = originalRuleset;
}
- var newRules = mixin.evalCall(context, args, this.important).rules;
+ const newRules = mixin.evalCall(context, args, this.important).rules;
this._setVisibilityToReplacement(newRules);
Array.prototype.push.apply(rules, newRules);
- }
- catch (e) {
+ } catch (e) {
throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };
}
}
}
+
if (match) {
return rules;
}
}
}
if (isOneFound) {
- throw { type: 'Runtime',
- message: "No matching definition was found for `".concat(this.format(args), "`"),
- index: this.getIndex(), filename: this.fileInfo().filename };
- }
- else {
- throw { type: 'Name',
- message: "".concat(this.selector.toCSS().trim(), " is undefined"),
- index: this.getIndex(), filename: this.fileInfo().filename };
+ throw { type: 'Runtime',
+ message: `No matching definition was found for \`${this.format(args)}\``,
+ index: this.getIndex(), filename: this.fileInfo().filename };
+ } else {
+ throw { type: 'Name',
+ message: `${this.selector.toCSS().trim()} is undefined`,
+ index: this.getIndex(), filename: this.fileInfo().filename };
}
},
- _setVisibilityToReplacement: function (replacement) {
- var i, rule;
+
+ _setVisibilityToReplacement(replacement) {
+ let i, rule;
if (this.blocksVisibility()) {
for (i = 0; i < replacement.length; i++) {
rule = replacement[i];
@@ -8999,71 +9850,41 @@
}
}
},
- format: function (args) {
- return "".concat(this.selector.toCSS().trim(), "(").concat(args ? args.map(function (a) {
- var argValue = '';
- if (a.name) {
- argValue += "".concat(a.name, ":");
- }
- if (a.value.toCSS) {
- argValue += a.value.toCSS();
- }
- else {
- argValue += '???';
- }
- return argValue;
- }).join(', ') : '', ")");
+
+ format(args) {
+ return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {
+ let argValue = '';
+ if (a.name) {
+ argValue += `${a.name}:`;
+ }
+ if (a.value.toCSS) {
+ argValue += a.value.toCSS();
+ } else {
+ argValue += '???';
+ }
+ return argValue;
+ }).join(', ') : ''})`;
}
});
var tree = {
- Node: Node,
- Color: Color,
- AtRule: AtRule,
- DetachedRuleset: DetachedRuleset,
- Operation: Operation,
- Dimension: Dimension,
- Unit: Unit,
- Keyword: Keyword,
- Variable: Variable,
- Property: Property,
- Ruleset: Ruleset,
- Element: Element,
- Attribute: Attribute,
- Combinator: Combinator,
- Selector: Selector,
- Quoted: Quoted,
- Expression: Expression,
- Declaration: Declaration,
- Call: Call,
- URL: URL,
- Import: Import,
- Comment: Comment,
- Anonymous: Anonymous,
- Value: Value,
- JavaScript: JavaScript,
- Assignment: Assignment,
- Condition: Condition,
- Paren: Paren,
- Media: Media,
- Container: Container,
- QueryInParens: QueryInParens,
- UnicodeDescriptor: UnicodeDescriptor,
- Negative: Negative,
- Extend: Extend,
- VariableCall: VariableCall,
- NamespaceValue: NamespaceValue,
+ Node, Color, AtRule, DetachedRuleset, Operation,
+ Dimension, Unit, Keyword, Variable, Property,
+ Ruleset, Element, Attribute, Combinator, Selector,
+ Quoted, Expression, Declaration, Call, URL, Import,
+ Comment, Anonymous, Value, JavaScript, Assignment,
+ Condition, Paren, Media, Container, QueryInParens,
+ UnicodeDescriptor, Negative, Extend, VariableCall,
+ NamespaceValue,
mixin: {
Call: MixinCall,
Definition: Definition
}
};
- var AbstractFileManager = /** @class */ (function () {
- function AbstractFileManager() {
- }
- AbstractFileManager.prototype.getPath = function (filename) {
- var j = filename.lastIndexOf('?');
+ class AbstractFileManager {
+ getPath(filename) {
+ let j = filename.lastIndexOf('?');
if (j > 0) {
filename = filename.slice(0, j);
}
@@ -9075,46 +9896,53 @@
return '';
}
return filename.slice(0, j + 1);
- };
- AbstractFileManager.prototype.tryAppendExtension = function (path, ext) {
+ }
+
+ tryAppendExtension(path, ext) {
return /(\.[a-z]*$)|([?;].*)$/.test(path) ? path : path + ext;
- };
- AbstractFileManager.prototype.tryAppendLessExtension = function (path) {
+ }
+
+ tryAppendLessExtension(path) {
return this.tryAppendExtension(path, '.less');
- };
- AbstractFileManager.prototype.supportsSync = function () {
+ }
+
+ supportsSync() {
return false;
- };
- AbstractFileManager.prototype.alwaysMakePathsAbsolute = function () {
+ }
+
+ alwaysMakePathsAbsolute() {
return false;
- };
- AbstractFileManager.prototype.isPathAbsolute = function (filename) {
+ }
+
+ isPathAbsolute(filename) {
return (/^(?:[a-z-]+:|\/|\\|#)/i).test(filename);
- };
+ }
+
// TODO: pull out / replace?
- AbstractFileManager.prototype.join = function (basePath, laterPath) {
+ join(basePath, laterPath) {
if (!basePath) {
return laterPath;
}
return basePath + laterPath;
- };
- AbstractFileManager.prototype.pathDiff = function (url, baseUrl) {
+ }
+
+ pathDiff(url, baseUrl) {
// diff between two paths to create a relative path
- var urlParts = this.extractUrlParts(url);
- var baseUrlParts = this.extractUrlParts(baseUrl);
- var i;
- var max;
- var urlDirectories;
- var baseUrlDirectories;
- var diff = '';
+
+ const urlParts = this.extractUrlParts(url);
+
+ const baseUrlParts = this.extractUrlParts(baseUrl);
+ let i;
+ let max;
+ let urlDirectories;
+ let baseUrlDirectories;
+ let diff = '';
if (urlParts.hostPart !== baseUrlParts.hostPart) {
return '';
}
max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);
for (i = 0; i < max; i++) {
- if (baseUrlParts.directories[i] !== urlParts.directories[i]) {
- break;
- }
+ if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }
}
baseUrlDirectories = baseUrlParts.directories.slice(i);
urlDirectories = urlParts.directories.slice(i);
@@ -9122,56 +9950,66 @@
diff += '../';
}
for (i = 0; i < urlDirectories.length - 1; i++) {
- diff += "".concat(urlDirectories[i], "/");
+ diff += `${urlDirectories[i]}/`;
}
return diff;
- };
+ }
+
/**
* Helper function, not part of API.
* This should be replaceable by newer Node / Browser APIs
- *
- * @param {string} url
+ *
+ * @param {string} url
* @param {string} baseUrl
*/
- AbstractFileManager.prototype.extractUrlParts = function (url, baseUrl) {
+ extractUrlParts(url, baseUrl) {
// urlParts[1] = protocol://hostname/ OR /
// urlParts[2] = / if path relative to host base
// urlParts[3] = directories
// urlParts[4] = filename
// urlParts[5] = parameters
- var urlPartsRegex = /^((?:[a-z-]+:)?\/{2}(?:[^/?#]*\/)|([/\\]))?((?:[^/\\?#]*[/\\])*)([^/\\?#]*)([#?].*)?$/i;
- var urlParts = url.match(urlPartsRegex);
- var returner = {};
- var rawDirectories = [];
- var directories = [];
- var i;
- var baseUrlParts;
+
+ const urlPartsRegex = /^((?:[a-z-]+:)?\/{2}(?:[^/?#]*\/)|([/\\]))?((?:[^/\\?#]*[/\\])*)([^/\\?#]*)([#?].*)?$/i;
+
+ const urlParts = url.match(urlPartsRegex);
+ const returner = {};
+ let rawDirectories = [];
+ const directories = [];
+ let i;
+ let baseUrlParts;
+
if (!urlParts) {
- throw new Error("Could not parse sheet href - '".concat(url, "'"));
+ throw new Error(`Could not parse sheet href - '${url}'`);
}
+
// Stylesheets in IE don't always return the full path
if (baseUrl && (!urlParts[1] || urlParts[2])) {
baseUrlParts = baseUrl.match(urlPartsRegex);
if (!baseUrlParts) {
- throw new Error("Could not parse page url - '".concat(baseUrl, "'"));
+ throw new Error(`Could not parse page url - '${baseUrl}'`);
}
urlParts[1] = urlParts[1] || baseUrlParts[1] || '';
if (!urlParts[2]) {
urlParts[3] = baseUrlParts[3] + urlParts[3];
}
}
+
if (urlParts[3]) {
rawDirectories = urlParts[3].replace(/\\/g, '/').split('/');
+
// collapse '..' and skip '.'
for (i = 0; i < rawDirectories.length; i++) {
+
if (rawDirectories[i] === '..') {
directories.pop();
}
else if (rawDirectories[i] !== '.') {
directories.push(rawDirectories[i]);
}
+
}
}
+
returner.hostPart = urlParts[1];
returner.directories = directories;
returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');
@@ -9180,20 +10018,23 @@
returner.fileUrl = returner.path + (urlParts[4] || '');
returner.url = returner.fileUrl + (urlParts[5] || '');
return returner;
- };
- return AbstractFileManager;
- }());
+ }
+ }
- var AbstractPluginLoader = /** @class */ (function () {
- function AbstractPluginLoader() {
+ class AbstractPluginLoader {
+ constructor() {
// Implemented by Node.js plugin loader
- this.require = function () {
+ this.require = function() {
return null;
};
}
- AbstractPluginLoader.prototype.evalPlugin = function (contents, context, imports, pluginOptions, fileInfo) {
- var loader, registry, pluginObj, localModule, pluginManager, filename, result;
+
+ evalPlugin(contents, context, imports, pluginOptions, fileInfo) {
+
+ let loader, registry, pluginObj, localModule, pluginManager, filename, result;
+
pluginManager = context.pluginManager;
+
if (fileInfo) {
if (typeof fileInfo === 'string') {
filename = fileInfo;
@@ -9202,9 +10043,11 @@
filename = fileInfo.filename;
}
}
- var shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;
+ const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;
+
if (filename) {
pluginObj = pluginManager.get(filename);
+
if (pluginObj) {
result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);
if (result) {
@@ -9224,13 +10067,15 @@
}
localModule = {
exports: {},
- pluginManager: pluginManager,
- fileInfo: fileInfo
+ pluginManager,
+ fileInfo
};
registry = functionRegistry.create();
- var registerPlugin = function (obj) {
+
+ const registerPlugin = function(obj) {
pluginObj = obj;
};
+
try {
loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);
loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);
@@ -9238,31 +10083,39 @@
catch (e) {
return new LessError(e, imports, filename);
}
+
if (!pluginObj) {
pluginObj = localModule.exports;
}
pluginObj = this.validatePlugin(pluginObj, filename, shortname);
+
if (pluginObj instanceof LessError) {
return pluginObj;
}
+
if (pluginObj) {
pluginObj.imports = imports;
pluginObj.filename = filename;
+
// For < 3.x (or unspecified minVersion) - setOptions() before install()
if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {
result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);
+
if (result) {
return result;
}
}
+
// Run on first load
pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);
pluginObj.functions = registry.getLocalFunctions();
+
// Need to call setOptions again because the pluginObj might have functions
result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);
if (result) {
return result;
}
+
// Run every @plugin call
try {
if (pluginObj.use) {
@@ -9273,16 +10126,20 @@
e.message = e.message || 'Error during @plugin call';
return new LessError(e, imports, filename);
}
+
}
else {
return new LessError({ message: 'Not a valid plugin' }, imports, filename);
}
+
return pluginObj;
- };
- AbstractPluginLoader.prototype.trySetOptions = function (plugin, filename, name, options) {
+
+ }
+
+ trySetOptions(plugin, filename, name, options) {
if (options && !plugin.setOptions) {
return new LessError({
- message: "Options have been provided but the plugin ".concat(name, " does not support any options.")
+ message: `Options have been provided but the plugin ${name} does not support any options.`
});
}
try {
@@ -9291,58 +10148,63 @@
catch (e) {
return new LessError(e);
}
- };
- AbstractPluginLoader.prototype.validatePlugin = function (plugin, filename, name) {
+ }
+
+ validatePlugin(plugin, filename, name) {
if (plugin) {
// support plugins being a function
// so that the plugin can be more usable programmatically
if (typeof plugin === 'function') {
plugin = new plugin();
}
+
if (plugin.minVersion) {
if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {
return new LessError({
- message: "Plugin ".concat(name, " requires version ").concat(this.versionToString(plugin.minVersion))
+ message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`
});
}
}
return plugin;
}
return null;
- };
- AbstractPluginLoader.prototype.compareVersion = function (aVersion, bVersion) {
+ }
+
+ compareVersion(aVersion, bVersion) {
if (typeof aVersion === 'string') {
aVersion = aVersion.match(/^(\d+)\.?(\d+)?\.?(\d+)?/);
aVersion.shift();
}
- for (var i_1 = 0; i_1 < aVersion.length; i_1++) {
- if (aVersion[i_1] !== bVersion[i_1]) {
- return parseInt(aVersion[i_1]) > parseInt(bVersion[i_1]) ? -1 : 1;
+ for (let i = 0; i < aVersion.length; i++) {
+ if (aVersion[i] !== bVersion[i]) {
+ return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;
}
}
return 0;
- };
- AbstractPluginLoader.prototype.versionToString = function (version) {
- var versionString = '';
- for (var i_2 = 0; i_2 < version.length; i_2++) {
- versionString += (versionString ? '.' : '') + version[i_2];
+ }
+
+ versionToString(version) {
+ let versionString = '';
+ for (let i = 0; i < version.length; i++) {
+ versionString += (versionString ? '.' : '') + version[i];
}
return versionString;
- };
- AbstractPluginLoader.prototype.printUsage = function (plugins) {
- for (var i_3 = 0; i_3 < plugins.length; i_3++) {
- var plugin = plugins[i_3];
+ }
+
+ printUsage(plugins) {
+ for (let i = 0; i < plugins.length; i++) {
+ const plugin = plugins[i];
if (plugin.printUsage) {
plugin.printUsage();
}
}
- };
- return AbstractPluginLoader;
- }());
+ }
+ }
function boolean(condition) {
return condition ? Keyword.True : Keyword.False;
}
+
/**
* Functions with evalArgs set to false are sent context
* as the first argument.
@@ -9352,30 +10214,32 @@
: (falseValue ? falseValue.eval(context) : new Anonymous);
}
If.evalArgs = false;
+
function isdefined(context, variable) {
try {
variable.eval(context);
return Keyword.True;
- }
- catch (e) {
+ } catch (e) {
return Keyword.False;
}
}
+
isdefined.evalArgs = false;
- var boolean$1 = { isdefined: isdefined, boolean: boolean, 'if': If };
- var colorFunctions;
+ var boolean$1 = { isdefined, boolean, 'if': If };
+
+ let colorFunctions;
+
function clamp(val) {
return Math.min(1, Math.max(0, val));
}
function hsla(origColor, hsl) {
- var color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);
+ const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);
if (color) {
- if (origColor.value &&
+ if (origColor.value &&
/^(rgb|hsl)/.test(origColor.value)) {
color.value = origColor.value;
- }
- else {
+ } else {
color.value = 'rgb';
}
return color;
@@ -9384,27 +10248,25 @@
function toHSL(color) {
if (color.toHSL) {
return color.toHSL();
- }
- else {
+ } else {
throw new Error('Argument cannot be evaluated to a color');
}
}
+
function toHSV(color) {
if (color.toHSV) {
return color.toHSV();
- }
- else {
+ } else {
throw new Error('Argument cannot be evaluated to a color');
}
}
+
function number$1(n) {
if (n instanceof Dimension) {
return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);
- }
- else if (typeof n === 'number') {
+ } else if (typeof n === 'number') {
return n;
- }
- else {
+ } else {
throw {
type: 'Argument',
message: 'color functions take numbers as parameters'
@@ -9414,34 +10276,33 @@
function scaled(n, size) {
if (n instanceof Dimension && n.unit.is('%')) {
return parseFloat(n.value * size / 100);
- }
- else {
+ } else {
return number$1(n);
}
}
colorFunctions = {
rgb: function (r, g, b) {
- var a = 1;
+ let a = 1;
/**
* Comma-less syntax
* e.g. rgb(0 128 255 / 50%)
*/
if (r instanceof Expression) {
- var val = r.value;
+ const val = r.value;
r = val[0];
g = val[1];
b = val[2];
- /**
+ /**
* @todo - should this be normalized in
* function caller? Or parsed differently?
*/
if (b instanceof Operation) {
- var op = b;
+ const op = b;
b = op.operands[0];
a = op.operands[1];
}
}
- var color = colorFunctions.rgba(r, g, b, a);
+ const color = colorFunctions.rgba(r, g, b, a);
if (color) {
color.value = 'rgb';
return color;
@@ -9452,40 +10313,41 @@
if (r instanceof Color) {
if (g) {
a = number$1(g);
- }
- else {
+ } else {
a = r.alpha;
}
return new Color(r.rgb, a, 'rgba');
}
- var rgb = [r, g, b].map(function (c) { return scaled(c, 255); });
+ const rgb = [r, g, b].map(c => scaled(c, 255));
a = number$1(a);
return new Color(rgb, a, 'rgba');
}
- catch (e) { }
+ catch (e) {}
},
hsl: function (h, s, l) {
- var a = 1;
+ let a = 1;
if (h instanceof Expression) {
- var val = h.value;
+ const val = h.value;
h = val[0];
s = val[1];
l = val[2];
+
if (l instanceof Operation) {
- var op = l;
+ const op = l;
l = op.operands[0];
a = op.operands[1];
}
}
- var color = colorFunctions.hsla(h, s, l, a);
+ const color = colorFunctions.hsla(h, s, l, a);
if (color) {
color.value = 'hsl';
return color;
}
},
hsla: function (h, s, l, a) {
- var m1;
- var m2;
+ let m1;
+ let m2;
+
function hue(h) {
h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);
if (h * 6 < 1) {
@@ -9501,56 +10363,64 @@
return m1;
}
}
+
try {
if (h instanceof Color) {
if (s) {
a = number$1(s);
- }
- else {
+ } else {
a = h.alpha;
}
return new Color(h.rgb, a, 'hsla');
}
+
h = (number$1(h) % 360) / 360;
- s = clamp(number$1(s));
- l = clamp(number$1(l));
- a = clamp(number$1(a));
+ s = clamp(number$1(s));l = clamp(number$1(l));a = clamp(number$1(a));
+
m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;
m1 = l * 2 - m2;
- var rgb = [
+
+ const rgb = [
hue(h + 1 / 3) * 255,
- hue(h) * 255,
+ hue(h) * 255,
hue(h - 1 / 3) * 255
];
a = number$1(a);
return new Color(rgb, a, 'hsla');
}
- catch (e) { }
+ catch (e) {}
},
- hsv: function (h, s, v) {
+
+ hsv: function(h, s, v) {
return colorFunctions.hsva(h, s, v, 1.0);
},
- hsva: function (h, s, v, a) {
+
+ hsva: function(h, s, v, a) {
h = ((number$1(h) % 360) / 360) * 360;
- s = number$1(s);
- v = number$1(v);
- a = number$1(a);
- var i;
- var f;
+ s = number$1(s);v = number$1(v);a = number$1(a);
+
+ let i;
+ let f;
i = Math.floor((h / 60) % 6);
f = (h / 60) - i;
- var vs = [v,
+
+ const vs = [v,
v * (1 - s),
v * (1 - f * s),
v * (1 - (1 - f) * s)];
- var perm = [[0, 3, 1],
+ const perm = [[0, 3, 1],
[2, 0, 1],
[1, 0, 3],
[1, 2, 0],
[3, 1, 0],
[0, 1, 2]];
- return colorFunctions.rgba(vs[perm[i][0]] * 255, vs[perm[i][1]] * 255, vs[perm[i][2]] * 255, a);
+
+ return colorFunctions.rgba(vs[perm[i][0]] * 255,
+ vs[perm[i][1]] * 255,
+ vs[perm[i][2]] * 255,
+ a);
},
+
hue: function (color) {
return new Dimension(toHSL(color).h);
},
@@ -9560,7 +10430,7 @@
lightness: function (color) {
return new Dimension(toHSL(color).l * 100, '%');
},
- hsvhue: function (color) {
+ hsvhue: function(color) {
return new Dimension(toHSV(color).h);
},
hsvsaturation: function (color) {
@@ -9585,9 +10455,11 @@
return new Dimension(color.luma() * color.alpha * 100, '%');
},
luminance: function (color) {
- var luminance = (0.2126 * color.rgb[0] / 255) +
- (0.7152 * color.rgb[1] / 255) +
- (0.0722 * color.rgb[2] / 255);
+ const luminance =
+ (0.2126 * color.rgb[0] / 255) +
+ (0.7152 * color.rgb[1] / 255) +
+ (0.0722 * color.rgb[2] / 255);
+
return new Dimension(luminance * color.alpha * 100, '%');
},
saturate: function (color, amount, method) {
@@ -9596,9 +10468,10 @@
if (!color.rgb) {
return null;
}
- var hsl = toHSL(color);
+ const hsl = toHSL(color);
+
if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.s += hsl.s * amount.value / 100;
+ hsl.s += hsl.s * amount.value / 100;
}
else {
hsl.s += amount.value / 100;
@@ -9607,9 +10480,10 @@
return hsla(color, hsl);
},
desaturate: function (color, amount, method) {
- var hsl = toHSL(color);
+ const hsl = toHSL(color);
+
if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.s -= hsl.s * amount.value / 100;
+ hsl.s -= hsl.s * amount.value / 100;
}
else {
hsl.s -= amount.value / 100;
@@ -9618,9 +10492,10 @@
return hsla(color, hsl);
},
lighten: function (color, amount, method) {
- var hsl = toHSL(color);
+ const hsl = toHSL(color);
+
if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.l += hsl.l * amount.value / 100;
+ hsl.l += hsl.l * amount.value / 100;
}
else {
hsl.l += amount.value / 100;
@@ -9629,9 +10504,10 @@
return hsla(color, hsl);
},
darken: function (color, amount, method) {
- var hsl = toHSL(color);
+ const hsl = toHSL(color);
+
if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.l -= hsl.l * amount.value / 100;
+ hsl.l -= hsl.l * amount.value / 100;
}
else {
hsl.l -= amount.value / 100;
@@ -9640,9 +10516,10 @@
return hsla(color, hsl);
},
fadein: function (color, amount, method) {
- var hsl = toHSL(color);
+ const hsl = toHSL(color);
+
if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.a += hsl.a * amount.value / 100;
+ hsl.a += hsl.a * amount.value / 100;
}
else {
hsl.a += amount.value / 100;
@@ -9651,9 +10528,10 @@
return hsla(color, hsl);
},
fadeout: function (color, amount, method) {
- var hsl = toHSL(color);
+ const hsl = toHSL(color);
+
if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.a -= hsl.a * amount.value / 100;
+ hsl.a -= hsl.a * amount.value / 100;
}
else {
hsl.a -= amount.value / 100;
@@ -9662,15 +10540,18 @@
return hsla(color, hsl);
},
fade: function (color, amount) {
- var hsl = toHSL(color);
+ const hsl = toHSL(color);
+
hsl.a = amount.value / 100;
hsl.a = clamp(hsl.a);
return hsla(color, hsl);
},
spin: function (color, amount) {
- var hsl = toHSL(color);
- var hue = (hsl.h + amount.value) % 360;
+ const hsl = toHSL(color);
+ const hue = (hsl.h + amount.value) % 360;
+
hsl.h = hue < 0 ? 360 + hue : hue;
+
return hsla(color, hsl);
},
//
@@ -9681,15 +10562,19 @@
if (!weight) {
weight = new Dimension(50);
}
- var p = weight.value / 100.0;
- var w = p * 2 - 1;
- var a = toHSL(color1).a - toHSL(color2).a;
- var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;
- var w2 = 1 - w1;
- var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,
+ const p = weight.value / 100.0;
+ const w = p * 2 - 1;
+ const a = toHSL(color1).a - toHSL(color2).a;
+
+ const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;
+ const w2 = 1 - w1;
+
+ const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,
color1.rgb[1] * w1 + color2.rgb[1] * w2,
color1.rgb[2] * w1 + color2.rgb[2] * w2];
- var alpha = color1.alpha * p + color2.alpha * (1 - p);
+
+ const alpha = color1.alpha * p + color2.alpha * (1 - p);
+
return new Color(rgb, alpha);
},
greyscale: function (color) {
@@ -9709,20 +10594,18 @@
}
// Figure out which is actually light and dark:
if (dark.luma() > light.luma()) {
- var t = light;
+ const t = light;
light = dark;
dark = t;
}
if (typeof threshold === 'undefined') {
threshold = 0.43;
- }
- else {
+ } else {
threshold = number$1(threshold);
}
if (color.luma() < threshold) {
return light;
- }
- else {
+ } else {
return dark;
}
},
@@ -9767,71 +10650,80 @@
argb: function (color) {
return new Anonymous(color.toARGB());
},
- color: function (c) {
+ color: function(c) {
if ((c instanceof Quoted) &&
(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {
- var val = c.value.slice(1);
- return new Color(val, undefined, "#".concat(val));
+ const val = c.value.slice(1);
+ return new Color(val, undefined, `#${val}`);
}
if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {
c.value = undefined;
return c;
}
throw {
- type: 'Argument',
+ type: 'Argument',
message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'
};
},
- tint: function (color, amount) {
+ tint: function(color, amount) {
return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);
},
- shade: function (color, amount) {
+ shade: function(color, amount) {
return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);
}
};
+
var color = colorFunctions;
// Color Blending
// ref: http://www.w3.org/TR/compositing-1
+
function colorBlend(mode, color1, color2) {
- var ab = color1.alpha; // result
- var // backdrop
- cb;
- var as = color2.alpha;
- var // source
- cs;
- var ar;
- var cr;
- var r = [];
+ const ab = color1.alpha; // result
+
+ let // backdrop
+ cb;
+
+ const as = color2.alpha;
+
+ let // source
+ cs;
+
+ let ar;
+ let cr;
+ const r = [];
+
ar = as + ab * (1 - as);
- for (var i_1 = 0; i_1 < 3; i_1++) {
- cb = color1.rgb[i_1] / 255;
- cs = color2.rgb[i_1] / 255;
+ for (let i = 0; i < 3; i++) {
+ cb = color1.rgb[i] / 255;
+ cs = color2.rgb[i] / 255;
cr = mode(cb, cs);
if (ar) {
cr = (as * cs + ab * (cb -
- as * (cb + cs - cr))) / ar;
+ as * (cb + cs - cr))) / ar;
}
- r[i_1] = cr * 255;
+ r[i] = cr * 255;
}
+
return new Color(r, ar);
}
- var colorBlendModeFunctions = {
- multiply: function (cb, cs) {
+
+ const colorBlendModeFunctions = {
+ multiply: function(cb, cs) {
return cb * cs;
},
- screen: function (cb, cs) {
+ screen: function(cb, cs) {
return cb + cs - cb * cs;
},
- overlay: function (cb, cs) {
+ overlay: function(cb, cs) {
cb *= 2;
return (cb <= 1) ?
colorBlendModeFunctions.multiply(cb, cs) :
colorBlendModeFunctions.screen(cb - 1, cs);
},
- softlight: function (cb, cs) {
- var d = 1;
- var e = cb;
+ softlight: function(cb, cs) {
+ let d = 1;
+ let e = cb;
if (cs > 0.5) {
e = 1;
d = (cb > 0.25) ? Math.sqrt(cb)
@@ -9839,130 +10731,143 @@
}
return cb - (1 - 2 * cs) * e * (d - cb);
},
- hardlight: function (cb, cs) {
+ hardlight: function(cb, cs) {
return colorBlendModeFunctions.overlay(cs, cb);
},
- difference: function (cb, cs) {
+ difference: function(cb, cs) {
return Math.abs(cb - cs);
},
- exclusion: function (cb, cs) {
+ exclusion: function(cb, cs) {
return cb + cs - 2 * cb * cs;
},
+
// non-w3c functions:
- average: function (cb, cs) {
+ average: function(cb, cs) {
return (cb + cs) / 2;
},
- negation: function (cb, cs) {
+ negation: function(cb, cs) {
return 1 - Math.abs(cb + cs - 1);
}
};
- for (var f$1 in colorBlendModeFunctions) {
+
+ for (const f in colorBlendModeFunctions) {
// eslint-disable-next-line no-prototype-builtins
- if (colorBlendModeFunctions.hasOwnProperty(f$1)) {
- colorBlend[f$1] = colorBlend.bind(null, colorBlendModeFunctions[f$1]);
+ if (colorBlendModeFunctions.hasOwnProperty(f)) {
+ colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);
}
}
- var dataUri = (function (environment) {
- var fallback = function (functionThis, node) { return new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); };
- return { 'data-uri': function (mimetypeNode, filePathNode) {
- if (!filePathNode) {
- filePathNode = mimetypeNode;
- mimetypeNode = null;
- }
- var mimetype = mimetypeNode && mimetypeNode.value;
- var filePath = filePathNode.value;
- var currentFileInfo = this.currentFileInfo;
- var currentDirectory = currentFileInfo.rewriteUrls ?
- currentFileInfo.currentDirectory : currentFileInfo.entryPath;
- var fragmentStart = filePath.indexOf('#');
- var fragment = '';
- if (fragmentStart !== -1) {
- fragment = filePath.slice(fragmentStart);
- filePath = filePath.slice(0, fragmentStart);
- }
- var context = clone(this.context);
- context.rawBuffer = true;
- var fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);
- if (!fileManager) {
- return fallback(this, filePathNode);
- }
- var useBase64 = false;
- // detect the mimetype if not given
- if (!mimetypeNode) {
- mimetype = environment.mimeLookup(filePath);
- if (mimetype === 'image/svg+xml') {
- useBase64 = false;
- }
- else {
- // use base 64 unless it's an ASCII or UTF-8 format
- var charset = environment.charsetLookup(mimetype);
- useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;
- }
- if (useBase64) {
- mimetype += ';base64';
- }
- }
- else {
- useBase64 = /;base64$/.test(mimetype);
- }
- var fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);
- if (!fileSync.contents) {
- logger$1.warn("Skipped data-uri embedding of ".concat(filePath, " because file not found"));
- return fallback(this, filePathNode || mimetypeNode);
- }
- var buf = fileSync.contents;
- if (useBase64 && !environment.encodeBase64) {
- return fallback(this, filePathNode);
+ var dataUri = environment => {
+
+ const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context);
+
+ return { 'data-uri': function(mimetypeNode, filePathNode) {
+
+ if (!filePathNode) {
+ filePathNode = mimetypeNode;
+ mimetypeNode = null;
+ }
+
+ let mimetype = mimetypeNode && mimetypeNode.value;
+ let filePath = filePathNode.value;
+ const currentFileInfo = this.currentFileInfo;
+ const currentDirectory = currentFileInfo.rewriteUrls ?
+ currentFileInfo.currentDirectory : currentFileInfo.entryPath;
+
+ const fragmentStart = filePath.indexOf('#');
+ let fragment = '';
+ if (fragmentStart !== -1) {
+ fragment = filePath.slice(fragmentStart);
+ filePath = filePath.slice(0, fragmentStart);
+ }
+ const context = clone(this.context);
+ context.rawBuffer = true;
+
+ const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);
+
+ if (!fileManager) {
+ return fallback(this, filePathNode);
+ }
+
+ let useBase64 = false;
+
+ // detect the mimetype if not given
+ if (!mimetypeNode) {
+
+ mimetype = environment.mimeLookup(filePath);
+
+ if (mimetype === 'image/svg+xml') {
+ useBase64 = false;
+ } else {
+ // use base 64 unless it's an ASCII or UTF-8 format
+ const charset = environment.charsetLookup(mimetype);
+ useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;
}
- buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);
- var uri = "data:".concat(mimetype, ",").concat(buf).concat(fragment);
- return new URL(new Quoted("\"".concat(uri, "\""), uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);
- } };
- });
+ if (useBase64) { mimetype += ';base64'; }
+ }
+ else {
+ useBase64 = /;base64$/.test(mimetype);
+ }
+
+ const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);
+ if (!fileSync.contents) {
+ logger$1.warn(`Skipped data-uri embedding of ${filePath} because file not found`);
+ return fallback(this, filePathNode || mimetypeNode);
+ }
+ let buf = fileSync.contents;
+ if (useBase64 && !environment.encodeBase64) {
+ return fallback(this, filePathNode);
+ }
+
+ buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);
+
+ const uri = `data:${mimetype},${buf}${fragment}`;
- var getItemsFromNode = function (node) {
+ return new URL(new Quoted(`"${uri}"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);
+ }};
+ };
+
+ const getItemsFromNode = node => {
// handle non-array values as an array of length 1
// return 'undefined' if index is invalid
- var items = Array.isArray(node.value) ?
+ const items = Array.isArray(node.value) ?
node.value : Array(node);
+
return items;
};
+
var list = {
- _SELF: function (n) {
+ _SELF: function(n) {
return n;
},
- '~': function () {
- var expr = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- expr[_i] = arguments[_i];
- }
+ '~': function(...expr) {
if (expr.length === 1) {
return expr[0];
}
return new Value(expr);
},
- extract: function (values, index) {
+ extract: function(values, index) {
// (1-based index)
index = index.value - 1;
+
return getItemsFromNode(values)[index];
},
- length: function (values) {
+ length: function(values) {
return new Dimension(getItemsFromNode(values).length);
},
/**
* Creates a Less list of incremental values.
* Modeled after Lodash's range function, also exists natively in PHP
- *
+ *
* @param {Dimension} [start=1]
* @param {Dimension} end - e.g. 10 or 10px - unit is added to output
- * @param {Dimension} [step=1]
+ * @param {Dimension} [step=1]
*/
- range: function (start, end, step) {
- var from;
- var to;
- var stepValue = 1;
- var list = [];
+ range: function(start, end, step) {
+ let from;
+ let to;
+ let stepValue = 1;
+ const list = [];
if (end) {
to = end;
from = start.value;
@@ -9974,139 +10879,158 @@
from = 1;
to = start;
}
- for (var i_1 = from; i_1 <= to.value; i_1 += stepValue) {
- list.push(new Dimension(i_1, to.unit));
+
+ for (let i = from; i <= to.value; i += stepValue) {
+ list.push(new Dimension(i, to.unit));
}
+
return new Expression(list);
},
- each: function (list, rs) {
- var _this = this;
- var rules = [];
- var newRules;
- var iterator;
- var tryEval = function (val) {
+ each: function(list, rs) {
+ const rules = [];
+ let newRules;
+ let iterator;
+
+ const tryEval = val => {
if (val instanceof Node) {
- return val.eval(_this.context);
+ return val.eval(this.context);
}
return val;
};
+
if (list.value && !(list instanceof Quoted)) {
if (Array.isArray(list.value)) {
iterator = list.value.map(tryEval);
- }
- else {
+ } else {
iterator = [tryEval(list.value)];
}
- }
- else if (list.ruleset) {
+ } else if (list.ruleset) {
iterator = tryEval(list.ruleset).rules;
- }
- else if (list.rules) {
+ } else if (list.rules) {
iterator = list.rules.map(tryEval);
- }
- else if (Array.isArray(list)) {
+ } else if (Array.isArray(list)) {
iterator = list.map(tryEval);
- }
- else {
+ } else {
iterator = [tryEval(list)];
}
- var valueName = '@value';
- var keyName = '@key';
- var indexName = '@index';
+
+ let valueName = '@value';
+ let keyName = '@key';
+ let indexName = '@index';
+
if (rs.params) {
valueName = rs.params[0] && rs.params[0].name;
keyName = rs.params[1] && rs.params[1].name;
indexName = rs.params[2] && rs.params[2].name;
rs = rs.rules;
- }
- else {
+ } else {
rs = rs.ruleset;
}
- for (var i_2 = 0; i_2 < iterator.length; i_2++) {
- var key = void 0;
- var value = void 0;
- var item = iterator[i_2];
+
+ for (let i = 0; i < iterator.length; i++) {
+ let key;
+ let value;
+ const item = iterator[i];
if (item instanceof Declaration) {
key = typeof item.name === 'string' ? item.name : item.name[0].value;
value = item.value;
- }
- else {
- key = new Dimension(i_2 + 1);
+ } else {
+ key = new Dimension(i + 1);
value = item;
}
+
if (item instanceof Comment) {
continue;
}
+
newRules = rs.rules.slice(0);
if (valueName) {
- newRules.push(new Declaration(valueName, value, false, false, this.index, this.currentFileInfo));
+ newRules.push(new Declaration(valueName,
+ value,
+ false, false, this.index, this.currentFileInfo));
}
if (indexName) {
- newRules.push(new Declaration(indexName, new Dimension(i_2 + 1), false, false, this.index, this.currentFileInfo));
+ newRules.push(new Declaration(indexName,
+ new Dimension(i + 1),
+ false, false, this.index, this.currentFileInfo));
}
if (keyName) {
- newRules.push(new Declaration(keyName, key, false, false, this.index, this.currentFileInfo));
+ newRules.push(new Declaration(keyName,
+ key,
+ false, false, this.index, this.currentFileInfo));
}
- rules.push(new Ruleset([new (Selector)([new Element('', '&')])], newRules, rs.strictImports, rs.visibilityInfo()));
+
+ rules.push(new Ruleset([ new(Selector)([ new Element('', '&') ]) ],
+ newRules,
+ rs.strictImports,
+ rs.visibilityInfo()
+ ));
}
- return new Ruleset([new (Selector)([new Element('', '&')])], rules, rs.strictImports, rs.visibilityInfo()).eval(this.context);
+
+ return new Ruleset([ new(Selector)([ new Element('', '&') ]) ],
+ rules,
+ rs.strictImports,
+ rs.visibilityInfo()
+ ).eval(this.context);
}
};
- var MathHelper = function (fn, unit, n) {
+ const MathHelper = (fn, unit, n) => {
if (!(n instanceof Dimension)) {
throw { type: 'Argument', message: 'argument must be a number' };
}
if (unit === null) {
unit = n.unit;
- }
- else {
+ } else {
n = n.unify();
}
return new Dimension(fn(parseFloat(n.value)), unit);
};
- var mathFunctions = {
+ const mathFunctions = {
// name, unit
- ceil: null,
+ ceil: null,
floor: null,
- sqrt: null,
- abs: null,
- tan: '',
- sin: '',
- cos: '',
- atan: 'rad',
- asin: 'rad',
- acos: 'rad'
+ sqrt: null,
+ abs: null,
+ tan: '',
+ sin: '',
+ cos: '',
+ atan: 'rad',
+ asin: 'rad',
+ acos: 'rad'
};
- for (var f in mathFunctions) {
+
+ for (const f in mathFunctions) {
// eslint-disable-next-line no-prototype-builtins
if (mathFunctions.hasOwnProperty(f)) {
mathFunctions[f] = MathHelper.bind(null, Math[f], mathFunctions[f]);
}
}
- mathFunctions.round = function (n, f) {
- var fraction = typeof f === 'undefined' ? 0 : f.value;
- return MathHelper(function (num) { return num.toFixed(fraction); }, null, n);
+
+ mathFunctions.round = (n, f) => {
+ const fraction = typeof f === 'undefined' ? 0 : f.value;
+ return MathHelper(num => num.toFixed(fraction), null, n);
};
- var minMax = function (isMin, args) {
- var _this = this;
+ const minMax = function (isMin, args) {
args = Array.prototype.slice.call(args);
switch (args.length) {
case 0: throw { type: 'Argument', message: 'one or more arguments required' };
}
- var i; // key is the unit.toString() for unified Dimension values,
- var j;
- var current;
- var currentUnified;
- var referenceUnified;
- var unit;
- var unitStatic;
- var unitClone;
- var // elems only contains original argument values.
- order = [];
- var values = {};
+ let i; // key is the unit.toString() for unified Dimension values,
+ let j;
+ let current;
+ let currentUnified;
+ let referenceUnified;
+ let unit;
+ let unitStatic;
+ let unitClone;
+
+ const // elems only contains original argument values.
+ order = [];
+
+ const values = {};
// value is the index into the order array.
for (i = 0; i < args.length; i++) {
current = args[i];
@@ -10114,8 +11038,7 @@
if (Array.isArray(args[i].value)) {
Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));
continue;
- }
- else {
+ } else {
throw { type: 'Argument', message: 'incompatible types' };
}
}
@@ -10133,7 +11056,7 @@
continue;
}
referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();
- if (isMin && currentUnified.value < referenceUnified.value ||
+ if ( isMin && currentUnified.value < referenceUnified.value ||
!isMin && currentUnified.value > referenceUnified.value) {
order[j] = current;
}
@@ -10141,29 +11064,20 @@
if (order.length == 1) {
return order[0];
}
- args = order.map(function (a) { return a.toCSS(_this.context); }).join(this.context.compress ? ',' : ', ');
- return new Anonymous("".concat(isMin ? 'min' : 'max', "(").concat(args, ")"));
+ args = order.map(a => { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');
+ return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);
};
+
var number = {
- min: function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
+ min: function(...args) {
try {
return minMax.call(this, true, args);
- }
- catch (e) { }
+ } catch (e) {}
},
- max: function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
+ max: function(...args) {
try {
return minMax.call(this, false, args);
- }
- catch (e) { }
+ } catch (e) {}
},
convert: function (val, unit) {
return val.convertTo(unit.value);
@@ -10171,21 +11085,22 @@
pi: function () {
return new Dimension(Math.PI);
},
- mod: function (a, b) {
+ mod: function(a, b) {
return new Dimension(a.value % b.value, a.unit);
},
- pow: function (x, y) {
+ pow: function(x, y) {
if (typeof x === 'number' && typeof y === 'number') {
x = new Dimension(x);
y = new Dimension(y);
- }
- else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {
+ } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {
throw { type: 'Argument', message: 'arguments must be numbers' };
}
+
return new Dimension(Math.pow(x.value, y.value), x.unit);
},
percentage: function (n) {
- var result = MathHelper(function (num) { return num * 100; }, '%', n);
+ const result = MathHelper(num => num * 100, '%', n);
+
return result;
}
};
@@ -10195,115 +11110,118 @@
return new Quoted('"', str instanceof JavaScript ? str.evaluated : str.value, true);
},
escape: function (str) {
- return new Anonymous(encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')
- .replace(/\(/g, '%28').replace(/\)/g, '%29'));
+ return new Anonymous(
+ encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')
+ .replace(/\(/g, '%28').replace(/\)/g, '%29'));
},
replace: function (string, pattern, replacement, flags) {
- var result = string.value;
+ let result = string.value;
replacement = (replacement.type === 'Quoted') ?
replacement.value : replacement.toCSS();
result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);
return new Quoted(string.quote || '', result, string.escaped);
},
'%': function (string /* arg, arg, ... */) {
- var args = Array.prototype.slice.call(arguments, 1);
- var result = string.value;
- var _loop_1 = function (i_1) {
+ const args = Array.prototype.slice.call(arguments, 1);
+ let result = string.value;
+
+ for (let i = 0; i < args.length; i++) {
/* jshint loopfunc:true */
- result = result.replace(/%[sda]/i, function (token) {
- var value = ((args[i_1].type === 'Quoted') &&
- token.match(/s/i)) ? args[i_1].value : args[i_1].toCSS();
+ result = result.replace(/%[sda]/i, token => {
+ const value = ((args[i].type === 'Quoted') &&
+ token.match(/s/i)) ? args[i].value : args[i].toCSS();
return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;
});
- };
- for (var i_1 = 0; i_1 < args.length; i_1++) {
- _loop_1(i_1);
}
result = result.replace(/%%/g, '%');
return new Quoted(string.quote || '', result, string.escaped);
}
};
- var svg = (function () {
- return { 'svg-gradient': function (direction) {
- var stops;
- var gradientDirectionSvg;
- var gradientType = 'linear';
- var rectangleDimension = 'x="0" y="0" width="1" height="1"';
- var renderEnv = { compress: false };
- var returner;
- var directionValue = direction.toCSS(renderEnv);
- var i;
- var color;
- var position;
- var positionValue;
- var alpha;
- function throwArgumentDescriptor() {
- throw { type: 'Argument',
- message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +
- ' end_color [end_position] or direction, color list' };
- }
- if (arguments.length == 2) {
- if (arguments[1].value.length < 2) {
- throwArgumentDescriptor();
- }
- stops = arguments[1].value;
- }
- else if (arguments.length < 3) {
+ var svg = () => {
+ return { 'svg-gradient': function(direction) {
+ let stops;
+ let gradientDirectionSvg;
+ let gradientType = 'linear';
+ let rectangleDimension = 'x="0" y="0" width="1" height="1"';
+ const renderEnv = {compress: false};
+ let returner;
+ const directionValue = direction.toCSS(renderEnv);
+ let i;
+ let color;
+ let position;
+ let positionValue;
+ let alpha;
+
+ function throwArgumentDescriptor() {
+ throw { type: 'Argument',
+ message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +
+ ' end_color [end_position] or direction, color list' };
+ }
+
+ if (arguments.length == 2) {
+ if (arguments[1].value.length < 2) {
throwArgumentDescriptor();
}
- else {
- stops = Array.prototype.slice.call(arguments, 1);
- }
- switch (directionValue) {
- case 'to bottom':
- gradientDirectionSvg = 'x1="0%" y1="0%" x2="0%" y2="100%"';
- break;
- case 'to right':
- gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="0%"';
- break;
- case 'to bottom right':
- gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="100%"';
- break;
- case 'to top right':
- gradientDirectionSvg = 'x1="0%" y1="100%" x2="100%" y2="0%"';
- break;
- case 'ellipse':
- case 'ellipse at center':
- gradientType = 'radial';
- gradientDirectionSvg = 'cx="50%" cy="50%" r="75%"';
- rectangleDimension = 'x="-50" y="-50" width="101" height="101"';
- break;
- default:
- throw { type: 'Argument', message: 'svg-gradient direction must be \'to bottom\', \'to right\',' +
- ' \'to bottom right\', \'to top right\' or \'ellipse at center\'' };
+ stops = arguments[1].value;
+ } else if (arguments.length < 3) {
+ throwArgumentDescriptor();
+ } else {
+ stops = Array.prototype.slice.call(arguments, 1);
+ }
+
+ switch (directionValue) {
+ case 'to bottom':
+ gradientDirectionSvg = 'x1="0%" y1="0%" x2="0%" y2="100%"';
+ break;
+ case 'to right':
+ gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="0%"';
+ break;
+ case 'to bottom right':
+ gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="100%"';
+ break;
+ case 'to top right':
+ gradientDirectionSvg = 'x1="0%" y1="100%" x2="100%" y2="0%"';
+ break;
+ case 'ellipse':
+ case 'ellipse at center':
+ gradientType = 'radial';
+ gradientDirectionSvg = 'cx="50%" cy="50%" r="75%"';
+ rectangleDimension = 'x="-50" y="-50" width="101" height="101"';
+ break;
+ default:
+ throw { type: 'Argument', message: 'svg-gradient direction must be \'to bottom\', \'to right\',' +
+ ' \'to bottom right\', \'to top right\' or \'ellipse at center\'' };
+ }
+ returner = ``;
+
+ returner = encodeURIComponent(returner);
+
+ returner = `data:image/svg+xml,${returner}`;
+ return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);
+ }};
+ };
- var isa = function (n, Type) { return (n instanceof Type) ? Keyword.True : Keyword.False; };
- var isunit = function (n, unit) {
+ const isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;
+ const isunit = (n, unit) => {
if (unit === undefined) {
throw { type: 'Argument', message: 'missing the required second argument to isunit.' };
}
@@ -10313,6 +11231,7 @@
}
return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;
};
+
var types = {
isruleset: function (n) {
return isa(n, DetachedRuleset);
@@ -10341,21 +11260,19 @@
isem: function (n) {
return isunit(n, 'em');
},
- isunit: isunit,
+ isunit,
unit: function (val, unit) {
if (!(val instanceof Dimension)) {
throw { type: 'Argument',
- message: "the first argument to unit must be a number".concat(val instanceof Operation ? '. Have you forgotten parenthesis?' : '') };
+ message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };
}
if (unit) {
if (unit instanceof Keyword) {
unit = unit.value;
- }
- else {
+ } else {
unit = unit.toCSS();
}
- }
- else {
+ } else {
unit = '';
}
return new Dimension(val.value, unit);
@@ -10365,31 +11282,34 @@
}
};
- var styleExpression = function (args) {
- var _this = this;
+ const styleExpression = function (args) {
args = Array.prototype.slice.call(args);
- switch (args.length) {
- case 0: throw { type: 'Argument', message: 'one or more arguments required' };
+ if (args.length === 0) {
+ throw { type: 'Argument', message: 'one or more arguments required' };
}
- var entityList = [new Variable(args[0].value, this.index, this.currentFileInfo).eval(this.context)];
- args = entityList.map(function (a) { return a.toCSS(_this.context); }).join(this.context.compress ? ',' : ', ');
- return new Variable("style(".concat(args, ")"));
+
+ const entityList = [new Variable(args[0].value, this.index, this.currentFileInfo).eval(this.context)];
+
+ args = entityList.map(a => { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');
+
+ return new Anonymous(`style(${args})`);
};
+
var style$1 = {
- style: function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
+ style: function(...args) {
try {
return styleExpression.call(this, args);
+ } catch (e) {
+ // When style() is used as a CSS function (e.g. @container style(--responsive: true)),
+ // arguments won't be valid Less variables. Return undefined to let the
+ // parser fall through and treat it as plain CSS.
}
- catch (e) { }
},
};
- var functions = (function (environment) {
- var functions = { functionRegistry: functionRegistry, functionCaller: functionCaller };
+ var functions = environment => {
+ const functions = { functionRegistry, functionCaller };
+
// register functions
functionRegistry.addMultiple(boolean$1);
functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));
@@ -10403,14 +11323,16 @@
functionRegistry.addMultiple(svg());
functionRegistry.addMultiple(types);
functionRegistry.addMultiple(style$1);
+
return functions;
- });
+ };
- function transformTree (root, options) {
+ function transformTree(root, options) {
options = options || {};
- var evaldRoot;
- var variables = options.variables;
- var evalEnv = new contexts.Eval(options);
+ let evaldRoot;
+ let variables = options.variables;
+ const evalEnv = new contexts.Eval(options);
+
//
// Allows setting variables with a hash, so:
//
@@ -10426,44 +11348,48 @@
//
if (typeof variables === 'object' && !Array.isArray(variables)) {
variables = Object.keys(variables).map(function (k) {
- var value = variables[k];
+ let value = variables[k];
+
if (!(value instanceof tree.Value)) {
if (!(value instanceof tree.Expression)) {
value = new tree.Expression([value]);
}
value = new tree.Value([value]);
}
- return new tree.Declaration("@".concat(k), value, false, null, 0);
+ return new tree.Declaration(`@${k}`, value, false, null, 0);
});
evalEnv.frames = [new tree.Ruleset(null, variables)];
}
- var visitors$1 = [
+
+ const visitors$1 = [
new visitors.JoinSelectorVisitor(),
new visitors.MarkVisibleSelectorsVisitor(true),
new visitors.ExtendVisitor(),
- new visitors.ToCSSVisitor({ compress: Boolean(options.compress) })
+ new visitors.ToCSSVisitor({compress: Boolean(options.compress)})
];
- var preEvalVisitors = [];
- var v;
- var visitorIterator;
+
+ const preEvalVisitors = [];
+ let v;
+ let visitorIterator;
+
/**
* first() / get() allows visitors to be added while visiting
- *
+ *
* @todo Add scoping for visitors just like functions for @plugin; right now they're global
*/
if (options.pluginManager) {
visitorIterator = options.pluginManager.visitor();
- for (var i_1 = 0; i_1 < 2; i_1++) {
+ for (let i = 0; i < 2; i++) {
visitorIterator.first();
while ((v = visitorIterator.get())) {
if (v.isPreEvalVisitor) {
- if (i_1 === 0 || preEvalVisitors.indexOf(v) === -1) {
+ if (i === 0 || preEvalVisitors.indexOf(v) === -1) {
preEvalVisitors.push(v);
v.run(root);
}
}
else {
- if (i_1 === 0 || visitors$1.indexOf(v) === -1) {
+ if (i === 0 || visitors$1.indexOf(v) === -1) {
if (v.isPreVisitor) {
visitors$1.unshift(v);
}
@@ -10475,10 +11401,13 @@
}
}
}
+
evaldRoot = root.eval(evalEnv);
- for (var i_2 = 0; i_2 < visitors$1.length; i_2++) {
- visitors$1[i_2].run(evaldRoot);
+
+ for (let i = 0; i < visitors$1.length; i++) {
+ visitors$1[i].run(evaldRoot);
}
+
// Run any remaining visitors added after eval pass
if (options.pluginManager) {
visitorIterator.first();
@@ -10488,14 +11417,15 @@
}
}
}
+
return evaldRoot;
}
/**
* Plugin Manager
*/
- var PluginManager = /** @class */ (function () {
- function PluginManager(less) {
+ class PluginManager {
+ constructor(less) {
this.less = less;
this.visitors = [];
this.preProcessors = [];
@@ -10506,23 +11436,25 @@
this.pluginCache = {};
this.Loader = new less.PluginLoader(less);
}
+
/**
* Adds all the plugins in the array
* @param {Array} plugins
*/
- PluginManager.prototype.addPlugins = function (plugins) {
+ addPlugins(plugins) {
if (plugins) {
- for (var i_1 = 0; i_1 < plugins.length; i_1++) {
- this.addPlugin(plugins[i_1]);
+ for (let i = 0; i < plugins.length; i++) {
+ this.addPlugin(plugins[i]);
}
}
- };
+ }
+
/**
*
* @param plugin
* @param {String} filename
*/
- PluginManager.prototype.addPlugin = function (plugin, filename, functionRegistry) {
+ addPlugin(plugin, filename, functionRegistry) {
this.installedPlugins.push(plugin);
if (filename) {
this.pluginCache[filename] = plugin;
@@ -10530,114 +11462,125 @@
if (plugin.install) {
plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);
}
- };
+ }
+
/**
*
* @param filename
*/
- PluginManager.prototype.get = function (filename) {
+ get(filename) {
return this.pluginCache[filename];
- };
+ }
+
/**
* Adds a visitor. The visitor object has options on itself to determine
* when it should run.
* @param visitor
*/
- PluginManager.prototype.addVisitor = function (visitor) {
+ addVisitor(visitor) {
this.visitors.push(visitor);
- };
+ }
+
/**
* Adds a pre processor object
* @param {object} preProcessor
* @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import
*/
- PluginManager.prototype.addPreProcessor = function (preProcessor, priority) {
- var indexToInsertAt;
+ addPreProcessor(preProcessor, priority) {
+ let indexToInsertAt;
for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {
if (this.preProcessors[indexToInsertAt].priority >= priority) {
break;
}
}
- this.preProcessors.splice(indexToInsertAt, 0, { preProcessor: preProcessor, priority: priority });
- };
+ this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});
+ }
+
/**
* Adds a post processor object
* @param {object} postProcessor
* @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression
*/
- PluginManager.prototype.addPostProcessor = function (postProcessor, priority) {
- var indexToInsertAt;
+ addPostProcessor(postProcessor, priority) {
+ let indexToInsertAt;
for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {
if (this.postProcessors[indexToInsertAt].priority >= priority) {
break;
}
}
- this.postProcessors.splice(indexToInsertAt, 0, { postProcessor: postProcessor, priority: priority });
- };
+ this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});
+ }
+
/**
*
* @param manager
*/
- PluginManager.prototype.addFileManager = function (manager) {
+ addFileManager(manager) {
this.fileManagers.push(manager);
- };
+ }
+
/**
*
* @returns {Array}
* @private
*/
- PluginManager.prototype.getPreProcessors = function () {
- var preProcessors = [];
- for (var i_2 = 0; i_2 < this.preProcessors.length; i_2++) {
- preProcessors.push(this.preProcessors[i_2].preProcessor);
+ getPreProcessors() {
+ const preProcessors = [];
+ for (let i = 0; i < this.preProcessors.length; i++) {
+ preProcessors.push(this.preProcessors[i].preProcessor);
}
return preProcessors;
- };
+ }
+
/**
*
* @returns {Array}
* @private
*/
- PluginManager.prototype.getPostProcessors = function () {
- var postProcessors = [];
- for (var i_3 = 0; i_3 < this.postProcessors.length; i_3++) {
- postProcessors.push(this.postProcessors[i_3].postProcessor);
+ getPostProcessors() {
+ const postProcessors = [];
+ for (let i = 0; i < this.postProcessors.length; i++) {
+ postProcessors.push(this.postProcessors[i].postProcessor);
}
return postProcessors;
- };
+ }
+
/**
*
* @returns {Array}
* @private
*/
- PluginManager.prototype.getVisitors = function () {
+ getVisitors() {
return this.visitors;
- };
- PluginManager.prototype.visitor = function () {
- var self = this;
+ }
+
+ visitor() {
+ const self = this;
return {
- first: function () {
+ first: function() {
self.iterator = -1;
return self.visitors[self.iterator];
},
- get: function () {
+ get: function() {
self.iterator += 1;
return self.visitors[self.iterator];
}
};
- };
+ }
+
/**
*
* @returns {Array}
* @private
*/
- PluginManager.prototype.getFileManagers = function () {
+ getFileManagers() {
return this.fileManagers;
- };
- return PluginManager;
- }());
- var pm;
- var PluginManagerFactory = function (less, newFactory) {
+ }
+ }
+
+ let pm;
+
+ const PluginManagerFactory = function(less, newFactory) {
if (newFactory || !pm) {
pm = new PluginManager(less);
}
@@ -10645,8 +11588,8 @@
};
function SourceMapOutput (environment) {
- var SourceMapOutput = /** @class */ (function () {
- function SourceMapOutput(options) {
+ class SourceMapOutput {
+ constructor(options) {
this._css = [];
this._rootNode = options.rootNode;
this._contentsMap = options.contentsMap;
@@ -10654,7 +11597,7 @@
if (options.sourceMapFilename) {
this._sourceMapFilename = options.sourceMapFilename.replace(/\\/g, '/');
}
- this._outputFilename = options.outputFilename;
+ this._outputFilename = options.outputFilename ? options.outputFilename.replace(/\\/g, '/') : options.outputFilename;
this.sourceMapURL = options.sourceMapURL;
if (options.sourceMapBasepath) {
this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\/g, '/');
@@ -10664,48 +11607,55 @@
if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {
this._sourceMapRootpath += '/';
}
- }
- else {
+ } else {
this._sourceMapRootpath = '';
}
this._outputSourceFiles = options.outputSourceFiles;
this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();
+
this._lineNumber = 0;
this._column = 0;
}
- SourceMapOutput.prototype.removeBasepath = function (path) {
+
+ removeBasepath(path) {
if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {
path = path.substring(this._sourceMapBasepath.length);
if (path.charAt(0) === '\\' || path.charAt(0) === '/') {
path = path.substring(1);
}
}
+
return path;
- };
- SourceMapOutput.prototype.normalizeFilename = function (filename) {
+ }
+
+ normalizeFilename(filename) {
filename = filename.replace(/\\/g, '/');
filename = this.removeBasepath(filename);
return (this._sourceMapRootpath || '') + filename;
- };
- SourceMapOutput.prototype.add = function (chunk, fileInfo, index, mapLines) {
+ }
+
+ add(chunk, fileInfo, index, mapLines) {
+
// ignore adding empty strings
if (!chunk) {
return;
}
- var lines, sourceLines, columns, sourceColumns, i;
+
+ let lines, sourceLines, columns, sourceColumns, i;
+
if (fileInfo && fileInfo.filename) {
- var inputSource = this._contentsMap[fileInfo.filename];
+ let inputSource = this._contentsMap[fileInfo.filename];
+
// remove vars/banner added to the top of the file
if (this._contentsIgnoredCharsMap[fileInfo.filename]) {
// adjust the index
index -= this._contentsIgnoredCharsMap[fileInfo.filename];
- if (index < 0) {
- index = 0;
- }
+ if (index < 0) { index = 0; }
// adjust the source
inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);
}
- /**
+
+ /**
* ignore empty content, or failsafe
* if contents map is incorrect
*/
@@ -10713,45 +11663,51 @@
this._css.push(chunk);
return;
}
+
inputSource = inputSource.substring(0, index);
sourceLines = inputSource.split('\n');
sourceColumns = sourceLines[sourceLines.length - 1];
}
+
lines = chunk.split('\n');
columns = lines[lines.length - 1];
+
if (fileInfo && fileInfo.filename) {
if (!mapLines) {
- this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column },
- original: { line: sourceLines.length, column: sourceColumns.length },
- source: this.normalizeFilename(fileInfo.filename) });
- }
- else {
+ this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},
+ original: { line: sourceLines.length, column: sourceColumns.length},
+ source: this.normalizeFilename(fileInfo.filename)});
+ } else {
for (i = 0; i < lines.length; i++) {
- this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0 },
- original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0 },
- source: this.normalizeFilename(fileInfo.filename) });
+ this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},
+ original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},
+ source: this.normalizeFilename(fileInfo.filename)});
}
}
}
+
if (lines.length === 1) {
this._column += columns.length;
- }
- else {
+ } else {
this._lineNumber += lines.length - 1;
this._column = columns.length;
}
+
this._css.push(chunk);
- };
- SourceMapOutput.prototype.isEmpty = function () {
+ }
+
+ isEmpty() {
return this._css.length === 0;
- };
- SourceMapOutput.prototype.toCSS = function (context) {
+ }
+
+ toCSS(context) {
this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });
+
if (this._outputSourceFiles) {
- for (var filename in this._contentsMap) {
+ for (const filename in this._contentsMap) {
// eslint-disable-next-line no-prototype-builtins
if (this._contentsMap.hasOwnProperty(filename)) {
- var source = this._contentsMap[filename];
+ let source = this._contentsMap[filename];
if (this._contentsIgnoredCharsMap[filename]) {
source = source.slice(this._contentsIgnoredCharsMap[filename]);
}
@@ -10759,47 +11715,54 @@
}
}
}
+
this._rootNode.genCSS(context, this);
+
if (this._css.length > 0) {
- var sourceMapURL = void 0;
- var sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());
+ let sourceMapURL;
+ const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());
+
if (this.sourceMapURL) {
sourceMapURL = this.sourceMapURL;
- }
- else if (this._sourceMapFilename) {
+ } else if (this._sourceMapFilename) {
sourceMapURL = this._sourceMapFilename;
}
this.sourceMapURL = sourceMapURL;
+
this.sourceMap = sourceMapContent;
}
+
return this._css.join('');
- };
- return SourceMapOutput;
- }());
+ }
+ }
+
return SourceMapOutput;
}
function SourceMapBuilder (SourceMapOutput, environment) {
- var SourceMapBuilder = /** @class */ (function () {
- function SourceMapBuilder(options) {
+ class SourceMapBuilder {
+ constructor(options) {
this.options = options;
}
- SourceMapBuilder.prototype.toCSS = function (rootNode, options, imports) {
- var sourceMapOutput = new SourceMapOutput({
- contentsIgnoredCharsMap: imports.contentsIgnoredChars,
- rootNode: rootNode,
- contentsMap: imports.contents,
- sourceMapFilename: this.options.sourceMapFilename,
- sourceMapURL: this.options.sourceMapURL,
- outputFilename: this.options.sourceMapOutputFilename,
- sourceMapBasepath: this.options.sourceMapBasepath,
- sourceMapRootpath: this.options.sourceMapRootpath,
- outputSourceFiles: this.options.outputSourceFiles,
- sourceMapGenerator: this.options.sourceMapGenerator,
- sourceMapFileInline: this.options.sourceMapFileInline,
- disableSourcemapAnnotation: this.options.disableSourcemapAnnotation
- });
- var css = sourceMapOutput.toCSS(options);
+
+ toCSS(rootNode, options, imports) {
+ const sourceMapOutput = new SourceMapOutput(
+ {
+ contentsIgnoredCharsMap: imports.contentsIgnoredChars,
+ rootNode,
+ contentsMap: imports.contents,
+ sourceMapFilename: this.options.sourceMapFilename,
+ sourceMapURL: this.options.sourceMapURL,
+ outputFilename: this.options.sourceMapOutputFilename,
+ sourceMapBasepath: this.options.sourceMapBasepath,
+ sourceMapRootpath: this.options.sourceMapRootpath,
+ outputSourceFiles: this.options.outputSourceFiles,
+ sourceMapGenerator: this.options.sourceMapGenerator,
+ sourceMapFileInline: this.options.sourceMapFileInline,
+ disableSourcemapAnnotation: this.options.disableSourcemapAnnotation
+ });
+
+ const css = sourceMapOutput.toCSS(options);
this.sourceMap = sourceMapOutput.sourceMap;
this.sourceMapURL = sourceMapOutput.sourceMapURL;
if (this.options.sourceMapInputFilename) {
@@ -10809,108 +11772,178 @@
this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);
}
return css + this.getCSSAppendage();
- };
- SourceMapBuilder.prototype.getCSSAppendage = function () {
- var sourceMapURL = this.sourceMapURL;
+ }
+
+ getCSSAppendage() {
+
+ let sourceMapURL = this.sourceMapURL;
if (this.options.sourceMapFileInline) {
if (this.sourceMap === undefined) {
return '';
}
- sourceMapURL = "data:application/json;base64,".concat(environment.encodeBase64(this.sourceMap));
+ sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;
}
+
if (this.options.disableSourcemapAnnotation) {
return '';
}
+
if (sourceMapURL) {
- return "/*# sourceMappingURL=".concat(sourceMapURL, " */");
+ return `/*# sourceMappingURL=${sourceMapURL} */`;
}
return '';
- };
- SourceMapBuilder.prototype.getExternalSourceMap = function () {
+ }
+
+ getExternalSourceMap() {
return this.sourceMap;
- };
- SourceMapBuilder.prototype.setExternalSourceMap = function (sourceMap) {
+ }
+
+ setExternalSourceMap(sourceMap) {
this.sourceMap = sourceMap;
- };
- SourceMapBuilder.prototype.isInline = function () {
+ }
+
+ isInline() {
return this.options.sourceMapFileInline;
- };
- SourceMapBuilder.prototype.getSourceMapURL = function () {
+ }
+
+ getSourceMapURL() {
return this.sourceMapURL;
- };
- SourceMapBuilder.prototype.getOutputFilename = function () {
+ }
+
+ getOutputFilename() {
return this.options.sourceMapOutputFilename;
- };
- SourceMapBuilder.prototype.getInputFilename = function () {
+ }
+
+ getInputFilename() {
return this.sourceMapInputFilename;
- };
- return SourceMapBuilder;
- }());
+ }
+ }
+
return SourceMapBuilder;
}
- function ParseTree (SourceMapBuilder) {
- var ParseTree = /** @class */ (function () {
- function ParseTree(root, imports) {
+ function ParseTree(SourceMapBuilder) {
+ class ParseTree {
+ constructor(root, imports) {
this.root = root;
this.imports = imports;
}
- ParseTree.prototype.toCSS = function (options) {
- var evaldRoot;
- var result = {};
- var sourceMapBuilder;
+
+ toCSS(options) {
+ let evaldRoot;
+ const result = {};
+ let sourceMapBuilder;
try {
evaldRoot = transformTree(this.root, options);
- }
- catch (e) {
+ } catch (e) {
throw new LessError(e, this.imports);
}
+
try {
- var compress = Boolean(options.compress);
+ const compress = Boolean(options.compress);
if (compress) {
- logger$1.warn('The compress option has been deprecated. ' +
+ logger$1.warn('The compress option has been deprecated. ' +
'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');
}
- var toCSSOptions = {
- compress: compress,
+
+ const toCSSOptions = {
+ compress,
+ // @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead. All modes will be removed in a future version.
dumpLineNumbers: options.dumpLineNumbers,
strictUnits: Boolean(options.strictUnits),
- numPrecision: 8
- };
+ numPrecision: 8};
+
if (options.sourceMap) {
- sourceMapBuilder = new SourceMapBuilder(options.sourceMap);
+ // Normalize sourceMap option: if it's just true, convert to object
+ if (options.sourceMap === true) {
+ options.sourceMap = {};
+ }
+ const sourceMapOpts = options.sourceMap;
+
+ // Set sourceMapInputFilename if not set and filename is available
+ if (!sourceMapOpts.sourceMapInputFilename && options.filename) {
+ sourceMapOpts.sourceMapInputFilename = options.filename;
+ }
+
+ // Default sourceMapBasepath to the input file's directory if not set
+ // This matches the behavior documented and implemented in bin/lessc
+ if (sourceMapOpts.sourceMapBasepath === undefined && options.filename) {
+ // Get directory from filename using string manipulation (works cross-platform)
+ const lastSlash = Math.max(options.filename.lastIndexOf('/'), options.filename.lastIndexOf('\\'));
+ if (lastSlash >= 0) {
+ sourceMapOpts.sourceMapBasepath = options.filename.substring(0, lastSlash);
+ } else {
+ // No directory separator found, use current directory
+ sourceMapOpts.sourceMapBasepath = '.';
+ }
+ }
+
+ // Handle sourceMapFullFilename (CLI-specific: --source-map=filename)
+ // This is converted to sourceMapFilename and sourceMapOutputFilename
+ if (sourceMapOpts.sourceMapFullFilename && !sourceMapOpts.sourceMapFileInline) {
+ // This case is handled by lessc before calling render
+ // We just need to ensure sourceMapFilename is set if sourceMapFullFilename is provided
+ if (!sourceMapOpts.sourceMapFilename && !sourceMapOpts.sourceMapURL) {
+ // Extract just the basename for the sourceMappingURL comment
+ const mapBase = sourceMapOpts.sourceMapFullFilename.split(/[/\\]/).pop();
+ sourceMapOpts.sourceMapFilename = mapBase;
+ }
+ } else if (!sourceMapOpts.sourceMapFilename && !sourceMapOpts.sourceMapURL) {
+ // If sourceMapFilename is not set and sourceMapURL is not set,
+ // derive it from the output filename (if available) or input filename
+ if (sourceMapOpts.sourceMapOutputFilename) {
+ // Use output filename + .map
+ sourceMapOpts.sourceMapFilename = sourceMapOpts.sourceMapOutputFilename + '.map';
+ } else if (options.filename) {
+ // Fallback to input filename + .css.map (basename only)
+ const inputBasename = options.filename.split(/[/\\]/).pop().replace(/\.[^/.]+$/, '');
+ sourceMapOpts.sourceMapFilename = inputBasename + '.css.map';
+ }
+ }
+
+ // Default sourceMapOutputFilename if not set
+ if (!sourceMapOpts.sourceMapOutputFilename) {
+ if (options.filename) {
+ const inputBasename = options.filename.split(/[/\\]/).pop().replace(/\.[^/.]+$/, '');
+ sourceMapOpts.sourceMapOutputFilename = inputBasename + '.css';
+ } else {
+ sourceMapOpts.sourceMapOutputFilename = 'output.css';
+ }
+ }
+
+ sourceMapBuilder = new SourceMapBuilder(sourceMapOpts);
result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);
- }
- else {
+ } else {
result.css = evaldRoot.toCSS(toCSSOptions);
}
- }
- catch (e) {
+ } catch (e) {
throw new LessError(e, this.imports);
}
+
if (options.pluginManager) {
- var postProcessors = options.pluginManager.getPostProcessors();
- for (var i_1 = 0; i_1 < postProcessors.length; i_1++) {
- result.css = postProcessors[i_1].process(result.css, { sourceMap: sourceMapBuilder, options: options, imports: this.imports });
+ const postProcessors = options.pluginManager.getPostProcessors();
+ for (let i = 0; i < postProcessors.length; i++) {
+ result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });
}
}
if (options.sourceMap) {
result.map = sourceMapBuilder.getExternalSourceMap();
}
+
result.imports = [];
- for (var file_1 in this.imports.files) {
- if (Object.prototype.hasOwnProperty.call(this.imports.files, file_1) && file_1 !== this.imports.rootFilename) {
- result.imports.push(file_1);
+ for (const file in this.imports.files) {
+ if (Object.prototype.hasOwnProperty.call(this.imports.files, file) && file !== this.imports.rootFilename) {
+ result.imports.push(file);
}
}
return result;
- };
- return ParseTree;
- }());
+ }
+ }
+
return ParseTree;
}
- function ImportManager (environment) {
+ function ImportManager(environment) {
// FileInfo = {
// 'rewriteUrls' - option - whether to adjust URL's to be relative
// 'filename' - full resolved filename of current file
@@ -10919,20 +11952,22 @@
// 'rootFilename' - filename of the base file
// 'entryPath' - absolute path to the entry file
// 'reference' - whether the file should not be output and only output parts that are referenced
- var ImportManager = /** @class */ (function () {
- function ImportManager(less, context, rootFileInfo) {
+
+ class ImportManager {
+ constructor(less, context, rootFileInfo) {
this.less = less;
this.rootFilename = rootFileInfo.filename;
- this.paths = context.paths || []; // Search paths, when importing
- this.contents = {}; // map - filename to contents of all the files
+ this.paths = context.paths || []; // Search paths, when importing
+ this.contents = {}; // map - filename to contents of all the files
this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore
this.mime = context.mime;
this.error = null;
this.context = context;
// Deprecated? Unused outside of here, could be useful.
- this.queue = []; // Files which haven't been imported yet
- this.files = {}; // Holds the imported parse trees.
+ this.queue = []; // Files which haven't been imported yet
+ this.files = {}; // Holds the imported parse trees.
}
+
/**
* Add an import to be imported
* @param path - the raw path
@@ -10941,44 +11976,50 @@
* @param importOptions - import options
* @param callback - callback for when it is imported
*/
- ImportManager.prototype.push = function (path, tryAppendExtension, currentFileInfo, importOptions, callback) {
- var importManager = this, pluginLoader = this.context.pluginManager.Loader;
+ push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {
+ const importManager = this, pluginLoader = this.context.pluginManager.Loader;
+
this.queue.push(path);
- var fileParsedFunc = function (e, root, fullPath) {
+
+ const fileParsedFunc = function (e, root, fullPath) {
importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue
- var importedEqualsRoot = fullPath === importManager.rootFilename;
+
+ const importedEqualsRoot = fullPath === importManager.rootFilename;
if (importOptions.optional && e) {
- callback(null, { rules: [] }, false, null);
- logger$1.info("The file ".concat(fullPath, " was skipped because it was not found and the import was marked optional."));
+ callback(null, {rules:[]}, false, null);
+ logger$1.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);
}
else {
// Inline imports aren't cached here.
// If we start to cache them, please make sure they won't conflict with non-inline imports of the
// same name as they used to do before this comment and the condition below have been added.
if (!importManager.files[fullPath] && !importOptions.inline) {
- importManager.files[fullPath] = { root: root, options: importOptions };
- }
- if (e && !importManager.error) {
- importManager.error = e;
+ importManager.files[fullPath] = { root, options: importOptions };
}
+ if (e && !importManager.error) { importManager.error = e; }
callback(e, root, importedEqualsRoot, fullPath);
}
};
- var newFileInfo = {
+
+ const newFileInfo = {
rewriteUrls: this.context.rewriteUrls,
entryPath: currentFileInfo.entryPath,
rootpath: currentFileInfo.rootpath,
rootFilename: currentFileInfo.rootFilename
};
- var fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);
+
+ const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);
+
if (!fileManager) {
- fileParsedFunc({ message: "Could not find a file-manager for ".concat(path) });
+ fileParsedFunc({ message: `Could not find a file-manager for ${path}` });
return;
}
- var loadFileCallback = function (loadedFile) {
- var plugin;
- var resolvedFilename = loadedFile.filename;
- var contents = loadedFile.contents.replace(/^\uFEFF/, '');
+
+ const loadFileCallback = function(loadedFile) {
+ let plugin;
+ const resolvedFilename = loadedFile.filename;
+ const contents = loadedFile.contents.replace(/^\uFEFF/, '');
+
// Pass on an updated rootpath if path of imported file is relative and file
// is in a (sub|sup) directory
//
@@ -10989,18 +12030,25 @@
// then rootpath should become 'less/../'
newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);
if (newFileInfo.rewriteUrls) {
- newFileInfo.rootpath = fileManager.join((importManager.context.rootpath || ''), fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));
+ newFileInfo.rootpath = fileManager.join(
+ (importManager.context.rootpath || ''),
+ fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));
+
if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {
newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);
}
}
newFileInfo.filename = resolvedFilename;
- var newEnv = new contexts.Parse(importManager.context);
+
+ const newEnv = new contexts.Parse(importManager.context);
+
newEnv.processImports = false;
importManager.contents[resolvedFilename] = contents;
+
if (currentFileInfo.reference || importOptions.reference) {
newFileInfo.reference = true;
}
+
if (importOptions.isPlugin) {
plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);
if (plugin instanceof LessError) {
@@ -11009,16 +12057,15 @@
else {
fileParsedFunc(null, plugin, resolvedFilename);
}
- }
- else if (importOptions.inline) {
+ } else if (importOptions.inline) {
fileParsedFunc(null, contents, resolvedFilename);
- }
- else {
+ } else {
// import (multiple) parse trees apparently get altered and can't be cached.
// TODO: investigate why this is
if (importManager.files[resolvedFilename]
&& !importManager.files[resolvedFilename].options.multiple
&& !importOptions.multiple) {
+
fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);
}
else {
@@ -11028,55 +12075,55 @@
}
}
};
- var loadedFile;
- var promise;
- var context = clone(this.context);
+ let loadedFile;
+ let promise;
+ const context = clone(this.context);
+
if (tryAppendExtension) {
context.ext = importOptions.isPlugin ? '.js' : '.less';
}
+
if (importOptions.isPlugin) {
context.mime = 'application/javascript';
+
if (context.syncImport) {
loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);
- }
- else {
+ } else {
promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);
}
}
else {
if (context.syncImport) {
loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);
- }
- else {
- promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment, function (err, loadedFile) {
- if (err) {
- fileParsedFunc(err);
- }
- else {
- loadFileCallback(loadedFile);
- }
- });
+ } else {
+ promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,
+ (err, loadedFile) => {
+ if (err) {
+ fileParsedFunc(err);
+ } else {
+ loadFileCallback(loadedFile);
+ }
+ });
}
}
if (loadedFile) {
if (!loadedFile.filename) {
fileParsedFunc(loadedFile);
- }
- else {
+ } else {
loadFileCallback(loadedFile);
}
- }
- else if (promise) {
+ } else if (promise) {
promise.then(loadFileCallback, fileParsedFunc);
}
- };
- return ImportManager;
- }());
+ }
+ }
+
return ImportManager;
}
- function Parse (environment, ParseTree, ImportManager) {
- var parse = function (input, options, callback) {
+ function Parse(environment, ParseTree, ImportManager) {
+ const parse = function (input, options, callback) {
+
if (typeof options === 'function') {
callback = options;
options = copyOptions(this.options, {});
@@ -11084,37 +12131,38 @@
else {
options = copyOptions(this.options, options || {});
}
+
if (!callback) {
- var self_1 = this;
+ const self = this;
return new Promise(function (resolve, reject) {
- parse.call(self_1, input, options, function (err, output) {
+ parse.call(self, input, options, function(err, output) {
if (err) {
reject(err);
- }
- else {
+ } else {
resolve(output);
}
});
});
- }
- else {
- var context_1;
- var rootFileInfo = void 0;
- var pluginManager_1 = new PluginManagerFactory(this, !options.reUsePluginManager);
- options.pluginManager = pluginManager_1;
- context_1 = new contexts.Parse(options);
+ } else {
+ let context;
+ let rootFileInfo;
+ const pluginManager = new PluginManagerFactory(this, !options.reUsePluginManager);
+
+ options.pluginManager = pluginManager;
+
+ context = new contexts.Parse(options);
+
if (options.rootFileInfo) {
rootFileInfo = options.rootFileInfo;
- }
- else {
- var filename = options.filename || 'input';
- var entryPath = filename.replace(/[^/\\]*$/, '');
+ } else {
+ const filename = options.filename || 'input';
+ const entryPath = filename.replace(/[^/\\]*$/, '');
rootFileInfo = {
- filename: filename,
- rewriteUrls: context_1.rewriteUrls,
- rootpath: context_1.rootpath || '',
+ filename,
+ rewriteUrls: context.rewriteUrls,
+ rootpath: context.rootpath || '',
currentDirectory: entryPath,
- entryPath: entryPath,
+ entryPath,
rootFilename: filename
};
// add in a missing trailing slash
@@ -11122,39 +12170,41 @@
rootFileInfo.rootpath += '/';
}
}
- var imports_1 = new ImportManager(this, context_1, rootFileInfo);
- this.importManager = imports_1;
+
+ const imports = new ImportManager(this, context, rootFileInfo);
+ this.importManager = imports;
+
// TODO: allow the plugins to be just a list of paths or names
// Do an async plugin queue like lessc
+
if (options.plugins) {
- options.plugins.forEach(function (plugin) {
- var evalResult, contents;
+ options.plugins.forEach(function(plugin) {
+ let evalResult, contents;
if (plugin.fileContent) {
contents = plugin.fileContent.replace(/^\uFEFF/, '');
- evalResult = pluginManager_1.Loader.evalPlugin(contents, context_1, imports_1, plugin.options, plugin.filename);
+ evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);
if (evalResult instanceof LessError) {
return callback(evalResult);
}
}
else {
- pluginManager_1.addPlugin(plugin);
+ pluginManager.addPlugin(plugin);
}
});
}
- new Parser(context_1, imports_1, rootFileInfo)
+
+ new Parser(context, imports, rootFileInfo)
.parse(input, function (e, root) {
- if (e) {
- return callback(e);
- }
- callback(null, root, imports_1, options);
- }, options);
+ if (e) { return callback(e); }
+ callback(null, root, imports, options);
+ }, options);
}
};
return parse;
}
- function Render (environment, ParseTree) {
- var render = function (input, options, callback) {
+ function Render(environment, ParseTree) {
+ const render = function (input, options, callback) {
if (typeof options === 'function') {
callback = options;
options = copyOptions(this.options, {});
@@ -11162,41 +12212,37 @@
else {
options = copyOptions(this.options, options || {});
}
+
if (!callback) {
- var self_1 = this;
+ const self = this;
return new Promise(function (resolve, reject) {
- render.call(self_1, input, options, function (err, output) {
+ render.call(self, input, options, function(err, output) {
if (err) {
reject(err);
- }
- else {
+ } else {
resolve(output);
}
});
});
- }
- else {
- this.parse(input, options, function (err, root, imports, options) {
- if (err) {
- return callback(err);
- }
- var result;
+ } else {
+ this.parse(input, options, function(err, root, imports, options) {
+ if (err) { return callback(err); }
+
+ let result;
try {
- var parseTree = new ParseTree(root, imports);
+ const parseTree = new ParseTree(root, imports);
result = parseTree.toCSS(options);
}
- catch (err) {
- return callback(err);
- }
+ catch (err) { return callback(err); }
+
callback(null, result);
});
}
};
+
return render;
}
- var version = "4.4.2";
-
function parseNodeVersion(version) {
var match = version.match(/^v(\d{1,2})\.(\d{1,2})\.(\d{1,2})(?:-([0-9A-Za-z-.]+))?(?:\+([0-9A-Za-z-.]+))?$/); // eslint-disable-line max-len
if (!match) {
@@ -11216,51 +12262,56 @@
var parseNodeVersion_1 = parseNodeVersion;
- function lessRoot (environment, fileManagers) {
- var sourceMapOutput, sourceMapBuilder, parseTree, importManager;
+ function lessRoot(environment, fileManagers, version = '0.0.0') {
+ let sourceMapOutput, sourceMapBuilder, parseTree, importManager;
+
environment = new Environment(environment, fileManagers);
sourceMapOutput = SourceMapOutput(environment);
sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);
parseTree = ParseTree(sourceMapBuilder);
importManager = ImportManager(environment);
- var render = Render(environment, parseTree);
- var parse = Parse(environment, parseTree, importManager);
- var v = parseNodeVersion_1("v".concat(version));
- var initial = {
+
+ const render = Render(environment, parseTree);
+ const parse = Parse(environment, parseTree, importManager);
+
+ const v = parseNodeVersion_1(`v${version}`);
+ const initial = {
version: [v.major, v.minor, v.patch],
- data: data,
- tree: tree,
- Environment: Environment,
- AbstractFileManager: AbstractFileManager,
- AbstractPluginLoader: AbstractPluginLoader,
- environment: environment,
- visitors: visitors,
- Parser: Parser,
+ data,
+ tree,
+ Environment,
+ AbstractFileManager,
+ AbstractPluginLoader,
+ environment,
+ visitors,
+ Parser,
functions: functions(environment),
- contexts: contexts,
+ contexts,
SourceMapOutput: sourceMapOutput,
SourceMapBuilder: sourceMapBuilder,
ParseTree: parseTree,
ImportManager: importManager,
- render: render,
- parse: parse,
- LessError: LessError,
- transformTree: transformTree,
- utils: utils,
+ render,
+ parse,
+ LessError,
+ transformTree,
+ utils,
PluginManager: PluginManagerFactory,
logger: logger$1
};
+
// Create a public API
- var ctor = function (t) {
- return function () {
- var obj = Object.create(t.prototype);
+
+ const ctor = function(t) {
+ return function() {
+ const obj = Object.create(t.prototype);
t.apply(obj, Array.prototype.slice.call(arguments, 0));
return obj;
};
};
- var t;
- var api = Object.create(initial);
- for (var n in initial.tree) {
+ let t;
+ const api = Object.create(initial);
+ for (const n in initial.tree) {
/* eslint guard-for-in: 0 */
t = initial.tree[n];
if (typeof t === 'function') {
@@ -11268,214 +12319,239 @@
}
else {
api[n] = Object.create(null);
- for (var o in t) {
+ for (const o in t) {
/* eslint guard-for-in: 0 */
api[n][o.toLowerCase()] = ctor(t[o]);
}
}
}
+
/**
* Some of the functions assume a `this` context of the API object,
* which causes it to fail when wrapped for ES6 imports.
- *
+ *
* An assumed `this` should be removed in the future.
*/
initial.parse = initial.parse.bind(api);
initial.render = initial.render.bind(api);
+
return api;
}
- var options$1;
- var logger;
- var fileCache = {};
+ let options$1;
+ let logger;
+ let fileCache = {};
+
// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load
- var FileManager = function () { };
+ const FileManager = function() {};
FileManager.prototype = Object.assign(new AbstractFileManager(), {
- alwaysMakePathsAbsolute: function () {
+ alwaysMakePathsAbsolute() {
return true;
},
- join: function (basePath, laterPath) {
+
+ join(basePath, laterPath) {
if (!basePath) {
return laterPath;
}
return this.extractUrlParts(laterPath, basePath).path;
},
- doXHR: function (url, type, callback, errback) {
- var xhr = new XMLHttpRequest();
- var async = options$1.isFileProtocol ? options$1.fileAsync : true;
+
+ doXHR(url, type, callback, errback) {
+ const xhr = new XMLHttpRequest();
+ const async = options$1.isFileProtocol ? options$1.fileAsync : true;
+
if (typeof xhr.overrideMimeType === 'function') {
xhr.overrideMimeType('text/css');
}
- logger.debug("XHR: Getting '".concat(url, "'"));
+ logger.debug(`XHR: Getting '${url}'`);
xhr.open('GET', url, async);
xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');
xhr.send(null);
+
function handleResponse(xhr, callback, errback) {
if (xhr.status >= 200 && xhr.status < 300) {
- callback(xhr.responseText, xhr.getResponseHeader('Last-Modified'));
- }
- else if (typeof errback === 'function') {
+ callback(xhr.responseText,
+ xhr.getResponseHeader('Last-Modified'));
+ } else if (typeof errback === 'function') {
errback(xhr.status, url);
}
}
+
if (options$1.isFileProtocol && !options$1.fileAsync) {
if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {
callback(xhr.responseText);
- }
- else {
+ } else {
errback(xhr.status, url);
}
- }
- else if (async) {
- xhr.onreadystatechange = function () {
+ } else if (async) {
+ xhr.onreadystatechange = () => {
if (xhr.readyState == 4) {
handleResponse(xhr, callback, errback);
}
};
- }
- else {
+ } else {
handleResponse(xhr, callback, errback);
}
},
- supports: function () {
+
+ supports() {
return true;
},
- clearFileCache: function () {
+
+ clearFileCache() {
fileCache = {};
},
- loadFile: function (filename, currentDirectory, options) {
+
+ loadFile(filename, currentDirectory, options) {
// TODO: Add prefix support like less-node?
// What about multiple paths?
+
if (currentDirectory && !this.isPathAbsolute(filename)) {
filename = currentDirectory + filename;
}
+
filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;
+
options = options || {};
+
// sheet may be set to the stylesheet for the initial load or a collection of properties including
// some context variables for imports
- var hrefParts = this.extractUrlParts(filename, window.location.href);
- var href = hrefParts.url;
- var self = this;
- return new Promise(function (resolve, reject) {
+ const hrefParts = this.extractUrlParts(filename, window.location.href);
+ const href = hrefParts.url;
+ const self = this;
+
+ return new Promise((resolve, reject) => {
if (options.useFileCache && fileCache[href]) {
try {
- var lessText_1 = fileCache[href];
- return resolve({ contents: lessText_1, filename: href, webInfo: { lastModified: new Date() } });
- }
- catch (e) {
- return reject({ filename: href, message: "Error loading file ".concat(href, " error was ").concat(e.message) });
+ const lessText = fileCache[href];
+ return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});
+ } catch (e) {
+ return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });
}
}
+
self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {
// per file cache
fileCache[href] = data;
+
// Use remote copy (re-parse)
- resolve({ contents: data, filename: href, webInfo: { lastModified: lastModified } });
+ resolve({ contents: data, filename: href, webInfo: { lastModified }});
}, function doXHRError(status, url) {
- reject({ type: 'File', message: "'".concat(url, "' wasn't found (").concat(status, ")"), href: href });
+ reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });
});
});
}
});
- var FM = (function (opts, log) {
+
+ var FM = (opts, log) => {
options$1 = opts;
logger = log;
return FileManager;
- });
+ };
/**
* @todo Add tests for browser `@plugin`
*/
+
/**
* Browser Plugin Loader
*/
- var PluginLoader = function (less) {
+ const PluginLoader = function(less) {
this.less = less;
// Should we shim this.require for browser? Probably not?
};
+
PluginLoader.prototype = Object.assign(new AbstractPluginLoader(), {
- loadPlugin: function (filename, basePath, context, environment, fileManager) {
- return new Promise(function (fulfill, reject) {
+ loadPlugin(filename, basePath, context, environment, fileManager) {
+ return new Promise((fulfill, reject) => {
fileManager.loadFile(filename, basePath, context, environment)
.then(fulfill).catch(reject);
});
}
});
- var LogListener = (function (less, options) {
- var logLevel_debug = 4;
- var logLevel_info = 3;
- var logLevel_warn = 2;
- var logLevel_error = 1;
+ var LogListener = (less, options) => {
+ const logLevel_debug = 4;
+ const logLevel_info = 3;
+ const logLevel_warn = 2;
+ const logLevel_error = 1;
+
// The amount of logging in the javascript console.
// 3 - Debug, information and errors
// 2 - Information and errors
// 1 - Errors
// 0 - None
// Defaults to 2
- options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);
+ options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);
+
if (!options.loggers) {
options.loggers = [{
- debug: function (msg) {
- if (options.logLevel >= logLevel_debug) {
- console.log(msg);
- }
- },
- info: function (msg) {
- if (options.logLevel >= logLevel_info) {
- console.log(msg);
- }
- },
- warn: function (msg) {
- if (options.logLevel >= logLevel_warn) {
- console.warn(msg);
- }
- },
- error: function (msg) {
- if (options.logLevel >= logLevel_error) {
- console.error(msg);
- }
+ debug: function(msg) {
+ if (options.logLevel >= logLevel_debug) {
+ console.log(msg);
+ }
+ },
+ info: function(msg) {
+ if (options.logLevel >= logLevel_info) {
+ console.log(msg);
+ }
+ },
+ warn: function(msg) {
+ if (options.logLevel >= logLevel_warn) {
+ console.warn(msg);
+ }
+ },
+ error: function(msg) {
+ if (options.logLevel >= logLevel_error) {
+ console.error(msg);
}
- }];
+ }
+ }];
}
- for (var i_1 = 0; i_1 < options.loggers.length; i_1++) {
- less.logger.addListener(options.loggers[i_1]);
+ for (let i = 0; i < options.loggers.length; i++) {
+ less.logger.addListener(options.loggers[i]);
}
- });
+ };
+
+ var ErrorReporting = (window, less, options) => {
- var ErrorReporting = (function (window, less, options) {
function errorHTML(e, rootHref) {
- var id = "less-error-message:".concat(extractId(rootHref || ''));
- var template = '{content}';
- var elem = window.document.createElement('div');
- var timer;
- var content;
- var errors = [];
- var filename = e.filename || rootHref;
- var filenameNoPath = filename.match(/([^/]+(\?.*)?)$/)[1];
- elem.id = id;
+ const id = `less-error-message:${extractId(rootHref || '')}`;
+ const template = '{content}';
+ const elem = window.document.createElement('div');
+ let timer;
+ let content;
+ const errors = [];
+ const filename = e.filename || rootHref;
+ const filenameNoPath = filename.match(/([^/]+(\?.*)?)$/)[1];
+
+ elem.id = id;
elem.className = 'less-error-message';
- content = "".concat(e.type || 'Syntax', "Error: ").concat(e.message || 'There is an error in your .less file') +
- "
in ").concat(filenameNoPath, " ");
- var errorline = function (e, i, classname) {
+
+ content = `
${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` +
+ `
in ${filenameNoPath} `;
+
+ const errorline = (e, i, classname) => {
if (e.extract[i] !== undefined) {
errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1))
.replace(/\{class\}/, classname)
.replace(/\{content\}/, e.extract[i]));
}
};
+
if (e.line) {
errorline(e, 0, '');
errorline(e, 1, 'line');
errorline(e, 2, '');
- content += "on line ".concat(e.line, ", column ").concat(e.column + 1, ":
").concat(errors.join(''), "
");
+ content += `on line ${e.line}, column ${e.column + 1}:
`;
}
if (e.stack && (e.extract || options.logLevel >= 4)) {
- content += "
Stack Trace".concat(e.stack.split('\n').slice(1).join('
'));
+ content += `
Stack Trace${e.stack.split('\n').slice(1).join('
')}`;
}
elem.innerHTML = content;
+
// CSS for error messages
- browser.createCSS(window.document, [
+ browser$1.createCSS(window.document, [
'.less-error-message ul, .less-error-message li {',
'list-style-type: none;',
'margin-right: 15px;',
@@ -11513,6 +12589,7 @@
'border-bottom: 1px dashed red;',
'}'
].join('\n'), { title: 'error-message' });
+
elem.style.cssText = [
'font-family: Arial, sans-serif',
'border: 1px solid #e00',
@@ -11524,15 +12601,15 @@
'padding: 15px',
'margin-bottom: 15px'
].join(';');
+
if (options.env === 'development') {
- timer = setInterval(function () {
- var document = window.document;
- var body = document.body;
+ timer = setInterval(() => {
+ const document = window.document;
+ const body = document.body;
if (body) {
if (document.getElementById(id)) {
body.replaceChild(elem, document.getElementById(id));
- }
- else {
+ } else {
body.insertBefore(elem, body.firstChild);
}
clearInterval(timer);
@@ -11540,93 +12617,97 @@
}, 10);
}
}
+
function removeErrorHTML(path) {
- var node = window.document.getElementById("less-error-message:".concat(extractId(path)));
+ const node = window.document.getElementById(`less-error-message:${extractId(path)}`);
if (node) {
node.parentNode.removeChild(node);
}
}
+
function removeError(path) {
if (!options.errorReporting || options.errorReporting === 'html') {
removeErrorHTML(path);
- }
- else if (options.errorReporting === 'console') ;
- else if (typeof options.errorReporting === 'function') {
+ } else if (options.errorReporting === 'console') ; else if (typeof options.errorReporting === 'function') {
options.errorReporting('remove', path);
}
}
+
function errorConsole(e, rootHref) {
- var template = '{line} {content}';
- var filename = e.filename || rootHref;
- var errors = [];
- var content = "".concat(e.type || 'Syntax', "Error: ").concat(e.message || 'There is an error in your .less file', " in ").concat(filename);
- var errorline = function (e, i, classname) {
+ const template = '{line} {content}';
+ const filename = e.filename || rootHref;
+ const errors = [];
+ let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;
+
+ const errorline = (e, i, classname) => {
if (e.extract[i] !== undefined) {
errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1))
.replace(/\{class\}/, classname)
.replace(/\{content\}/, e.extract[i]));
}
};
+
if (e.line) {
errorline(e, 0, '');
errorline(e, 1, 'line');
errorline(e, 2, '');
- content += " on line ".concat(e.line, ", column ").concat(e.column + 1, ":\n").concat(errors.join('\n'));
+ content += ` on line ${e.line}, column ${e.column + 1}:\n${errors.join('\n')}`;
}
if (e.stack && (e.extract || options.logLevel >= 4)) {
- content += "\nStack Trace\n".concat(e.stack);
+ content += `\nStack Trace\n${e.stack}`;
}
less.logger.error(content);
}
+
function error(e, rootHref) {
if (!options.errorReporting || options.errorReporting === 'html') {
errorHTML(e, rootHref);
- }
- else if (options.errorReporting === 'console') {
+ } else if (options.errorReporting === 'console') {
errorConsole(e, rootHref);
- }
- else if (typeof options.errorReporting === 'function') {
+ } else if (typeof options.errorReporting === 'function') {
options.errorReporting('add', e, rootHref);
}
}
+
return {
add: error,
remove: removeError
};
- });
+ };
// Cache system is a bit outdated and could do with work
- var Cache = (function (window, options, logger) {
- var cache = null;
+
+ var Cache = (window, options, logger) => {
+ let cache = null;
if (options.env !== 'development') {
try {
cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;
- }
- catch (_) { }
+ } catch (_) {}
}
return {
- setCSS: function (path, lastModified, modifyVars, styles) {
+ setCSS: function(path, lastModified, modifyVars, styles) {
if (cache) {
- logger.info("saving ".concat(path, " to cache."));
+ logger.info(`saving ${path} to cache.`);
try {
cache.setItem(path, styles);
- cache.setItem("".concat(path, ":timestamp"), lastModified);
+ cache.setItem(`${path}:timestamp`, lastModified);
if (modifyVars) {
- cache.setItem("".concat(path, ":vars"), JSON.stringify(modifyVars));
+ cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));
}
- }
- catch (e) {
+ } catch (e) {
// TODO - could do with adding more robust error handling
- logger.error("failed to save \"".concat(path, "\" to local storage for caching."));
+ logger.error(`failed to save "${path}" to local storage for caching.`);
}
}
},
- getCSS: function (path, webInfo, modifyVars) {
- var css = cache && cache.getItem(path);
- var timestamp = cache && cache.getItem("".concat(path, ":timestamp"));
- var vars = cache && cache.getItem("".concat(path, ":vars"));
+ getCSS: function(path, webInfo, modifyVars) {
+ const css = cache && cache.getItem(path);
+ const timestamp = cache && cache.getItem(`${path}:timestamp`);
+ let vars = cache && cache.getItem(`${path}:vars`);
+
modifyVars = modifyVars || {};
vars = vars || '{}'; // if not set, treat as the JSON representation of an empty object
+
if (timestamp && webInfo.lastModified &&
(new Date(webInfo.lastModified).valueOf() ===
new Date(timestamp).valueOf()) &&
@@ -11636,298 +12717,507 @@
}
}
};
- });
+ };
- var ImageSize = (function () {
+ var ImageSize = () => {
function imageSize() {
throw {
type: 'Runtime',
message: 'Image size functions are not supported in browser version of less'
};
}
- var imageFunctions = {
- 'image-size': function (filePathNode) {
+
+ const imageFunctions = {
+ 'image-size': function(filePathNode) {
imageSize();
return -1;
},
- 'image-width': function (filePathNode) {
+ 'image-width': function(filePathNode) {
imageSize();
return -1;
},
- 'image-height': function (filePathNode) {
+ 'image-height': function(filePathNode) {
imageSize();
return -1;
}
};
+
functionRegistry.addMultiple(imageFunctions);
- });
+ };
+
+ var name = "less";
+ var version = "4.5.0";
+ var description = "Leaner CSS";
+ var homepage = "http://lesscss.org";
+ var author = {
+ name: "Alexis Sellier",
+ email: "self@cloudhead.net"
+ };
+ var contributors = [
+ "The Core Less Team"
+ ];
+ var bugs = {
+ url: "https://github.com/less/less.js/issues"
+ };
+ var repository = {
+ type: "git",
+ url: "https://github.com/less/less.js.git"
+ };
+ var master = {
+ url: "https://github.com/less/less.js/blob/master/",
+ raw: "https://raw.githubusercontent.com/less/less.js/master/"
+ };
+ var license = "Apache-2.0";
+ var type = "module";
+ var bin = {
+ lessc: "./bin/lessc"
+ };
+ var main = "./lib/less-node/index.js";
+ var exports$1 = {
+ ".": "./lib/less-node/index.js",
+ "./lib/*": "./lib/*"
+ };
+ var directories = {
+ test: "./test"
+ };
+ var browser = "./dist/less.js";
+ var engines = {
+ node: ">=18"
+ };
+ var scripts = {
+ quicktest: "grunt quicktest",
+ test: "grunt test",
+ "test:coverage": "c8 -r lcov -r json-summary -r text-summary -r html --include=\"lib/**/*.js\" --include=\"bin/**/*.js\" --exclude=\"dist/**\" --exclude=\"**/*.test.js\" --exclude=\"**/*.spec.js\" --exclude=\"test/**\" --exclude=\"tmp/**\" --exclude=\"**/abstract-file-manager.js\" --exclude=\"**/abstract-plugin-loader.js\" grunt shell:test && node scripts/coverage-report.js && node scripts/coverage-lines.js",
+ grunt: "grunt",
+ lint: "eslint '**/*.{ts,js}'",
+ "lint:fix": "eslint '**/*.{ts,js}' --fix",
+ typecheck: "tsc",
+ build: "node build/rollup.js --dist",
+ prepublishOnly: "grunt dist",
+ postinstall: "node scripts/postinstall.js"
+ };
+ var optionalDependencies = {
+ errno: "^0.1.1",
+ "graceful-fs": "^4.1.2",
+ "image-size": "~0.5.0",
+ "make-dir": "^2.1.0",
+ mime: "^1.4.1",
+ needle: "^3.1.0",
+ "source-map": "~0.6.0"
+ };
+ var devDependencies = {
+ "@less/test-data": "workspace:*",
+ "@less/test-import-module": "workspace:*",
+ "@rollup/plugin-commonjs": "^17.0.0",
+ "@rollup/plugin-json": "^4.1.0",
+ "@rollup/plugin-node-resolve": "^11.0.0",
+ "@typescript-eslint/eslint-plugin": "^4.28.0",
+ "@typescript-eslint/parser": "^4.28.0",
+ benny: "^3.6.12",
+ "bootstrap-less-port": "0.3.0",
+ chai: "^4.2.0",
+ c8: "^10.1.3",
+ chalk: "^4.1.2",
+ cosmiconfig: "~9.0.0",
+ "cross-env": "^7.0.3",
+ eslint: "^7.29.0",
+ "fs-extra": "^8.1.0",
+ "git-rev": "^0.2.1",
+ glob: "~11.0.3",
+ globby: "^10.0.1",
+ grunt: "^1.5.0",
+ "grunt-cli": "^1.3.2",
+ "grunt-contrib-clean": "^1.0.0",
+ "grunt-contrib-connect": "^1.0.2",
+ "grunt-eslint": "^23.0.0",
+ "grunt-saucelabs": "^9.0.1",
+ "grunt-shell": "^1.3.0",
+ "html-template-tag": "^3.2.0",
+ "jest-diff": "~30.1.2",
+ "jit-grunt": "^0.10.0",
+ "less-plugin-autoprefix": "^1.5.1",
+ "less-plugin-clean-css": "^1.6.0",
+ minimist: "^1.2.0",
+ mocha: "^6.2.1",
+ "mocha-teamcity-reporter": "^3.0.0",
+ "npm-run-all": "^4.1.5",
+ "performance-now": "^0.2.0",
+ phin: "^2.2.3",
+ playwright: "1.50.1",
+ promise: "^7.1.1",
+ "read-glob": "^3.0.0",
+ resolve: "^1.17.0",
+ rollup: "^2.52.2",
+ "rollup-plugin-terser": "^5.1.1",
+ semver: "^6.3.0",
+ shx: "^0.3.2",
+ "time-grunt": "^1.3.0",
+ typescript: "^5.7.0",
+ uikit: "2.27.4"
+ };
+ var keywords = [
+ "compile less",
+ "css nesting",
+ "css variable",
+ "css",
+ "gradients css",
+ "gradients css3",
+ "less compiler",
+ "less css",
+ "less mixins",
+ "less",
+ "less.js",
+ "lesscss",
+ "mixins",
+ "nested css",
+ "parser",
+ "preprocessor",
+ "bootstrap css",
+ "bootstrap less",
+ "style",
+ "styles",
+ "stylesheet",
+ "variables in css",
+ "css less"
+ ];
+ var rawcurrent = "https://raw.github.com/less/less.js/v";
+ var sourcearchive = "https://github.com/less/less.js/archive/v";
+ var dependencies = {
+ "copy-anything": "^2.0.1",
+ "parse-node-version": "^1.0.1"
+ };
+ var gitHead = "1df9072ee9ebdadc791bf35dfb1dbc3ef9f1948f";
+ var pkg = {
+ name: name,
+ version: version,
+ description: description,
+ homepage: homepage,
+ author: author,
+ contributors: contributors,
+ bugs: bugs,
+ repository: repository,
+ master: master,
+ license: license,
+ type: type,
+ bin: bin,
+ main: main,
+ exports: exports$1,
+ directories: directories,
+ browser: browser,
+ engines: engines,
+ scripts: scripts,
+ optionalDependencies: optionalDependencies,
+ devDependencies: devDependencies,
+ keywords: keywords,
+ rawcurrent: rawcurrent,
+ sourcearchive: sourcearchive,
+ dependencies: dependencies,
+ gitHead: gitHead
+ };
//
- var root = (function (window, options) {
- var document = window.document;
- var less = lessRoot();
+
+ /**
+ * @param {Window} window
+ * @param {Object} options
+ */
+ var root = (window, options) => {
+ const document = window.document;
+ const less = lessRoot(undefined, undefined, pkg.version);
+
less.options = options;
- var environment = less.environment;
- var FileManager = FM(options, less.logger);
- var fileManager = new FileManager();
+ const environment = less.environment;
+ const FileManager = FM(options, less.logger);
+ const fileManager = new FileManager();
environment.addFileManager(fileManager);
less.FileManager = FileManager;
less.PluginLoader = PluginLoader;
+
LogListener(less, options);
- var errors = ErrorReporting(window, less, options);
- var cache = less.cache = options.cache || Cache(window, options, less.logger);
+ const errors = ErrorReporting(window, less, options);
+ const cache = less.cache = options.cache || Cache(window, options, less.logger);
ImageSize(less.environment);
+
// Setup user functions - Deprecate?
if (options.functions) {
less.functions.functionRegistry.addMultiple(options.functions);
}
- var typePattern = /^text\/(x-)?less$/;
+
+ const typePattern = /^text\/(x-)?less$/;
+
function clone(obj) {
- var cloned = {};
- for (var prop in obj) {
+ const cloned = {};
+ for (const prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
cloned[prop] = obj[prop];
}
}
return cloned;
}
- // only really needed for phantom
- function bind(func, thisArg) {
- var curryArgs = Array.prototype.slice.call(arguments, 2);
- return function () {
- var args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));
- return func.apply(thisArg, args);
- };
- }
+
function loadStyles(modifyVars) {
- var styles = document.getElementsByTagName('style');
- var style;
- for (var i_1 = 0; i_1 < styles.length; i_1++) {
- style = styles[i_1];
+ const styles = document.getElementsByTagName('style');
+
+ for (let style of styles) {
if (style.type.match(typePattern)) {
- var instanceOptions = clone(options);
- instanceOptions.modifyVars = modifyVars;
- var lessText_1 = style.innerHTML || '';
- instanceOptions.filename = document.location.href.replace(/#.*$/, '');
+ const instanceOptions = {
+ ...clone(options),
+ modifyVars,
+ filename: document.location.href.replace(/#.*$/, '')
+ };
+
+ const lessText = style.innerHTML || '';
+
/* jshint loopfunc:true */
- // use closure to store current style
- less.render(lessText_1, instanceOptions, bind(function (style, e, result) {
- if (e) {
- errors.add(e, 'inline');
- }
- else {
+ less.render(lessText, instanceOptions, (err, result) => {
+ if (err) {
+ errors.add(err, 'inline');
+ } else {
style.type = 'text/css';
if (style.styleSheet) {
style.styleSheet.cssText = result.css;
- }
- else {
+ } else {
style.innerHTML = result.css;
}
}
- }, null, style));
+ });
}
}
}
+
function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {
- var instanceOptions = clone(options);
+
+ const instanceOptions = clone(options);
addDataAttr(instanceOptions, sheet);
instanceOptions.mime = sheet.type;
+
if (modifyVars) {
instanceOptions.modifyVars = modifyVars;
}
+
function loadInitialFileCallback(loadedFile) {
- var data = loadedFile.contents;
- var path = loadedFile.filename;
- var webInfo = loadedFile.webInfo;
- var newFileInfo = {
+ const data = loadedFile.contents;
+ const path = loadedFile.filename;
+ const webInfo = loadedFile.webInfo;
+
+ const newFileInfo = {
currentDirectory: fileManager.getPath(path),
filename: path,
rootFilename: path,
rewriteUrls: instanceOptions.rewriteUrls
};
+
newFileInfo.entryPath = newFileInfo.currentDirectory;
newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;
+
if (webInfo) {
webInfo.remaining = remaining;
- var css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);
+
+ const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);
if (!reload && css) {
webInfo.local = true;
callback(null, css, data, sheet, webInfo, path);
return;
}
+
}
+
// TODO add tests around how this behaves when reloading
errors.remove(path);
+
instanceOptions.rootFileInfo = newFileInfo;
- less.render(data, instanceOptions, function (e, result) {
+ less.render(data, instanceOptions, (e, result) => {
if (e) {
e.href = path;
callback(e);
- }
- else {
+ } else {
cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);
callback(null, result.css, data, sheet, webInfo, path);
}
});
}
+
fileManager.loadFile(sheet.href, null, instanceOptions, environment)
- .then(function (loadedFile) {
- loadInitialFileCallback(loadedFile);
- }).catch(function (err) {
- console.log(err);
- callback(err);
- });
+ .then(loadedFile => {
+ loadInitialFileCallback(loadedFile);
+ }).catch(err => {
+ console.log(err);
+ callback(err);
+ });
+
}
+
function loadStyleSheets(callback, reload, modifyVars) {
- for (var i_2 = 0; i_2 < less.sheets.length; i_2++) {
- loadStyleSheet(less.sheets[i_2], callback, reload, less.sheets.length - (i_2 + 1), modifyVars);
+ for (let i = 0; i < less.sheets.length; i++) {
+ loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);
}
}
+
function initRunningMode() {
if (less.env === 'development') {
- less.watchTimer = setInterval(function () {
+ less.watchTimer = setInterval(() => {
if (less.watchMode) {
fileManager.clearFileCache();
/**
* @todo remove when this is typed with JSDoc
*/
// eslint-disable-next-line no-unused-vars
- loadStyleSheets(function (e, css, _, sheet, webInfo) {
+ loadStyleSheets((e, css, _, sheet, webInfo) => {
if (e) {
errors.add(e, e.href || sheet.href);
- }
- else if (css) {
- browser.createCSS(window.document, css, sheet);
+ } else if (css) {
+ browser$1.createCSS(window.document, css, sheet);
}
});
}
}, options.poll);
}
}
+
//
// Watch mode
//
less.watch = function () {
- if (!less.watchMode) {
+ if (!less.watchMode ) {
less.env = 'development';
initRunningMode();
}
this.watchMode = true;
return true;
};
- less.unwatch = function () { clearInterval(less.watchTimer); this.watchMode = false; return false; };
+
+ less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };
+
//
// Synchronously get all tags with the 'rel' attribute set to
// "stylesheet/less".
//
- less.registerStylesheetsImmediately = function () {
- var links = document.getElementsByTagName('link');
+ less.registerStylesheetsImmediately = () => {
+ const links = document.getElementsByTagName('link');
less.sheets = [];
- for (var i_3 = 0; i_3 < links.length; i_3++) {
- if (links[i_3].rel === 'stylesheet/less' || (links[i_3].rel.match(/stylesheet/) &&
- (links[i_3].type.match(typePattern)))) {
- less.sheets.push(links[i_3]);
+
+ for (let i = 0; i < links.length; i++) {
+ if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&
+ (links[i].type.match(typePattern)))) {
+ less.sheets.push(links[i]);
}
}
};
+
//
// Asynchronously get all tags with the 'rel' attribute set to
// "stylesheet/less", returning a Promise.
//
- less.registerStylesheets = function () { return new Promise(function (resolve) {
+ less.registerStylesheets = () => new Promise((resolve) => {
less.registerStylesheetsImmediately();
resolve();
- }); };
+ });
+
//
// With this function, it's possible to alter variables and re-render
// CSS without reloading less-files
//
- less.modifyVars = function (record) { return less.refresh(true, record, false); };
- less.refresh = function (reload, modifyVars, clearFileCache) {
+ less.modifyVars = record => less.refresh(true, record, false);
+
+ less.refresh = (reload, modifyVars, clearFileCache) => {
if ((reload || clearFileCache) && clearFileCache !== false) {
fileManager.clearFileCache();
}
- return new Promise(function (resolve, reject) {
- var startTime;
- var endTime;
- var totalMilliseconds;
- var remainingSheets;
+ return new Promise((resolve, reject) => {
+ let startTime;
+ let endTime;
+ let totalMilliseconds;
+ let remainingSheets;
startTime = endTime = new Date();
+
// Set counter for remaining unprocessed sheets
remainingSheets = less.sheets.length;
+
if (remainingSheets === 0) {
+
endTime = new Date();
totalMilliseconds = endTime - startTime;
less.logger.info('Less has finished and no sheets were loaded.');
resolve({
- startTime: startTime,
- endTime: endTime,
- totalMilliseconds: totalMilliseconds,
+ startTime,
+ endTime,
+ totalMilliseconds,
sheets: less.sheets.length
});
- }
- else {
+
+ } else {
// Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array
- loadStyleSheets(function (e, css, _, sheet, webInfo) {
+ loadStyleSheets((e, css, _, sheet, webInfo) => {
if (e) {
errors.add(e, e.href || sheet.href);
reject(e);
return;
}
if (webInfo.local) {
- less.logger.info("Loading ".concat(sheet.href, " from cache."));
- }
- else {
- less.logger.info("Rendered ".concat(sheet.href, " successfully."));
+ less.logger.info(`Loading ${sheet.href} from cache.`);
+ } else {
+ less.logger.info(`Rendered ${sheet.href} successfully.`);
}
- browser.createCSS(window.document, css, sheet);
- less.logger.info("CSS for ".concat(sheet.href, " generated in ").concat(new Date() - endTime, "ms"));
+ browser$1.createCSS(window.document, css, sheet);
+ less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);
+
// Count completed sheet
remainingSheets--;
+
// Check if the last remaining sheet was processed and then call the promise
if (remainingSheets === 0) {
totalMilliseconds = new Date() - startTime;
- less.logger.info("Less has finished. CSS generated in ".concat(totalMilliseconds, "ms"));
+ less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);
resolve({
- startTime: startTime,
- endTime: endTime,
- totalMilliseconds: totalMilliseconds,
+ startTime,
+ endTime,
+ totalMilliseconds,
sheets: less.sheets.length
});
}
endTime = new Date();
}, reload, modifyVars);
}
+
loadStyles(modifyVars);
});
};
+
less.refreshStyles = loadStyles;
return less;
- });
+ };
/**
* Kicks off less and compiles any stylesheets
* used in the browser distributed version of less
* to kick-start less using the browser api
*/
- var options = defaultOptions();
+
+ const options = defaultOptions();
+
if (window.less) {
- for (var key in window.less) {
+ for (const key in window.less) {
if (Object.prototype.hasOwnProperty.call(window.less, key)) {
options[key] = window.less[key];
}
}
}
addDefaultOptions(window, options);
+
options.plugins = options.plugins || [];
+
if (window.LESS_PLUGINS) {
options.plugins = options.plugins.concat(window.LESS_PLUGINS);
}
- var less = root(window, options);
+
+ const less = root(window, options);
+
window.less = less;
- var css;
- var head;
- var style;
+
+ let css;
+ let head;
+ let style;
+
// Always restore page visibility
function resolveOrReject(data) {
if (data.filename) {
@@ -11937,6 +13227,7 @@
head.removeChild(style);
}
}
+
if (options.onReady) {
if (/!watch/.test(window.location.hash)) {
less.watch();
@@ -11946,13 +13237,14 @@
css = 'body { display: none !important }';
head = document.head || document.getElementsByTagName('head')[0];
style = document.createElement('style');
+
style.type = 'text/css';
if (style.styleSheet) {
style.styleSheet.cssText = css;
- }
- else {
+ } else {
style.appendChild(document.createTextNode(css));
}
+
head.appendChild(style);
}
less.registerStylesheetsImmediately();
diff --git a/packages/less/dist/less.min.js b/packages/less/dist/less.min.js
index fb7147a09..cb0b02074 100644
--- a/packages/less/dist/less.min.js
+++ b/packages/less/dist/less.min.js
@@ -1,11 +1,11 @@
/**
- * Less - Leaner CSS v4.4.2
+ * Less - Leaner CSS v4.5.0
* http://lesscss.org
- *
- * Copyright (c) 2009-2025, Alexis Sellier
+ *
+ * Copyright (c) 2009-2026, Alexis Sellier
* Licensed under the Apache-2.0 License.
*
* @license Apache-2.0
*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).less=t()}(this,(function(){"use strict";function e(e){return e.replace(/^[a-z-]+:\/+?[^/]+/,"").replace(/[?&]livereload=\w+/,"").replace(/^\//,"").replace(/\.[a-zA-Z]+$/,"").replace(/[^.\w-]+/g,"-").replace(/\./g,":")}function t(e,t){if(t)for(var n in t.dataset)if(Object.prototype.hasOwnProperty.call(t.dataset,n))if("env"===n||"dumpLineNumbers"===n||"rootpath"===n||"errorReporting"===n)e[n]=t.dataset[n];else try{e[n]=JSON.parse(t.dataset[n])}catch(e){}}var n=function(t,n,i){var r=i.href||"",s="less:".concat(i.title||e(r)),a=t.getElementById(s),o=!1,l=t.createElement("style");l.setAttribute("type","text/css"),i.media&&l.setAttribute("media",i.media),l.id=s,l.styleSheet||(l.appendChild(t.createTextNode(n)),o=null!==a&&a.childNodes.length>0&&l.childNodes.length>0&&a.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===a||!1===o){var c=i&&i.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(a&&!1===o&&a.parentNode.removeChild(a),l.styleSheet)try{l.styleSheet.cssText=n}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},i=function(e){var t,n=e.document;return n.currentScript||(t=n.getElementsByTagName("script"))[t.length-1]},r={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(var t=0;t=0;o--){var l=a[o];if(l[s?"supportsSync":"supports"](e,t,n,i))return l}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),a={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},o={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:a,unitConversions:o},u=function(){function e(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null}return Object.defineProperty(e.prototype,"currentFileInfo",{get:function(){return this.fileInfo()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){return this.getIndex()},enumerable:!1,configurable:!0}),e.prototype.setParent=function(t,n){function i(t){t&&t instanceof e&&(t.parent=n)}Array.isArray(t)?t.forEach(i):i(t)},e.prototype.getIndex=function(){return this._index||this.parent&&this.parent.getIndex()||0},e.prototype.fileInfo=function(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}},e.prototype.isRulesetLike=function(){return!1},e.prototype.toCSS=function(e){var t=[];return this.genCSS(e,{add:function(e,n,i){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")},e.prototype.genCSS=function(e,t){t.add(this.value)},e.prototype.accept=function(e){this.value=e.visit(this.value)},e.prototype.eval=function(){return this},e.prototype._operate=function(e,t,n,i){switch(t){case"+":return n+i;case"-":return n-i;case"*":return n*i;case"/":return n/i}},e.prototype.fround=function(e,t){var n=e&&e.numPrecision;return n?Number((t+2e-16).toFixed(n)):t},e.compare=function(t,n){if(t.compare&&"Quoted"!==n.type&&"Anonymous"!==n.type)return t.compare(n);if(n.compare)return-n.compare(t);if(t.type===n.type){if(t=t.value,n=n.value,!Array.isArray(t))return t===n?0:void 0;if(t.length===n.length){for(var i=0;it?1:void 0},e.prototype.blocksVisibility=function(){return void 0===this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks},e.prototype.addVisibilityBlock=function(){void 0===this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1},e.prototype.removeVisibilityBlock=function(){void 0===this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1},e.prototype.ensureVisibility=function(){this.nodeVisible=!0},e.prototype.ensureInvisibility=function(){this.nodeVisible=!1},e.prototype.isVisible=function(){return this.nodeVisible},e.prototype.visibilityInfo=function(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}},e.prototype.copyVisibilityInfo=function(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)},e}(),c=function(e,t,n){var i=this;Array.isArray(e)?this.rgb=e:e.length>=6?(this.rgb=[],e.match(/.{2}/g).map((function(e,t){t<3?i.rgb.push(parseInt(e,16)):i.alpha=parseInt(e,16)/255}))):(this.rgb=[],e.split("").map((function(e,t){t<3?i.rgb.push(parseInt(e+e,16)):i.alpha=parseInt(e+e,16)/255}))),this.alpha=this.alpha||("number"==typeof t?t:1),void 0!==n&&(this.value=n)};function h(e,t){return Math.min(Math.max(e,0),t)}function f(e){return"#".concat(e.map((function(e){return((e=h(Math.round(e),255))<16?"0":"")+e.toString(16)})).join(""))}c.prototype=Object.assign(new u,{type:"Color",luma:function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,n=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(n=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))},genCSS:function(e,t){t.add(this.toCSS(e))},toCSS:function(e,t){var n,i,r,s=e&&e.compress&&!t,a=[];if(i=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))i<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=i<1?"hsla":"hsl"}else i<1&&(r="rgba");switch(r){case"rgba":a=this.rgb.map((function(e){return h(Math.round(e),255)})).concat(h(i,1));break;case"hsla":a.push(h(i,1));case"hsl":n=this.toHSL(),a=[this.fround(e,n.h),"".concat(this.fround(e,100*n.s),"%"),"".concat(this.fround(e,100*n.l),"%")].concat(a)}if(r)return"".concat(r,"(").concat(a.join(",".concat(s?"":" ")),")");if(n=this.toRGB(),s){var o=n.split("");o[1]===o[2]&&o[3]===o[4]&&o[5]===o[6]&&(n="#".concat(o[1]).concat(o[3]).concat(o[5]))}return n},operate:function(e,t,n){for(var i=new Array(3),r=this.alpha*(1-n.alpha)+n.alpha,s=0;s<3;s++)i[s]=this._operate(e,t,this.rgb[s],n.rgb[s]);return new c(i,r)},toRGB:function(){return f(this.rgb)},toHSL:function(){var e,t,n=this.rgb[0]/255,i=this.rgb[1]/255,r=this.rgb[2]/255,s=this.alpha,a=Math.max(n,i,r),o=Math.min(n,i,r),l=(a+o)/2,u=a-o;if(a===o)e=t=0;else{switch(t=l>.5?u/(2-a-o):u/(a+o),a){case n:e=(i-r)/u+(iC(e,t));if("Object"!==S(n=e)||n.constructor!==Object||Object.getPrototypeOf(n)!==Object.prototype)return e;var n;return[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)].reduce((n,i)=>{if(I(t.props)&&!t.props.includes(i))return n;return function(e,t,n,i,r){const s={}.propertyIsEnumerable.call(i,t)?"enumerable":"nonenumerable";"enumerable"===s&&(e[t]=n),r&&"nonenumerable"===s&&Object.defineProperty(e,t,{value:n,enumerable:!1,writable:!0,configurable:!0})}(n,i,C(e[i],t),e,t.nonenumerable),n},{})}function k(e,t){for(var n=e+1,i=null,r=-1;--n>=0&&"\n"!==t.charAt(n);)r++;return"number"==typeof e&&(i=(t.slice(0,e).match(/\n/g)||"").length),{line:i,column:r}}function A(e){var t,n=e.length,i=new Array(n);for(t=0;t|Function):(\d+):(\d+)/,F=function(e,t,n){Error.call(this);var i=e.filename||n;if(this.message=e.message,this.stack=e.stack,t&&i){var r=t.contents[i],s=k(e.index,r),a=s.line,o=s.column,l=e.call&&k(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=i,this.index=e.index,this.line="number"==typeof a?a+1:null,this.column=o,!this.line&&this.stack){var c=this.stack.match($),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match($);f=1-parseInt(p[2])}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var V=function(){};V.prototype=Error.prototype,F.prototype=new V}else F.prototype=Object.create(Error.prototype);F.prototype.constructor=F,F.prototype.toString=function(e){var t;e=e||{};var n=(null!==(t=this.type)&&void 0!==t?t:"").toLowerCase().includes("warning"),i=n?this.type:"".concat(this.type,"Error"),r=n?"yellow":"red",s="",a=this.extract||[],o=[],l=function(e){return e};if(e.stylize){var u=typeof e.stylize;if("function"!==u)throw Error("options.stylize should be a function, got a ".concat(u,"!"));l=e.stylize}if(null!==this.line){if(n||"string"!=typeof a[0]||o.push(l("".concat(this.line-1," ").concat(a[0]),"grey")),"string"==typeof a[1]){var c="".concat(this.line," ");a[1]&&(c+=a[1].slice(0,this.column)+l(l(l(a[1].substr(this.column,1),"bold")+a[1].slice(this.column+1),"red"),"inverse")),o.push(c)}n||"string"!=typeof a[2]||o.push(l("".concat(this.line+1," ").concat(a[2]),"grey")),o="".concat(o.join("\n")+l("","reset"),"\n")}return s+=l("".concat(i,": ").concat(this.message),r),this.filename&&(s+=l(" in ",r)+this.filename),this.line&&(s+=l(" on line ".concat(this.line,", column ").concat(this.column+1,":"),"grey")),s+="\n".concat(o),this.callLine&&(s+="".concat(l("from ",r)+(this.filename||""),"/n"),s+="".concat(l(this.callLine,"grey")," ").concat(this.callExtract,"/n")),s};var L={visitDeeper:!0},j=!1;function D(e){return e}var N=function(){function e(e){this._implementation=e,this._visitInCache={},this._visitOutCache={},j||(!function e(t,n){var i,r;for(i in t)switch(typeof(r=t[i])){case"function":r.prototype&&r.prototype.type&&(r.prototype.typeIndex=n++);break;case"object":n=e(r,n)}return n}(Ke,1),j=!0)}return e.prototype.visit=function(e){if(!e)return e;var t=e.typeIndex;if(!t)return e.value&&e.value.typeIndex&&this.visit(e.value),e;var n,i=this._implementation,r=this._visitInCache[t],s=this._visitOutCache[t],a=L;if(a.visitDeeper=!0,r||(r=i[n="visit".concat(e.type)]||D,s=i["".concat(n,"Out")]||D,this._visitInCache[t]=r,this._visitOutCache[t]=s),r!==D){var o=r.call(i,e,a);e&&i.isReplacing&&(e=o)}if(a.visitDeeper&&e)if(e.length)for(var l=0,u=e.length;ly.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},B.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===w?G:z)(e)},B.Eval.prototype.rewritePath=function(e,t){var n;return t=t||"",n=this.normalizePath(t+e),G(e)&&z(t)&&!1===G(n)&&(n="./".concat(n)),n},B.Eval.prototype.normalizePath=function(e){var t,n=e.split("/").reverse();for(e=[];0!==n.length;)switch(t=n.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")};var W=function(){function e(e){this.imports=[],this.variableImports=[],this._onSequencerEmpty=e,this._currentDepth=0}return e.prototype.addImport=function(e){var t=this,n={callback:e,args:null,isReady:!1};return this.imports.push(n),function(){n.args=Array.prototype.slice.call(arguments,0),n.isReady=!0,t.tryRun()}},e.prototype.addVariableImport=function(e){this.variableImports.push(e)},e.prototype.tryRun=function(){this._currentDepth++;try{for(;;){for(;this.imports.length>0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),J=function(e,t){this._visitor=new N(this),this._importer=e,this._finish=t,this.context=new B.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new W(this._onSequencerEmpty.bind(this))};J.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var n=e.options.inline;if(!e.css||n){var i=new B.Eval(this.context,A(this.context.frames)),r=i.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,i,r)):this.processImportNode(e,i,r)}t.visitDeeper=!1},processImportNode:function(e,t,n){var i,r=e.options.inline;try{i=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!i||i.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{i.options.multiple&&(t.importMultiple=!0);for(var s=void 0===i.css,a=0;a=0||(o=[u.selfSelectors[0]],(s=f.findMatch(l,o)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();a=f.extendSelector(s,o,e,l.isVisible()),(c=new Ke.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=a,a[a.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(a))}))));if(h.length){if(this.extendChainCount++,n>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:".concat(p,":extend(").concat(v,")")}}return h.concat(f.doExtendChaining(h,t,n+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var n,i,r,s,a=this.allExtendsStack[this.allExtendsStack.length-1],o=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==a?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=s.elements.slice(c,o.index).concat([a]).concat(n.elements.slice(1)),u===o.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,o.pathIndex))).push(new Ke.Selector(l)),u=o.endPathIndex,(c=o.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return i?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),Z=function(){function e(){this.contexts=[[]],this._visitor=new N(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var n,i=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((n=e.selectors)&&(n=n.filter((function(e){return e.getIsOutput()})),e.selectors=n.length?n:n=null,n&&e.joinSelectors(r,i,n)),n||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules[0].root=0===n.length||n[0].multiMedia},e.prototype.visitAtRule=function(e,t){var n=this.contexts[this.contexts.length-1];e.declarations&&e.declarations.length?e.declarations[0].root=0===n.length||n[0].multiMedia:e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===n.length||null)},e}(),X=function(){function e(e){this._visitor=new N(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var n=0;n0},e.prototype.resolveVisibility=function(e){if(!e.blocksVisibility()){if(this.isEmpty(e))return;return e}var t=e.rules[0];if(this.keepOnlyVisibleChilds(t),!this.isEmpty(t))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Y=function(e){this._visitor=new N(this),this._context=e,this.utils=new X(e)};Y.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var n=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,n)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var n=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,n)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var n=new Ke.Comment("/* ".concat(e.toCSS(this._context).replace(/\n/g,"")," */\n"));return n.debugInfo=e.debugInfo,this._visitor.visit(n)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var n=0;n0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),i.splice(0,0,e)),1===i.length?i[0]:i},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Ke.Combinator("")),t=0;t=0;i--)if((n=e[i])instanceof Ke.Declaration)if(r[n.name]){(t=r[n.name])instanceof Ke.Declaration&&(t=r[n.name]=[r[n.name].toCSS(this._context)]);var s=n.toCSS(this._context);-1!==t.indexOf(s)?e.splice(i,1):t.push(s)}else r[n.name]=n}},_mergeRules:function(e){if(e){for(var t={},n=[],i=0;i0){var t=e[0],n=[],i=[new Ke.Expression(n)];e.forEach((function(e){"+"===e.merge&&n.length>0&&i.push(new Ke.Expression(n=[])),n.push(e.value),t.important=t.important||e.important})),t.value=new Ke.Value(i)}}))}}};var ee={Visitor:N,ImportVisitor:J,MarkVisibleSelectorsVisitor:K,ExtendVisitor:Q,JoinSelectorVisitor:Z,ToCSSVisitor:Y};var te=function(){var e,t,n,i,r,s,a,o=[],l={};function u(n){for(var i,o,c,h=l.i,f=t,p=l.i-a,v=l.i+s.length-p,d=l.i+=n,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==i&&10!==i&&9!==i&&13!==i)break}if(s=s.slice(n+l.i-d+p),a=l.i,!s.length){if(tn||l.i===n&&e&&!i)&&(n=l.i,i=e);var r=o.pop();s=r.current,a=l.i=r.i,t=r.j},l.forget=function(){o.pop()},l.isWhitespace=function(t){var n=l.i+(t||0),i=e.charCodeAt(n);return 32===i||13===i||9===i||10===i},l.$re=function(e){l.i>a&&(s=s.slice(l.i-a),a=l.i);var t=e.exec(s);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$peekChar=function(t){return e.charAt(l.i)!==t?null:t},l.$str=function(t){for(var n=t.length,i=0;ih&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var n=0;n57||t<43||47===t||44===t},l.start=function(i,o,c){e=i,l.i=t=a=n=0,r=o?function(e,t){var n,i,r,s,a,o,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var n=a-d;n<512&&!t||!n||(v.push(e.slice(d,a+1)),d=a+1)}for(a=0;a=97&&l<=122||l<34))switch(l){case 40:p++,i=a;continue;case 41:if(--p<0)return t("missing opening `(`",a);continue;case 59:p||m();continue;case 123:f++,n=a;continue;case 125:if(--f<0)return t("missing opening `{`",a);f||p||m();continue;case 92:if(a96)){if(u==l){c=1;break}if(92==u){if(a==h-1)return t("unescaped `\\`",a);a++}}if(c)continue;return t("unmatched `".concat(String.fromCharCode(l),"`"),o);case 47:if(p||a==h-1)continue;if(47==(u=e.charCodeAt(a+1)))for(a+=2;an&&s>r?"missing closing `}` or `*/`":"missing closing `}`",n):0!==p?t("missing closing `)`",i):(m(!0),v)}(i,c):[i],s=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l};var ne=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(n){t.add(n,e[n])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),ie={queryInParens:!0},re={queryInParens:!0},se=function(e,t,n,i,r,s){this.value=e,this._index=t,this._fileInfo=n,this.mapLines=i,this.rulesetLike=void 0!==r&&r,this.allowRoot=!0,this.copyVisibilityInfo(s)};se.prototype=Object.assign(new u,{type:"Anonymous",eval:function(){return new se(this.value,this._index,this._fileInfo,this.mapLines,this.rulesetLike,this.visibilityInfo())},compare:function(e){return e.toCSS&&this.toCSS()===e.toCSS()?0:void 0},isRulesetLike:function(){return this.rulesetLike},genCSS:function(e,t){this.nodeVisible=Boolean(this.value),this.nodeVisible&&t.add(this.value,this._fileInfo,this._index,this.mapLines)}});var ae=function e(t,n,i,s){var a;s=s||0;var o=te();function l(e,t){throw new F({index:o.i,filename:i.filename,type:t||"Syntax",message:e},n)}function u(e,s,a){t.quiet||r.warn(new F({index:null!=s?s:o.i,filename:i.filename,type:a?"".concat(a.toUpperCase()," WARNING"):"WARNING",message:e},n).toString())}function c(e,t){var n=e instanceof Function?e.call(a):o.$re(e);if(n)return n;l(t||("string"==typeof e?"expected '".concat(e,"' got '").concat(o.currentChar(),"'"):"unexpected token"))}function h(e,t){if(o.$char(e))return e;l(t||"expected '".concat(e,"' got '").concat(o.currentChar(),"'"))}function f(e){var t=i.filename;return{lineNumber:k(e,o.getInput()).line+1,fileName:t}}return{parserInput:o,imports:n,fileInfo:i,parseNode:function(e,t,r){var l,u=[],c=o;try{c.start(e,!1,(function(e,t){r({message:e,index:t+s})}));for(var h=0,f=void 0;f=t[h];h++)l=a[f](),u.push(l||null);c.end().isFinished?r(null,u):r(!0,null)}catch(e){throw new F({index:e.index+s,message:e.message},n,i.filename)}},parse:function(r,s,u){var c,h,f,p,v=null,d="";if(u&&u.disablePluginRule&&(a.plugin=function(){o.$re(/^@plugin?\s+/)&&l("@plugin statements are not allowed when disablePluginRule is set to true")}),h=u&&u.globalVars?"".concat(e.serializeVars(u.globalVars),"\n"):"",f=u&&u.modifyVars?"\n".concat(e.serializeVars(u.modifyVars)):"",t.pluginManager)for(var m=t.pluginManager.getPreProcessors(),g=0;g");return e},args:function(e){var t,n,i,r,s,u,c,h=a.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(o.save();;){if(e)u=a.detachedRuleset()||a.expression();else{if(o.commentStore.length=0,o.$str("...")){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;r=null,u.throwAwayComments&&u.throwAwayComments(),s=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Ke.Variable||g instanceof Ke.Property))if(o.$char(":")){if(p.length>0&&(t&&l("Cannot mix ; and , as delimiter types"),n=!0),!(s=a.detachedRuleset()||a.expression())){if(!e)return o.restore(),f.args=[],f;l("could not understand value for named argument")}r=i=g.name}else if(o.$str("...")){if(!e){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(i=r=g.name,s=null);s&&p.push(s),d.push({name:r,value:s,expand:c}),o.$char(",")?m=!0:((m=";"===o.$char(";"))||t)&&(n&&l("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(s=new Ke.Value(p)),v.push({name:i,value:s,expand:c}),i=null,p=[],n=!1)}return o.forget(),f.args=t?v:d,f},definition:function(){var e,t,n,i,r=[],s=!1;if(!("."!==o.currentChar()&&"#"!==o.currentChar()||o.peek(/^[^{]*\}/)))if(o.save(),t=o.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var l=this.args(!1);if(r=l.args,s=l.variadic,!o.$char(")"))return void o.restore("Missing closing ')'");if(o.commentStore.length=0,o.$str("when")&&(i=c(a.conditions,"expected condition")),n=a.block())return o.forget(),new Ke.mixin.Definition(e,r,n,i,s);o.restore()}else o.restore()},ruleLookups:function(){var e,t=[];if("["===o.currentChar()){for(;;){if(o.save(),!(e=this.lookupValue())&&""!==e){o.restore();break}t.push(e),o.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(o.save(),o.$char("[")){var e=o.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(o.$char("]"))return e||""===e?(o.forget(),e):void o.restore();o.restore()}else o.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return o.$char(";")||o.peek("}")},ieAlpha:function(){var e;if(o.$re(/^opacity=/i))return(e=o.$re(/^\d+/))||(e=c(a.entities.variable,"Could not parse alpha"),e="@{".concat(e.name.slice(1),"}")),h(")"),new Ke.Quoted("","alpha(opacity=".concat(e,")"))},element:function(){var e,t,n,r=o.i;if(t=this.combinator(),!(e=o.$re(/^(?:\d+\.\d+|\d+)%/)||o.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||o.$char("*")||o.$char("&")||this.attribute()||o.$re(/^\([^&()@]+\)/)||o.$re(/^[.#:](?=@)/)||this.entities.variableCurly()))if(o.save(),o.$char("("))if(n=this.selector(!1)){for(var a=[];o.$char(",");)a.push(n),a.push(new se(",")),n=this.selector(!1);a.push(n),o.$char(")")?(e=a.length>1?new Ke.Paren(new oe(a)):new Ke.Paren(n),o.forget()):o.restore("Missing closing ')'")}else o.restore("Missing closing ')'");else o.forget();if(e)return new Ke.Element(t,e,e instanceof Ke.Variable,r+s,i)},combinator:function(){var e=o.currentChar();if("/"===e){o.save();var t=o.$re(/^\/[a-z]+\//i);if(t)return o.forget(),new Ke.Combinator(t);o.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(o.i++,"^"===e&&"^"===o.currentChar()&&(e="^^",o.i++);o.isWhitespace();)o.i++;return new Ke.Combinator(e)}return o.isWhitespace(-1)?new Ke.Combinator(" "):new Ke.Combinator(null)},selector:function(e){var t,n,r,a,u,h,f,p=o.i;for(e=!1!==e;(e&&(n=this.extend())||e&&(h=o.$str("when"))||(a=this.element()))&&(h?f=c(this.conditions,"expected condition"):f?l("CSS guard can only be used at the end of selector"):n?u=u?u.concat(n):n:(u&&l("Extend can only be used at the end of selector"),r=o.currentChar(),Array.isArray(a)&&a.forEach((function(e){return t.push(e)})),t?t.push(a):t=[a],a=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Ke.Selector(t,u,f,p+s,i);u&&l("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],o.commentStore.length=0,e.condition&&t.length>1&&l("Guards are only currently allowed on a single selector."),o.$char(","));)e.condition&&l("Guards are only currently allowed on a single selector."),o.commentStore.length=0;return t},attribute:function(){if(o.$char("[")){var e,t,n,i,r=this.entities;return(e=r.variableCurly())||(e=c(/^(?:[_A-Za-z0-9-*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(n=o.$re(/^[|~*$^]?=/))&&(t=r.quoted()||o.$re(/^[0-9]+%/)||o.$re(/^[\w-]+/)||r.variableCurly())&&(i=o.$re(/^[iIsS]/)),h("]"),new Ke.Attribute(e,n,t,i)}},block:function(){var e;if(o.$char("{")&&(e=this.primary())&&o.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Ke.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,n;if(o.save(),!o.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,n=e.variadic,o.$char(")"))){var i=this.blockRuleset();if(i)return o.forget(),t?new Ke.mixin.Definition(null,t,i,null,n):new Ke.DetachedRuleset(i);o.restore()}else o.restore()},ruleset:function(){var e,n,i;if(o.save(),t.dumpLineNumbers&&(i=f(o.i)),(e=this.selectors())&&(n=this.block())){o.forget();var r=new Ke.Ruleset(e,n,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=i),r}o.restore()},declaration:function(){var e,t,n,r,a,l,u=o.i,c=o.currentChar();if("."!==c&&"#"!==c&&"&"!==c&&":"!==c)if(o.save(),e=this.variable()||this.ruleProperty()){if((l="string"==typeof e)&&(t=this.detachedRuleset())&&(n=!0),o.commentStore.length=0,!t){if(a=!l&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?o.$char(";")?new se(""):this.permissiveValue(/[;}]/,!0):this.anonymousValue())return o.forget(),new Ke.Declaration(e,t,!1,a,u+s,i);t||(t=this.value()),t?r=this.important():l&&(t=this.permissiveValue())}if(t&&(this.end()||n))return o.forget(),new Ke.Declaration(e,t,r,a,u+s,i);o.restore()}else o.restore()},anonymousValue:function(){var e=o.i,t=o.$re(/^([^.#@$+/'"*`(;{}-]*);/);if(t)return new Ke.Anonymous(t[1],e+s)},permissiveValue:function(e){var t,n,r,s,a=e||";",c=o.i,h=[];function f(){var e=o.currentChar();return"string"==typeof a?e===a:a.test(e)}if(!f()){s=[];do{(n=this.comment())?s.push(n):((n=this.entity())&&s.push(n),o.peek(",")&&(s.push(new Ke.Anonymous(",",o.i)),o.$char(",")))}while(n);if(r=f(),s.length>0){if(s=new Ke.Expression(s),r)return s;h.push(s)," "===o.prevChar()&&h.push(new Ke.Anonymous(" ",c))}if(o.save(),s=o.$parseUntil(a)){if("string"==typeof s&&l("Expected '".concat(s,"'"),"Parse"),1===s.length&&" "===s[0])return o.forget(),new Ke.Anonymous("",c);var p=void 0;for(t=0;t]=|<=|>=|[<>]|=)/)?(o.restore(),n=this.condition(),o.save(),(r=this.atomicCondition(null,n.rvalue))||o.restore()):(o.restore(),t=this.value()),o.$char(")")?n&&!t?(u.push(new Ke.Paren(new Ke.QueryInParens(n.op,n.lvalue,n.rvalue,r?r.op:null,r?r.rvalue:null,n._index))),t=n):n&&t?(u.push(new Ke.Paren(new Ke.Declaration(n,t,null,null,o.i+s,i,!0))),c||(u[u.length-1].noSpacing=!0),c=!1):t?(u.push(new Ke.Paren(t)),c=!1):l("badly formed media feature definition"):l("Missing closing ')'","Parse"))}while(t);if(o.forget(),u.length>0)return new Ke.Expression(u)},mediaFeatures:function(e){var t,n=this.entities,i=[];do{if(t=this.mediaFeature(e)){if(i.push(t),!o.$char(","))break;i[i.length-1].noSpacing||(i[i.length-1].noSpacing=!1)}else if(t=n.variable()||n.mixinLookup()){if(i.push(t),!o.$char(","))break;i[i.length-1].noSpacing||(i[i.length-1].noSpacing=!1)}}while(t);return i.length>0?i:null},prepareAndGetNestableAtRule:function(e,n,r,a){var u=this.mediaFeatures(a),c=this.block();c||l("media definitions require block statements after any features"),o.forget();var h=new e(c,u,n+s,i);return t.dumpLineNumbers&&(h.debugInfo=r),h},nestableAtRule:function(){var e,n=o.i;if(t.dumpLineNumbers&&(e=f(n)),o.save(),o.$peekChar("@")){if(o.$str("@media"))return this.prepareAndGetNestableAtRule(Ke.Media,n,e,ie);if(o.$str("@container"))return this.prepareAndGetNestableAtRule(Ke.Container,n,e,re)}o.restore()},plugin:function(){var e,t,n,r=o.i;if(o.$re(/^@plugin\s+/)){if(n=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return o.$char(";")||(o.i=r,l("missing semi-colon on @plugin")),new Ke.Import(e,null,n,r+s,i);o.i=r,l("malformed @plugin statement")}},pluginArgs:function(){if(o.save(),!o.$char("("))return o.restore(),null;var e=o.$re(/^\s*([^);]+)\)\s*/);return e[1]?(o.forget(),e[1].trim()):(o.restore(),null)},atruleUnknown:function(e,t,n){return e=this.permissiveValue(/^[{;]/),n="{"===o.currentChar(),e?e.value||(e=null):n||";"===o.currentChar()||l("".concat(t," rule is missing block or ending semi-colon")),[e,n]},atruleBlock:function(e,t,n,i){if(e=this.blockRuleset(),o.save(),e||n||(t=this.entity(),e=this.blockRuleset()),e||n)o.forget();else{o.restore();var r=[];for(t=this.entity();o.$char(",");)r.push(t),t=this.entity();t&&r.length>0?(r.push(t),t=r,i=!0):e=this.blockRuleset()}return[e,t,i]},atrule:function(){var e,n,r,a,u,c,h,p=o.i,v=!0,d=!0,m=!1;if("@"===o.currentChar()){if(n=this.import()||this.plugin()||this.nestableAtRule())return n;if(o.save(),e=o.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@".concat(e.slice(e.indexOf("-",2)+1))),a){case"@charset":u=!0,v=!1;break;case"@namespace":c=!0,v=!1;break;case"@keyframes":case"@counter-style":u=!0;break;case"@document":case"@supports":h=!0,d=!1;break;case"@starting-style":case"@layer":d=!1;break;default:h=!0}if(o.commentStore.length=0,u)(n=this.entity())||l("expected ".concat(e," identifier"));else if(c)(n=this.expression())||l("expected ".concat(e," expression"));else if(h){n=(g=this.atruleUnknown(n,e,v))[0],v=g[1]}if(v){var g,y=this.atruleBlock(r,n,d,m);if(r=y[0],n=y[1],m=y[2],!r&&!h)o.restore(),e=o.$re(/^@[a-z-]+/),n=(g=this.atruleUnknown(n,e,v))[0],(v=g[1])&&(r=(y=this.atruleBlock(r,n,d,m))[0],n=y[1],m=y[2])}if(r||m||!v&&n&&o.$char(";"))return o.forget(),new Ke.AtRule(e,n,r,p+s,i,t.dumpLineNumbers?f(p):null,d);o.restore("at-rule options not recognised")}}},value:function(){var e,t=[],n=o.i;do{if((e=this.expression())&&(t.push(e),!o.$char(",")))break}while(e);if(t.length>0)return new Ke.Value(t,n+s)},important:function(){if("!"===o.currentChar())return o.$re(/^! *important/)},sub:function(){var e,t;if(o.save(),o.$char("("))return(e=this.addition())&&o.$char(")")?(o.forget(),(t=new Ke.Expression([e])).parens=!0,t):void o.restore("Expected ')'");o.restore()},colorOperand:function(){o.save();var e=o.$re(/^[lchrgbs]\s+/);if(e)return new Ke.Keyword(e[0]);o.restore()},multiplication:function(){var e,t,n,i,r;if(e=this.operand()){for(r=o.isWhitespace(-1);!o.peek(/^\/[*/]/);){if(o.save(),!(n=o.$char("/")||o.$char("*"))){var s=o.i;(n=o.$str("./"))&&u("./ operator is deprecated",s,"DEPRECATED")}if(!n){o.forget();break}if(!(t=this.operand())){o.restore();break}o.forget(),e.parensInOp=!0,t.parensInOp=!0,i=new Ke.Operation(n,[i||e,t],r),r=o.isWhitespace(-1)}return i||e}},addition:function(){var e,t,n,i,r;if(e=this.multiplication()){for(r=o.isWhitespace(-1);(n=o.$re(/^[-+]\s+/)||!r&&(o.$char("+")||o.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,i=new Ke.Operation(n,[i||e,t],r),r=o.isWhitespace(-1);return i||e}},conditions:function(){var e,t,n,i=o.i;if(e=this.condition(!0)){for(;o.peek(/^,\s*(not\s*)?\(/)&&o.$char(",")&&(t=this.condition(!0));)n=new Ke.Condition("or",n||e,t,i+s);return n||e}},condition:function(e){var t,n,i;if(t=this.conditionAnd(e)){if(n=o.$str("or")){if(!(i=this.condition(e)))return;t=new Ke.Condition(n,t,i)}return t}},conditionAnd:function(e){var t,n,i,r,s=this;if(t=(r=s.negatedCondition(e)||s.parenthesisCondition(e))||e?r:s.atomicCondition(e)){if(n=o.$str("and")){if(!(i=this.conditionAnd(e)))return;t=new Ke.Condition(n,t,i)}return t}},negatedCondition:function(e){if(o.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(o.save(),o.$str("(")){if(t=function(t){var n;if(o.save(),n=t.condition(e)){if(o.$char(")"))return o.forget(),n;o.restore()}else o.restore()}(this))return o.forget(),t;if(t=this.atomicCondition(e)){if(o.$char(")"))return o.forget(),t;o.restore("expected ')' got '".concat(o.currentChar(),"'"))}else o.restore()}else o.restore()},atomicCondition:function(e,t){var n,i,r,a,u=this.entities,c=o.i,h=function(){return this.addition()||u.keyword()||u.quoted()||u.mixinLookup()}.bind(this);if(n=t||h())return o.$char(">")?a=o.$char("=")?">=":">":o.$char("<")?a=o.$char("=")?"<=":"<":o.$char("=")&&(a=o.$char(">")?"=>":o.$char("<")?"=<":"="),a?(i=h())?r=new Ke.Condition(a,n,i,c+s,!1):l("expected expression"):t||(r=new Ke.Condition("=",n,new Ke.Keyword("true"),c+s,!1)),r},operand:function(){var e,t=this.entities;o.peek(/^-[@$(]/)&&(e=o.$char("-"));var n=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||this.colorOperand()||t.mixinLookup();return e&&(n.parensInOp=!0,n=new Ke.Negative(n)),n},expression:function(){var e,t,n=[],i=o.i;do{!(e=this.comment())||e.isLineComment?((e=this.addition()||this.entity())instanceof Ke.Comment&&(e=null),e&&(n.push(e),o.peek(/^\/[/*]/)||(t=o.$char("/"))&&n.push(new Ke.Anonymous(t,i+s)))):n.push(e)}while(e);if(n.length>0)return new Ke.Expression(n)},property:function(){var e=o.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,n=[],r=[];o.save();var a=o.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(a)return n=[new Ke.Keyword(a[1])],o.forget(),n;function l(e){var t=o.i,i=o.$re(e);if(i)return r.push(t),n.push(i[1])}for(l(/^(\*?)/);l(/^((?:[\w-]+)|(?:[@$]\{[\w-]+\}))/););if(n.length>1&&l(/^((?:\+_|\+)?)\s*:/)){for(o.forget(),""===n[0]&&(n.shift(),r.shift()),t=0;t0;e--){var t=this.rules[e-1];if(t instanceof he)return this.parseValue(t)}},parseValue:function(e){var t=this;function n(e){return e.value instanceof se&&!e.parsed?("string"==typeof e.value.value?new ae(this.parse.context,this.parse.importManager,e.fileInfo(),e.value.getIndex()).parseNode(e.value.value,["value","important"],(function(t,n){t&&(e.parsed=!0),n&&(e.value=n[0],e.important=n[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var i=[];return e.forEach((function(e){i.push(n.call(t,e))})),i}return n.call(t,e)},rulesets:function(){if(!this.rules)return[];var e,t,n=[],i=this.rules;for(e=0;t=i[e];e++)t.isRuleset&&n.push(t);return n},prependRule:function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},find:function(e,t,n){t=t||this;var i,r,s=[],a=e.toCSS();return a in this._lookups?this._lookups[a]:(this.rulesets().forEach((function(a){if(a!==t)for(var o=0;oi){if(!n||n(a)){r=a.find(new oe(e.elements.slice(i)),t,n);for(var l=0;l0&&t.add(l),e.firstSelector=!0,a[0].genCSS(e,t),e.firstSelector=!1,i=1;i0?(s=(r=A(e)).pop(),a=i.createDerived(A(s.elements))):a=i.createDerived([]),t.length>0){var o=n.combinator,l=t[0].elements[0];o.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(o=l.combinator),a.elements.push(new g(o,l.value,n.isVariable,n._index,n._fileInfo)),a.elements=a.elements.concat(t[0].elements.slice(1))}if(0!==a.elements.length&&r.push(a),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function a(e,t,n,i,r){var a;for(a=0;a0?i[i.length-1]=i[i.length-1].createDerived(i[i.length-1].elements.concat(e)):i.push(new oe(e));else t.push([new oe(e)])}function l(e,t){var n=t.createDerived(t.elements,t.extendList,t.evaldCondition);return n.copyVisibilityInfo(e),n}var u,c;if(!function e(t,n,l){var u,c,h,f,p,d,m,y,b,w,x,S,I=!1;for(f=[],p=[[]],u=0;y=l.elements[u];u++)if("&"!==y.value){var C=(S=void 0,(x=y).value instanceof v&&(S=x.value.value)instanceof oe?S:null);if(null!==C){o(f,p);var k,A=[],_=[];for(k=e(A,n,C),I=I||k,h=0;h0&&m[0].elements.push(new g(y.combinator,"",y.isVariable,y._index,y._fileInfo)),d.push(m);else for(h=0;h0&&(t.push(p[u]),w=p[u][b-1],p[u][b-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,n))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(i=n.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===n&&this.unit.isLength())return void t.add(i);n>0&&n<1&&(i=i.substr(1))}t.add(i),this.unit.genCSS(e,t)},operate:function(e,t,n){var i=this._operate(e,t,this.value,n.value),r=this.unit.clone();if("+"===t||"-"===t)if(0===r.numerator.length&&0===r.denominator.length)r=n.unit.clone(),this.unit.backupUnit&&(r.backupUnit=this.unit.backupUnit);else if(0===n.unit.numerator.length&&0===r.denominator.length);else{if(n=n.convertTo(this.unit.usedUnits()),e.strictUnits&&n.unit.toString()!==r.toString())throw new Error("Incompatible units. Change the units or use the unit function. "+"Bad units: '".concat(r.toString(),"' and '").concat(n.unit.toString(),"'."));i=this._operate(e,t,this.value,n.value)}else"*"===t?(r.numerator=r.numerator.concat(n.unit.numerator).sort(),r.denominator=r.denominator.concat(n.unit.denominator).sort(),r.cancel()):"/"===t&&(r.numerator=r.numerator.concat(n.unit.denominator).sort(),r.denominator=r.denominator.concat(n.unit.numerator).sort(),r.cancel());return new be(i,r)},compare:function(e){var t,n;if(e instanceof be){if(this.unit.isEmpty()||e.unit.isEmpty())t=this,n=e;else if(t=this.unify(),n=e.unify(),0!==t.unit.compare(n.unit))return;return u.numericCompare(t.value,n.value)}},unify:function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},convertTo:function(e){var t,n,i,r,s,a=this.value,l=this.unit.clone(),u={};if("string"==typeof e){for(t in o)o[t].hasOwnProperty(e)&&((u={})[t]=e);e=u}for(n in s=function(e,t){return i.hasOwnProperty(e)?(t?a/=i[e]/i[r]:a*=i[e]/i[r],r):e},e)e.hasOwnProperty(n)&&(r=e[n],i=o[n],l.map(s));return l.cancel(),new be(a,l)}});var we=function(e,t){if(this.value=e,this.noSpacing=t,!e)throw new Error("Expression requires an array parameter")};we.prototype=Object.assign(new u,{type:"Expression",accept:function(e){this.value=e.visitArray(this.value)},eval:function(e){var t,n=this.noSpacing,i=e.isMathOn(),r=this.parens,s=!1;return r&&e.inParenthesis(),this.value.length>1?t=new we(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(s=!0),t=this.value[0].eval(e)):t=this,r&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||s||t instanceof be||(t=new v(t)),t.noSpacing=t.noSpacing||n,t},genCSS:function(e,t){for(var n=0;n1){var n=new oe([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new ge(n,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},evalNested:function(e){var t,n;this.evalFunction();var i=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new se("and"));return new we(e)}))),this.setParent(this.features,this),new ge([],[])},permute:function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],n=this.permute(e.slice(1)),i=0;i0)for(var o=function(t){var o=e.frames[t];if("Ruleset"===o.type&&o.rules&&o.rules.length>0&&o&&!o.root&&o.selectors&&o.selectors.length>0&&(a=a.concat(o.selectors)),a.length>0){for(var l="",u={add:function(e){l+=e}},c=0;c0&&i>0&&!s&&!r;return(this.isRooted&&n>0&&0===i&&!s&&r||!u)&&(t[0].root=!0),t},variable:function(e){if(this.rules)return ge.prototype.variable.call(this.rules[0],e)},find:function(){if(this.rules)return ge.prototype.find.apply(this.rules[0],arguments)},rulesets:function(){if(this.rules)return ge.prototype.rulesets.apply(this.rules[0])},outputRuleset:function(e,t,n){var i,r=n.length;if(e.tabLevel=1+(0|e.tabLevel),e.compress){for(t.add("{"),i=0;i=1)if("Expression"===(o=r[0]).type&&Array.isArray(o.value)&&o.value.length>=2)"Keyword"===(r=o.value)[0].type&&"layer"===r[0].value&&"Paren"===r[1].type&&(this.css=!1)}if(this.options.inline){var s=new se(this.root,0,{filename:this.importedFilename,reference:this.path._fileInfo&&this.path._fileInfo.reference},!0,!0);return this.features?new $e([s],this.features.value):[s]}if(this.css||this.layerCss){var a=new Fe(this.evalPath(e),i,this.options,this._index);if(this.layerCss&&(a.css=this.layerCss,a.path._fileInfo=this._fileInfo),!a.css&&this.error)throw this.error;return a}if(this.root){if(this.features){var o;r=this.features.value;if(Array.isArray(r)&&1===r.length)if("Expression"===(o=r[0]).type&&Array.isArray(o.value)&&o.value.length>=2)if("Keyword"===(r=o.value)[0].type&&"layer"===r[0].value&&"Paren"===r[1].type)return this.layerCss=!0,r[0]=new we(r.slice(0,2)),r.splice(1,1),r[0].noSpacing=!0,this}return(t=new ge(null,A(this.root.rules))).evalImports(e),this.features?new $e(t.rules,this.features.value):t.rules}if(this.features){r=this.features.value;if(Array.isArray(r)&&r.length>=1)if(r=r[0].value,Array.isArray(r)&&r.length>=2)if("Keyword"===r[0].type&&"layer"===r[0].value&&"Paren"===r[1].type)return this.css=!0,r[0]=new we(r.slice(0,2)),r.splice(1,1),r[0].noSpacing=!0,this}return[]}});var Ve=function(){};Ve.prototype=Object.assign(new u,{evaluateJavaScript:function(e,t){var n,i=this,r={};if(!t.javascriptEnabled)throw{message:"Inline JavaScript is not enabled. Is it set in your options?",filename:this.fileInfo().filename,index:this.getIndex()};e=e.replace(/@\{([\w-]+)\}/g,(function(e,n){return i.jsify(new Pe("@".concat(n),i.getIndex(),i.fileInfo()).eval(t))}));try{e=new Function("return (".concat(e,")"))}catch(t){throw{message:"JavaScript evaluation error: ".concat(t.message," from `").concat(e,"`"),filename:this.fileInfo().filename,index:this.getIndex()}}var s=t.frames[0].variables();for(var a in s)s.hasOwnProperty(a)&&(r[a.slice(1)]={value:s[a].value,toJS:function(){return this.value.eval(t).toCSS()}});try{n=e.call(r)}catch(e){throw{message:"JavaScript evaluation error: '".concat(e.name,": ").concat(e.message.replace(/["]/g,"'"),"'"),filename:this.fileInfo().filename,index:this.getIndex()}}return n},jsify:function(e){return Array.isArray(e.value)&&e.value.length>1?"[".concat(e.value.map((function(e){return e.toCSS()})).join(", "),"]"):e.toCSS()}});var Le=function(e,t,n,i){this.escaped=t,this.expression=e,this._index=n,this._fileInfo=i};Le.prototype=Object.assign(new Ve,{type:"JavaScript",eval:function(e){var t=this.evaluateJavaScript(this.expression,e),n=typeof t;return"number"!==n||isNaN(t)?"string"===n?new Me('"'.concat(t,'"'),t,this.escaped,this._index):Array.isArray(t)?new se(t.join(", ")):new se(t):new be(t)}});var je=function(e,t){this.key=e,this.value=t};je.prototype=Object.assign(new u,{type:"Assignment",accept:function(e){this.value=e.visit(this.value)},eval:function(e){return this.value.eval?new je(this.key,this.value.eval(e)):this},genCSS:function(e,t){t.add("".concat(this.key,"=")),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)}});var De=function(e,t,n,i,r){this.op=e.trim(),this.lvalue=t,this.rvalue=n,this._index=i,this.negate=r};De.prototype=Object.assign(new u,{type:"Condition",accept:function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},eval:function(e){var t=function(e,t,n){switch(e){case"and":return t&&n;case"or":return t||n;default:switch(u.compare(t,n)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t}});var Ne=function(e,t,n,i,r,s){this.op=e.trim(),this.lvalue=t,this.mvalue=n,this.op2=i?i.trim():null,this.rvalue=r,this._index=s,this.mvalues=[]};Ne.prototype=Object.assign(new u,{type:"QueryInParens",accept:function(e){this.lvalue=e.visit(this.lvalue),this.mvalue=e.visit(this.mvalue),this.rvalue&&(this.rvalue=e.visit(this.rvalue))},eval:function(e){var t,n;this.lvalue=this.lvalue.eval(e);for(var i=0;(n=e.frames[i])&&("Ruleset"!==n.type||!(t=n.rules.find((function(e){return!!(e instanceof he&&e.variable)}))));i++);return this.mvalueCopy||(this.mvalueCopy=C(this.mvalue)),t?(this.mvalue=this.mvalueCopy,this.mvalue=this.mvalue.eval(e),this.mvalues.push(this.mvalue)):this.mvalue=this.mvalue.eval(e),this.rvalue&&(this.rvalue=this.rvalue.eval(e)),this},genCSS:function(e,t){this.lvalue.genCSS(e,t),t.add(" "+this.op+" "),this.mvalues.length>0&&(this.mvalue=this.mvalues.shift()),this.mvalue.genCSS(e,t),this.rvalue&&(t.add(" "+this.op2+" "),this.rvalue.genCSS(e,t))}});var Be=function(e,t,n,i,r){this._index=n,this._fileInfo=i;var s=new oe([],null,null,this._index,this._fileInfo).createEmptySelectors();this.features=new le(t),this.rules=[new ge(s,e)],this.rules[0].allowImports=!0,this.copyVisibilityInfo(r),this.allowRoot=!0,this.setParent(s,this),this.setParent(this.features,this),this.setParent(this.rules,this)};Be.prototype=Object.assign(new Se,p(p({type:"Container"},xe),{genCSS:function(e,t){t.add("@container ",this._fileInfo,this._index),this.features.genCSS(e,t),this.outputRuleset(e,t,this.rules)},eval:function(e){e.mediaBlocks||(e.mediaBlocks=[],e.mediaPath=[]);var t=new Be(null,[],this._index,this._fileInfo,this.visibilityInfo());return this.debugInfo&&(this.rules[0].debugInfo=this.debugInfo,t.debugInfo=this.debugInfo),t.features=this.features.eval(e),e.mediaPath.push(t),e.mediaBlocks.push(t),this.rules[0].functionRegistry=e.frames[0].functionRegistry.inherit(),e.frames.unshift(this.rules[0]),t.rules=[this.rules[0].eval(e)],e.frames.shift(),e.mediaPath.pop(),0===e.mediaPath.length?t.evalTop(e):t.evalNested(e)}}));var Ue=function(e){this.value=e};Ue.prototype=Object.assign(new u,{type:"UnicodeDescriptor"});var qe=function(e){this.value=e};qe.prototype=Object.assign(new u,{type:"Negative",genCSS:function(e,t){t.add("-"),this.value.genCSS(e,t)},eval:function(e){return e.isMathOn()?new ke("*",[new be(-1),this.value]).eval(e):new qe(this.value.eval(e))}});var Te=function(e,t,n,i,r){switch(this.selector=e,this.option=t,this.object_id=Te.next_id++,this.parent_ids=[this.object_id],this._index=n,this._fileInfo=i,this.copyVisibilityInfo(r),this.allowRoot=!0,t){case"!all":case"all":this.allowBefore=!0,this.allowAfter=!0;break;default:this.allowBefore=!1,this.allowAfter=!1}this.setParent(this.selector,this)};Te.prototype=Object.assign(new u,{type:"Extend",accept:function(e){this.selector=e.visit(this.selector)},eval:function(e){return new Te(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},clone:function(e){return new Te(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},findSelfSelectors:function(e){var t,n,i=[];for(t=0;t0&&n.length&&""===n[0].combinator.value&&(n[0].combinator.value=" "),i=i.concat(e[t].elements);this.selfSelectors=[new oe(i)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())}}),Te.next_id=0;var ze=function(e,t,n){this.variable=e,this._index=t,this._fileInfo=n,this.allowRoot=!0};ze.prototype=Object.assign(new u,{type:"VariableCall",eval:function(e){var t,n=new Pe(this.variable,this.getIndex(),this.fileInfo()).eval(e),i=new F({message:"Could not evaluate variable call ".concat(this.variable)});if(!n.ruleset){if(n.rules)t=n;else if(Array.isArray(n))t=new ge("",n);else{if(!Array.isArray(n.value))throw i;t=new ge("",n.value)}n=new Ie(t)}if(n.ruleset)return n.callEval(e);throw i}});var Ge=function(e,t,n,i){this.value=e,this.lookups=t,this._index=n,this._fileInfo=i};Ge.prototype=Object.assign(new u,{type:"NamespaceValue",eval:function(e){var t,n,i=this.value.eval(e);for(t=0;tthis.params.length)return!1}n=Math.min(s,this.arity);for(var a=0;a0){for(c=!0,o=0;o0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `".concat(this.format(m),"`"),index:this.getIndex(),filename:this.fileInfo().filename};for(o=0;o0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var n,i,r,s,a=this.extractUrlParts(e),o=this.extractUrlParts(t),l="";if(a.hostPart!==o.hostPart)return"";for(i=Math.max(o.directories.length,a.directories.length),n=0;nparseInt(t[n])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",n=0;n1?e-1:e)<1?r+(s-r)*e*6:2*e<1?s:3*e<2?r+(s-r)*(2/3-e)*6:r}try{if(e instanceof c)return i=t?st(t):e.alpha,new c(e.rgb,i,"hsla");e=st(e)%360/360,t=tt(st(t)),n=tt(st(n)),i=tt(st(i)),r=2*n-(s=n<=.5?n*(t+1):n+t-n*t);var o=[255*a(e+1/3),255*a(e),255*a(e-1/3)];return i=st(i),new c(o,i,"hsla")}catch(e){}},hsv:function(e,t,n){return Ye.hsva(e,t,n,1)},hsva:function(e,t,n,i){var r,s;e=st(e)%360/360*360,t=st(t),n=st(n),i=st(i);var a=[n,n*(1-t),n*(1-(s=e/60-(r=Math.floor(e/60%6)))*t),n*(1-(1-s)*t)],o=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return Ye.rgba(255*a[o[r][0]],255*a[o[r][1]],255*a[o[r][2]],i)},hue:function(e){return new be(it(e).h)},saturation:function(e){return new be(100*it(e).s,"%")},lightness:function(e){return new be(100*it(e).l,"%")},hsvhue:function(e){return new be(rt(e).h)},hsvsaturation:function(e){return new be(100*rt(e).s,"%")},hsvvalue:function(e){return new be(100*rt(e).v,"%")},red:function(e){return new be(e.rgb[0])},green:function(e){return new be(e.rgb[1])},blue:function(e){return new be(e.rgb[2])},alpha:function(e){return new be(it(e).a)},luma:function(e){return new be(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new be(t*e.alpha*100,"%")},saturate:function(e,t,n){if(!e.rgb)return null;var i=it(e);return void 0!==n&&"relative"===n.value?i.s+=i.s*t.value/100:i.s+=t.value/100,i.s=tt(i.s),nt(e,i)},desaturate:function(e,t,n){var i=it(e);return void 0!==n&&"relative"===n.value?i.s-=i.s*t.value/100:i.s-=t.value/100,i.s=tt(i.s),nt(e,i)},lighten:function(e,t,n){var i=it(e);return void 0!==n&&"relative"===n.value?i.l+=i.l*t.value/100:i.l+=t.value/100,i.l=tt(i.l),nt(e,i)},darken:function(e,t,n){var i=it(e);return void 0!==n&&"relative"===n.value?i.l-=i.l*t.value/100:i.l-=t.value/100,i.l=tt(i.l),nt(e,i)},fadein:function(e,t,n){var i=it(e);return void 0!==n&&"relative"===n.value?i.a+=i.a*t.value/100:i.a+=t.value/100,i.a=tt(i.a),nt(e,i)},fadeout:function(e,t,n){var i=it(e);return void 0!==n&&"relative"===n.value?i.a-=i.a*t.value/100:i.a-=t.value/100,i.a=tt(i.a),nt(e,i)},fade:function(e,t){var n=it(e);return n.a=t.value/100,n.a=tt(n.a),nt(e,n)},spin:function(e,t){var n=it(e),i=(n.h+t.value)%360;return n.h=i<0?360+i:i,nt(e,n)},mix:function(e,t,n){n||(n=new be(50));var i=n.value/100,r=2*i-1,s=it(e).a-it(t).a,a=((r*s==-1?r:(r+s)/(1+r*s))+1)/2,o=1-a,l=[e.rgb[0]*a+t.rgb[0]*o,e.rgb[1]*a+t.rgb[1]*o,e.rgb[2]*a+t.rgb[2]*o],u=e.alpha*i+t.alpha*(1-i);return new c(l,u)},greyscale:function(e){return Ye.desaturate(e,new be(100))},contrast:function(e,t,n,i){if(!e.rgb)return null;if(void 0===n&&(n=Ye.rgba(255,255,255,1)),void 0===t&&(t=Ye.rgba(0,0,0,1)),t.luma()>n.luma()){var r=n;n=t,t=r}return i=void 0===i?.43:st(i),e.luma().5&&(i=1,n=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*i*(n-e)},hardlight:function(e,t){return lt.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var ut in lt)lt.hasOwnProperty(ut)&&(ot[ut]=ot.bind(null,lt[ut]));var ct=function(e){return Array.isArray(e.value)?e.value:Array(e)},ht={_SELF:function(e){return e},"~":function(){for(var e=[],t=0;ta.value)&&(h[i]=r);else{if(void 0!==l&&o!==l)throw{type:"Argument",message:"incompatible types"};f[o]=h.length,h.push(r)}}return 1==h.length?h[0]:(t=h.map((function(e){return e.toCSS(c.context)})).join(this.context.compress?",":", "),new se("".concat(e?"min":"max","(").concat(t,")")))},mt={min:function(){for(var e=[],t=0;t<'.concat(u,'Gradient id="g" ').concat(n,">"),r=0;r");return i+="".concat(u,"Gradient>'),i=encodeURIComponent(i),i="data:image/svg+xml,".concat(i),new Oe(new Me("'".concat(i,"'"),i,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),ne.addMultiple(wt),ne.addMultiple(St),t};function Ct(e,t){var n,i=(t=t||{}).variables,r=new B.Eval(t);"object"!=typeof i||Array.isArray(i)||(i=Object.keys(i).map((function(e){var t=i[e];return t instanceof Ke.Value||(t instanceof Ke.Expression||(t=new Ke.Expression([t])),t=new Ke.Value([t])),new Ke.Declaration("@".concat(e),t,!1,null,0)})),r.frames=[new Ke.Ruleset(null,i)]);var s,a,o=[new ee.JoinSelectorVisitor,new ee.MarkVisibleSelectorsVisitor(!0),new ee.ExtendVisitor,new ee.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){a=t.pluginManager.visitor();for(var u=0;u<2;u++)for(a.first();s=a.get();)s.isPreEvalVisitor?0!==u&&-1!==l.indexOf(s)||(l.push(s),s.run(e)):0!==u&&-1!==o.indexOf(s)||(s.isPreVisitor?o.unshift(s):o.push(s))}n=e.eval(r);for(var c=0;c=t);n++);this.preProcessors.splice(n,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var n;for(n=0;n=t);n++);this.postProcessors.splice(n,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var i=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?i=this.sourceMapURL:this._sourceMapFilename&&(i=this._sourceMapFilename),this.sourceMapURL=i,this.sourceMap=r}return this._css.join("")},t}()}(e=new s(e,t)),e)),o=function(e){return function(){function t(e,t,n){this.less=e,this.rootFilename=n.filename,this.paths=t.paths||[],this.contents={},this.contentsIgnoredChars={},this.mime=t.mime,this.error=null,this.context=t,this.queue=[],this.files={}}return t.prototype.push=function(t,n,i,s,a){var o=this,l=this.context.pluginManager.Loader;this.queue.push(t);var u=function(e,n,i){o.queue.splice(o.queue.indexOf(t),1);var l=i===o.rootFilename;s.optional&&e?(a(null,{rules:[]},!1,null),r.info("The file ".concat(i," was skipped because it was not found and the import was marked optional."))):(o.files[i]||s.inline||(o.files[i]={root:n,options:s}),e&&!o.error&&(o.error=e),a(e,n,l,i))},c={rewriteUrls:this.context.rewriteUrls,entryPath:i.entryPath,rootpath:i.rootpath,rootFilename:i.rootFilename},h=e.getFileManager(t,i.currentDirectory,this.context,e);if(h){var f,p,v=function(e){var t,n=e.filename,r=e.contents.replace(/^\uFEFF/,"");c.currentDirectory=h.getPath(n),c.rewriteUrls&&(c.rootpath=h.join(o.context.rootpath||"",h.pathDiff(c.currentDirectory,c.entryPath)),!h.isPathAbsolute(c.rootpath)&&h.alwaysMakePathsAbsolute()&&(c.rootpath=h.join(c.entryPath,c.rootpath))),c.filename=n;var a=new B.Parse(o.context);a.processImports=!1,o.contents[n]=r,(i.reference||s.reference)&&(c.reference=!0),s.isPlugin?(t=l.evalPlugin(r,a,o,s.pluginArgs,c))instanceof F?u(t,null,n):u(null,t,n):s.inline?u(null,r,n):!o.files[n]||o.files[n].options.multiple||s.multiple?new ae(a,o,c).parse(r,(function(e,t){u(e,t,n)})):u(null,o.files[n].root,n)},d=_(this.context);n&&(d.ext=s.isPlugin?".js":".less"),s.isPlugin?(d.mime="application/javascript",d.syncImport?f=l.loadPluginSync(t,i.currentDirectory,d,e,h):p=l.loadPlugin(t,i.currentDirectory,d,e,h)):d.syncImport?f=h.loadFileSync(t,i.currentDirectory,d,e):p=h.loadFile(t,i.currentDirectory,d,e,(function(e,t){e?u(e):v(t)})),f?f.filename?v(f):u(f):p&&p.then(v,u)}else u({message:"Could not find a file-manager for ".concat(t)})},t}()}(e);var u,c=function(e,t){var n=function(e,i,r){if("function"==typeof i?(r=i,i=E(this.options,{})):i=E(this.options,i||{}),!r){var s=this;return new Promise((function(t,r){n.call(s,e,i,(function(e,n){e?r(e):t(n)}))}))}this.parse(e,i,(function(e,n,i,s){if(e)return r(e);var a;try{a=new t(n,i).toCSS(s)}catch(e){return r(e)}r(null,a)}))};return n}(0,a),h=function(e,t,n){var i=function(e,t,r){if("function"==typeof t?(r=t,t=E(this.options,{})):t=E(this.options,t||{}),!r){var s=this;return new Promise((function(n,r){i.call(s,e,t,(function(e,t){e?r(e):n(t)}))}))}var a,o=void 0,l=new _t(this,!t.reUsePluginManager);if(t.pluginManager=l,a=new B.Parse(t),t.rootFileInfo)o=t.rootFileInfo;else{var u=t.filename||"input",c=u.replace(/[^/\\]*$/,"");(o={filename:u,rewriteUrls:a.rewriteUrls,rootpath:a.rootpath||"",currentDirectory:c,entryPath:c,rootFilename:u}).rootpath&&"/"!==o.rootpath.slice(-1)&&(o.rootpath+="/")}var h=new n(this,a,o);this.importManager=h,t.plugins&&t.plugins.forEach((function(e){var t,n;if(e.fileContent){if(n=e.fileContent.replace(/^\uFEFF/,""),(t=l.Loader.evalPlugin(n,a,h,e.options,e.filename))instanceof F)return r(t)}else l.addPlugin(e)})),new ae(a,h,o).parse(e,(function(e,n){if(e)return r(e);r(null,n,h,t)}),t)};return i}(0,0,o),f=Rt("v".concat("4.4.2")),p={version:[f.major,f.minor,f.patch],data:l,tree:Ke,Environment:s,AbstractFileManager:He,AbstractPluginLoader:Qe,environment:e,visitors:ee,Parser:ae,functions:It(e),contexts:B,SourceMapOutput:n,SourceMapBuilder:i,ParseTree:a,ImportManager:o,render:c,parse:h,LessError:F,transformTree:Ct,utils:O,PluginManager:_t,logger:r},v=function(e){return function(){var t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}},d=Object.create(p);for(var m in p.tree)if("function"==typeof(u=p.tree[m]))d[m.toLowerCase()]=v(u);else for(var g in d[m]=Object.create(null),u)d[m][g.toLowerCase()]=v(u[g]);return p.parse=p.parse.bind(d),p.render=p.render.bind(d),d}var Ot={},$t=function(){};$t.prototype=Object.assign(new He,{alwaysMakePathsAbsolute:function(){return!0},join:function(e,t){return e?this.extractUrlParts(t,e).path:t},doXHR:function(e,t,n,i){var r=new XMLHttpRequest,s=!Pt.isFileProtocol||Pt.fileAsync;function a(t,n,i){t.status>=200&&t.status<300?n(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof i&&i(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),Et.debug("XHR: Getting '".concat(e,"'")),r.open("GET",e,s),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),Pt.isFileProtocol&&!Pt.fileAsync?0===r.status||r.status>=200&&r.status<300?n(r.responseText):i(r.status,e):s?r.onreadystatechange=function(){4==r.readyState&&a(r,n,i)}:a(r,n,i)},supports:function(){return!0},clearFileCache:function(){Ot={}},loadFile:function(e,t,n){t&&!this.isPathAbsolute(e)&&(e=t+e),e=n.ext?this.tryAppendExtension(e,n.ext):e,n=n||{};var i=this.extractUrlParts(e,window.location.href).url,r=this;return new Promise((function(e,t){if(n.useFileCache&&Ot[i])try{var s=Ot[i];return e({contents:s,filename:i,webInfo:{lastModified:new Date}})}catch(e){return t({filename:i,message:"Error loading file ".concat(i," error was ").concat(e.message)})}r.doXHR(i,n.mime,(function(t,n){Ot[i]=t,e({contents:t,filename:i,webInfo:{lastModified:n}})}),(function(e,n){t({type:"File",message:"'".concat(n,"' wasn't found (").concat(e,")"),href:i})}))}))}});var Ft=function(e,t){return Pt=e,Et=t,$t},Vt=function(e){this.less=e};Vt.prototype=Object.assign(new Qe,{loadPlugin:function(e,t,n,i,r){return new Promise((function(s,a){r.loadFile(e,t,n,i).then(s).catch(a)}))}});var Lt=function(t,i,r){return{add:function(s,a){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var n=e.filename||t,s=[],a="".concat(e.type||"Syntax","Error: ").concat(e.message||"There is an error in your .less file"," in ").concat(n),o=function(e,t,n){void 0!==e.extract[t]&&s.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};e.line&&(o(e,0,""),o(e,1,"line"),o(e,2,""),a+=" on line ".concat(e.line,", column ").concat(e.column+1,":\n").concat(s.join("\n"))),e.stack&&(e.extract||r.logLevel>=4)&&(a+="\nStack Trace\n".concat(e.stack)),i.logger.error(a)}(s,a):"function"==typeof r.errorReporting&&r.errorReporting("add",s,a):function(i,s){var a,o,l="less-error-message:".concat(e(s||"")),u=t.document.createElement("div"),c=[],h=i.filename||s,f=h.match(/([^/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",o="".concat(i.type||"Syntax","Error: ").concat(i.message||"There is an error in your .less file")+'
in ').concat(f," ");var p=function(e,t,n){void 0!==e.extract[t]&&c.push('
{content}'.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};i.line&&(p(i,0,""),p(i,1,"line"),p(i,2,""),o+="on line ".concat(i.line,", column ").concat(i.column+1,":")),i.stack&&(i.extract||r.logLevel>=4)&&(o+="
Stack Trace".concat(i.stack.split("\n").slice(1).join("
"))),u.innerHTML=o,n(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(a=setInterval((function(){var e=t.document,n=e.body;n&&(e.getElementById(l)?n.replaceChild(u,e.getElementById(l)):n.insertBefore(u,n.firstChild),clearInterval(a))}),10))}(s,a)},remove:function(n){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",n):function(n){var i=t.document.getElementById("less-error-message:".concat(e(n)));i&&i.parentNode.removeChild(i)}(n)}}},jt={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var Dt in window.less)Object.prototype.hasOwnProperty.call(window.less,Dt)&&(jt[Dt]=window.less[Dt]);!function(e,n){t(n,i(e)),void 0===n.isFileProtocol&&(n.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),n.async=n.async||!1,n.fileAsync=n.fileAsync||!1,n.poll=n.poll||(n.isFileProtocol?1e3:1500),n.env=n.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||n.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(n.dumpLineNumbers=r[1]),void 0===n.useFileCache&&(n.useFileCache=!0),void 0===n.onReady&&(n.onReady=!0),n.relativeUrls&&(n.rewriteUrls="all")}(window,jt),jt.plugins=jt.plugins||[],window.LESS_PLUGINS&&(jt.plugins=jt.plugins.concat(window.LESS_PLUGINS));var Nt,Bt,Ut,qt=function(e,i){var r=e.document,s=Mt();s.options=i;var a=s.environment,o=Ft(i,s.logger),l=new o;a.addFileManager(l),s.FileManager=o,s.PluginLoader=Vt,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var n=0;n0&&l.childNodes.length>0&&o.firstChild.nodeValue===l.firstChild.nodeValue);const c=t.getElementsByTagName("head")[0];if(null===o||!1===a){const e=n&&n.nextSibling||null;e?e.parentNode.insertBefore(l,e):c.appendChild(l)}if(o&&!1===a&&o.parentNode.removeChild(o),l.styleSheet)try{l.styleSheet.cssText=i}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},n=function(e){const t=e.document;return t.currentScript||(()=>{const e=t.getElementsByTagName("script");return e[e.length-1]})()},s={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(let t=0;t=0;s--){const a=o[s];if(a[r?"supportsSync":"supports"](e,t,i,n))return a}return null}addFileManager(e){this.fileManagers.push(e)}clearFileManagers(){this.fileManagers=[]}}var o={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},a={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:o,unitConversions:a};class c{constructor(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null}get currentFileInfo(){return this.fileInfo()}get index(){return this.getIndex()}setParent(e,t){function i(e){e&&e instanceof c&&(e.parent=t)}Array.isArray(e)?e.forEach(i):i(e)}getIndex(){return this._index||this.parent&&this.parent.getIndex()||0}fileInfo(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}}isRulesetLike(){return!1}toCSS(e){const t=[];return this.genCSS(e,{add:function(e,i,n){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")}genCSS(e,t){t.add(this.value)}accept(e){this.value=e.visit(this.value)}eval(){return this}_operate(e,t,i,n){switch(t){case"+":return i+n;case"-":return i-n;case"*":return i*n;case"/":return i/n}}fround(e,t){const i=e&&e.numPrecision;return i?Number((t+2e-16).toFixed(i)):t}static compare(e,t){if(e.compare&&"Quoted"!==t.type&&"Anonymous"!==t.type)return e.compare(t);if(t.compare)return-t.compare(e);if(e.type===t.type){if(e=e.value,t=t.value,!Array.isArray(e))return e===t?0:void 0;if(e.length===t.length){for(let i=0;it?1:void 0}blocksVisibility(){return void 0===this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks}addVisibilityBlock(){void 0===this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1}removeVisibilityBlock(){void 0===this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1}ensureVisibility(){this.nodeVisible=!0}ensureInvisibility(){this.nodeVisible=!1}isVisible(){return this.nodeVisible}visibilityInfo(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}}copyVisibilityInfo(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)}}const u=function(e,t,i){const n=this;Array.isArray(e)?this.rgb=e:e.length>=6?(this.rgb=[],e.match(/.{2}/g).map((function(e,t){t<3?n.rgb.push(parseInt(e,16)):n.alpha=parseInt(e,16)/255}))):(this.rgb=[],e.split("").map((function(e,t){t<3?n.rgb.push(parseInt(e+e,16)):n.alpha=parseInt(e+e,16)/255}))),this.alpha=this.alpha||("number"==typeof t?t:1),void 0!==i&&(this.value=i)};function h(e,t){return Math.min(Math.max(e,0),t)}function f(e){return"#"+e.map((function(e){return((e=h(Math.round(e),255))<16?"0":"")+e.toString(16)})).join("")}u.prototype=Object.assign(new c,{type:"Color",luma(){let e=this.rgb[0]/255,t=this.rgb[1]/255,i=this.rgb[2]/255;return e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4),t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4),i=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4),.2126*e+.7152*t+.0722*i},genCSS(e,t){t.add(this.toCSS(e))},toCSS(e,t){const i=e&&e.compress&&!t;let n,s,r,o=[];if(s=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))s<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=s<1?"hsla":"hsl"}else s<1&&(r="rgba");switch(r){case"rgba":o=this.rgb.map((function(e){return h(Math.round(e),255)})).concat(h(s,1));break;case"hsla":o.push(h(s,1));case"hsl":n=this.toHSL(),o=[this.fround(e,n.h),this.fround(e,100*n.s)+"%",this.fround(e,100*n.l)+"%"].concat(o)}if(r)return`${r}(${o.join(","+(i?"":" "))})`;if(n=this.toRGB(),i){const e=n.split("");e[1]===e[2]&&e[3]===e[4]&&e[5]===e[6]&&(n=`#${e[1]}${e[3]}${e[5]}`)}return n},operate(e,t,i){const n=new Array(3),s=this.alpha*(1-i.alpha)+i.alpha;for(let s=0;s<3;s++)n[s]=this._operate(e,t,this.rgb[s],i.rgb[s]);return new u(n,s)},toRGB(){return f(this.rgb)},toHSL(){const e=this.rgb[0]/255,t=this.rgb[1]/255,i=this.rgb[2]/255,n=this.alpha,s=Math.max(e,t,i),r=Math.min(e,t,i);let o,a;const l=(s+r)/2,c=s-r;if(s===r)o=a=0;else{switch(a=l>.5?c/(2-s-r):c/(s+r),s){case e:o=(t-i)/c+(tI(e,t));if("Object"!==x(i=e)||i.constructor!==Object||Object.getPrototypeOf(i)!==Object.prototype)return e;var i;return[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)].reduce((i,n)=>{if(S(t.props)&&!t.props.includes(n))return i;return function(e,t,i,n,s){const r={}.propertyIsEnumerable.call(n,t)?"enumerable":"nonenumerable";"enumerable"===r&&(e[t]=i),s&&"nonenumerable"===r&&Object.defineProperty(e,t,{value:i,enumerable:!1,writable:!0,configurable:!0})}(i,n,I(e[n],t),e,t.nonenumerable),i},{})}function C(e,t){let i=e+1,n=null,s=-1;for(;--i>=0&&"\n"!==t.charAt(i);)s++;return"number"==typeof e&&(n=(t.slice(0,e).match(/\n/g)||"").length),{line:n,column:s}}function k(e){let t;const i=e.length,n=new Array(i);for(t=0;t|Function):(\d+):(\d+)/,O=function(e,t,i){Error.call(this);const n=e.filename||i;if(this.message=e.message,this.stack=e.stack,this.type=e.type||"Syntax",t&&n){const i=t.contents[n],r=C(e.index,i);var s=r.line;const o=r.column,a=e.call&&C(e.call,i).line,l=i?i.split("\n"):"";if(this.filename=n,this.index=e.index,this.line="number"==typeof s?s+1:null,this.column=o,!this.line&&this.stack){const t=this.stack.match(R),i=new Function("a","throw new Error()");let n=0;try{i()}catch(e){const t=e.stack.match(R);n=1-parseInt(t[2])}t&&(t[2]&&(this.line=parseInt(t[2])+n),t[3]&&(this.column=parseInt(t[3])))}this.callLine=a+1,this.callExtract=l[a],this.extract=[l[this.line-2],l[this.line-1],l[this.line]]}};if(void 0===Object.create){const e=function(){};e.prototype=Error.prototype,O.prototype=new e}else O.prototype=Object.create(Error.prototype);O.prototype.constructor=O,O.prototype.toString=function(e){e=e||{};const t=(this.type??"").toLowerCase().includes("warning"),i=t?this.type:this.type+"Error",n=t?"yellow":"red";let s="";const r=this.extract||[];let o=[],a=function(e){return e};if(e.stylize){const t=typeof e.stylize;if("function"!==t)throw Error(`options.stylize should be a function, got a ${t}!`);a=e.stylize}if(null!==this.line){if(t||"string"!=typeof r[0]||o.push(a(`${this.line-1} ${r[0]}`,"grey")),"string"==typeof r[1]){let e=this.line+" ";r[1]&&(e+=r[1].slice(0,this.column)+a(a(a(r[1].slice(this.column,this.column+1),"bold")+r[1].slice(this.column+1),"red"),"inverse")),o.push(e)}t||"string"!=typeof r[2]||o.push(a(`${this.line+1} ${r[2]}`,"grey")),o=o.join("\n")+a("","reset")+"\n"}return s+=a(`${i}: ${this.message}`,n),this.filename&&(s+=a(" in ",n)+this.filename),this.line&&(s+=a(` on line ${this.line}, column ${this.column+1}:`,"grey")),s+="\n"+o,this.callLine&&(s+=a("from ",n)+(this.filename||"")+"/n",s+=`${a(this.callLine,"grey")} ${this.callExtract}/n`),s};const F={visitDeeper:!0};let V=!1;function L(e){return e}class D{constructor(e){this._implementation=e,this._visitInCache={},this._visitOutCache={},V||(!function e(t,i){let n,s;for(n in t)switch(s=t[n],typeof s){case"function":s.prototype&&s.prototype.type&&(s.prototype.typeIndex=i++);break;case"object":i=e(s,i)}return i}(ze,1),V=!0)}visit(e){if(!e)return e;const t=e.typeIndex;if(!t)return e.value&&e.value.typeIndex&&this.visit(e.value),e;const i=this._implementation;let n=this._visitInCache[t],s=this._visitOutCache[t];const r=F;let o;if(r.visitDeeper=!0,n||(o="visit"+e.type,n=i[o]||L,s=i[o+"Out"]||L,this._visitInCache[t]=n,this._visitOutCache[t]=s),n!==L){const t=n.call(i,e,r);e&&i.isReplacing&&(e=t)}if(r.visitDeeper&&e)if(e.length)for(let t=0,i=e.length;tv.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},j.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===b?T:q)(e)},j.Eval.prototype.rewritePath=function(e,t){let i;return t=t||"",i=this.normalizePath(t+e),T(e)&&q(t)&&!1===T(i)&&(i="./"+i),i},j.Eval.prototype.normalizePath=function(e){const t=e.split("/").reverse();let i;for(e=[];0!==t.length;)switch(i=t.pop(),i){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(i):e.pop();break;default:e.push(i)}return e.join("/")};class z{constructor(e){this.imports=[],this.variableImports=[],this._onSequencerEmpty=e,this._currentDepth=0}addImport(e){const t=this,i={callback:e,args:null,isReady:!1};return this.imports.push(i),function(){i.args=Array.prototype.slice.call(arguments,0),i.isReady=!0,t.tryRun()}}addVariableImport(e){this.variableImports.push(e)}tryRun(){this._currentDepth++;try{for(;;){for(;this.imports.length>0;){const e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;const e=this.variableImports[0];this.variableImports=this.variableImports.slice(1),e()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()}}const G=function(e,t){this._visitor=new D(this),this._importer=e,this._finish=t,this.context=new j.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new z(this._onSequencerEmpty.bind(this))};G.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){const i=e.options.inline;if(!e.css||i){const t=new j.Eval(this.context,k(this.context.frames)),i=t.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,t,i)):this.processImportNode(e,t,i)}t.visitDeeper=!1},processImportNode:function(e,t,i){let n;const s=e.options.inline;try{n=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!n||n.css&&!s)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{n.options.multiple&&(t.importMultiple=!0);const s=void 0===n.css;for(let t=0;t0)for(i=0;i-1e-6&&(n=i.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===i&&this.unit.isLength())return void t.add(n);i>0&&i<1&&(n=n.slice(1))}t.add(n),this.unit.genCSS(e,t)},operate(e,t,i){let n=this._operate(e,t,this.value,i.value),s=this.unit.clone();if("+"===t||"-"===t)if(0===s.numerator.length&&0===s.denominator.length)s=i.unit.clone(),this.unit.backupUnit&&(s.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===s.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==s.toString())throw new Error(`Incompatible units. Change the units or use the unit function. Bad units: '${s.toString()}' and '${i.unit.toString()}'.`);n=this._operate(e,t,this.value,i.value)}else"*"===t?(s.numerator=s.numerator.concat(i.unit.numerator).sort(),s.denominator=s.denominator.concat(i.unit.denominator).sort(),s.cancel()):"/"===t&&(s.numerator=s.numerator.concat(i.unit.denominator).sort(),s.denominator=s.denominator.concat(i.unit.numerator).sort(),s.cancel());return new X(n,s)},compare(e){let t,i;if(e instanceof X){if(this.unit.isEmpty()||e.unit.isEmpty())t=this,i=e;else if(t=this.unify(),i=e.unify(),0!==t.unit.compare(i.unit))return;return c.numericCompare(t.value,i.value)}},unify(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},convertTo(e){let t=this.value;const i=this.unit.clone();let n,s,r,o,l,c={};if("string"==typeof e){for(n in a)a[n].hasOwnProperty(e)&&(c={},c[n]=e);e=c}for(s in l=function(e,i){return r.hasOwnProperty(e)?(i?t/=r[e]/r[o]:t*=r[e]/r[o],o):e},e)e.hasOwnProperty(s)&&(o=e[s],r=a[s],i.map(l));return i.cancel(),new X(t,i)}});const Y=function(e,t,i,n,s,r){this.value=e,this._index=t,this._fileInfo=i,this.mapLines=n,this.rulesetLike=void 0!==s&&s,this.allowRoot=!0,this.copyVisibilityInfo(r)};Y.prototype=Object.assign(new c,{type:"Anonymous",eval(){return new Y(this.value,this._index,this._fileInfo,this.mapLines,this.rulesetLike,this.visibilityInfo())},compare(e){return e.toCSS&&this.toCSS()===e.toCSS()?0:void 0},isRulesetLike(){return this.rulesetLike},genCSS(e,t){this.nodeVisible=Boolean(this.value),this.nodeVisible&&t.add(this.value,this._fileInfo,this._index,this.mapLines)}});const ee=function(e,t){if(this.value=e,this.noSpacing=t,!e)throw new Error("Expression requires an array parameter")};ee.prototype=Object.assign(new c,{type:"Expression",accept(e){this.value=e.visitArray(this.value)},eval(e){const t=this.noSpacing;let i;const n=e.isMathOn(),s=this.parens;let r=!1;return s&&e.inParenthesis(),this.value.length>1?i=new ee(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(r=!0),i=this.value[0].eval(e)):i=this,s&&e.outOfParenthesis(),!this.parens||!this.parensInOp||n||r||i instanceof X||(i=new p(i)),i.noSpacing=i.noSpacing||t,i},genCSS(e,t){for(let i=0;i{if(e.length>0){const t=e[0];let i=[];const n=[new ee(i)];e.forEach(e=>{"+"===e.merge&&i.length>0&&n.push(new ee(i=[])),i.push(e.value),t.important=t.important||e.important}),t.value=new te(n)}})}te.prototype=Object.assign(new c,{type:"Value",accept(e){this.value&&(this.value=e.visitArray(this.value))},eval(e){return 1===this.value.length?this.value[0].eval(e):new te(this.value.map((function(t){return t.eval(e)})))},genCSS(e,t){let i;for(i=0;ie.isVisible()))}isEmpty(e){return!e||!e.rules||0===e.rules.length}hasVisibleSelector(e){return!(!e||!e.paths)&&e.paths.length>0}resolveVisibility(e){if(!e.blocksVisibility()){if(this.isEmpty(e))return;return e}const t=e.rules[0];if(this.keepOnlyVisibleChilds(t),!this.isEmpty(t))return e.ensureVisibility(),e.removeVisibilityBlock(),e}isVisibleRuleset(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))}}const se=function(e){this._visitor=new D(this),this._context=e,this.utils=new ne(e)};se.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){const i=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,i)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){const i=function(e){const t=e.rules;return function(e){const t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,i)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){const t=new ze.Comment(`/* ${e.toCSS(this._context).replace(/\n/g,"")} */\n`);return t.debugInfo=e.debugInfo,this._visitor.visit(t)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(let i=0;i0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),n.splice(0,0,e)),1===n.length?n[0]:n},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter(e=>{let t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new ze.Combinator("")),t=0;t=0;i--){let n=e[i];if(n instanceof ze.Declaration)if(Object.prototype.hasOwnProperty.call(t,n.name)){let s=t[n.name];if(!Array.isArray(s)){const e=s.toCSS(this._context);s=t[n.name]=[e]}const r=n.toCSS(this._context);-1!==s.indexOf(r)?e.splice(i,1):s.push(r)}else t[n.name]=n}},_mergeRules:ie};var re={Visitor:D,ImportVisitor:G,MarkVisibleSelectorsVisitor:class{constructor(e){this.visible=e}run(e){this.visit(e)}visitArray(e){if(!e)return e;const t=e.length;let i;for(i=0;i=0||(c=[h.selfSelectors[0]],r=l.findMatch(u,c),r.length&&(u.hasFoundMatches=!0,u.selfSelectors.forEach((function(e){const t=h.visibilityInfo();a=l.extendSelector(r,c,e,u.isVisible()),f=new ze.Extend(h.selector,h.option,0,h.fileInfo(),t),f.selfSelectors=a,a[a.length-1].extendList=[f],o.push(f),f.ruleset=h.ruleset,f.parent_ids=f.parent_ids.concat(h.parent_ids,u.parent_ids),h.firstExtendOnThisSelectorPath&&(f.firstExtendOnThisSelectorPath=!0,h.ruleset.paths.push(a))}))));if(o.length){if(this.extendChainCount++,i>100){let e="{unable to calculate}",t="{unable to calculate}";try{e=o[0].selfSelectors[0].toCSS(),t=o[0].selector.toCSS()}catch(e){}throw{message:`extend circular reference detected. One of the circular extends is currently:${e}:extend(${t})`}}return o.concat(l.doExtendChaining(o,t,i+1))}return o}visitDeclaration(e,t){t.visitDeeper=!1}visitMixinDefinition(e,t){t.visitDeeper=!1}visitSelector(e,t){t.visitDeeper=!1}visitRuleset(e,t){if(e.root)return;let i;const n=this.allExtendsStack[this.allExtendsStack.length-1],s=[],r=e.paths,o=r.length;for(let t=0;t0&&l[u.matched].combinator.value!==o?u=null:u.matched++,u&&(u.finished=u.matched===l.length,u.finished&&!e.allowAfter&&(s+1c&&u>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[c].elements.slice(u)),u=0,c++),l=r.elements.slice(u,a.index).concat([o]).concat(i.elements.slice(1)),c===a.pathIndex&&s>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(c,a.pathIndex)),h.push(new ze.Selector(l))),c=a.endPathIndex,u=a.endPathElementIndex,u>=t[c].elements.length&&(u=0,c++);return c0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[c].elements.slice(u)),c++),h=h.concat(t.slice(c,t.length)),h=h.map((function(e){const t=e.createDerived(e.elements);return n?t.ensureVisibility():t.ensureInvisibility(),t})),h}visitMedia(e,t){let i=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);i=i.concat(this.doExtendChaining(i,e.allExtends)),this.allExtendsStack.push(i)}visitMediaOut(e){const t=this.allExtendsStack.length-1;this.allExtendsStack.length=t}visitAtRule(e,t){let i=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);i=i.concat(this.doExtendChaining(i,e.allExtends)),this.allExtendsStack.push(i)}visitAtRuleOut(e){const t=this.allExtendsStack.length-1;this.allExtendsStack.length=t}},JoinSelectorVisitor:class{constructor(){this.contexts=[[]],this._visitor=new D(this)}run(e){return this._visitor.visit(e)}visitDeclaration(e,t){t.visitDeeper=!1}visitMixinDefinition(e,t){t.visitDeeper=!1}visitRuleset(e,t){const i=this.contexts[this.contexts.length-1],n=[];let s;this.contexts.push(n),e.root||(s=e.selectors,s&&(s=s.filter((function(e){return e.getIsOutput()})),e.selectors=s.length?s:s=null,s&&e.joinSelectors(n,i,s)),s||(e.rules=null),e.paths=n)}visitRulesetOut(e){this.contexts.length=this.contexts.length-1}visitMedia(e,t){const i=this.contexts[this.contexts.length-1];e.rules[0].root=0===i.length||i[0].multiMedia}visitAtRule(e,t){const i=this.contexts[this.contexts.length-1];e.declarations&&e.declarations.length?e.declarations[0].root=0===i.length||i[0].multiMedia:e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===i.length||null)}},ToCSSVisitor:se};var oe=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){Object.keys(e).forEach(t=>{this.add(t,e[t])})},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null);const ae={queryInParens:!0},le={queryInParens:!0};class ce{constructor(){this._counts={}}shouldWarn(e){if(!e)return!0;const t=(this._counts[e]||0)+1;return this._counts[e]=t,t<=5}summarize(e){for(const t of Object.keys(this._counts)){const i=this._counts[t]-5;i>0&&e.warn(`${i} repetitive "${t}" deprecation warning(s) omitted.`)}}}const ue=function e(t,i,n,r){let o;r=r||0;const a=(()=>{let e,t;const i=[];let n,s,r,o,a;const l={};function c(i){const n=l.i,s=t,u=l.i-a,h=l.i+o.length-u,f=l.i+=i,p=e;let d,m,g;for(;l.i=0){g={index:l.i,text:p.slice(l.i,e+2),isLineComment:!1},l.i+=g.text.length-1,l.commentStore.push(g);continue}}break}if(32!==d&&10!==d&&9!==d&&13!==d)break}if(o=o.slice(i+l.i-f+u),a=l.i,!o.length){if(t{a=l.i,i.push({current:o,i:l.i,j:t})},l.restore=e=>{(l.i>n||l.i===n&&e&&!s)&&(n=l.i,s=e);const r=i.pop();o=r.current,a=l.i=r.i,t=r.j},l.forget=()=>{i.pop()},l.isWhitespace=t=>{const i=l.i+(t||0),n=e.charCodeAt(i);return 32===n||13===n||9===n||10===n},l.$re=e=>{l.i>a&&(o=o.slice(l.i-a),a=l.i);const t=e.exec(o);return t?(c(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=t=>e.charAt(l.i)!==t?null:(c(1),t),l.$peekChar=t=>e.charAt(l.i)!==t?null:t,l.$str=t=>{const i=t.length;for(let n=0;n{const i=t||l.i,n=e.charAt(i);if("'"!==n&&'"'!==n)return;const s=e.length,r=i;for(let i=1;i+r{let i="",n=null,s=!1,r=0;const o=[],a=[],u=e.length,h=l.i;let f,p=l.i,d=l.i,m=!0;f="string"==typeof t?e=>e===t:e=>t.test(e);do{let t=e.charAt(d);if(0===r&&f(t))n=e.slice(p,d),n?a.push(n):a.push(" "),n=a,c(d-h),m=!1;else{if(s){"*"===t&&"/"===e.charAt(d+1)&&(d++,r--,s=!1),d++;continue}switch(t){case"\\":d++,t=e.charAt(d),a.push(e.slice(p,d+1)),p=d+1;break;case"/":"*"===e.charAt(d+1)&&(d++,s=!0,r++);break;case"'":case'"':i=l.$quoted(d),i?(a.push(e.slice(p,d),i),d+=i[1].length-1,p=d+1):(c(d-h),n=t,m=!1);break;case"{":o.push("}"),r++;break;case"(":o.push(")"),r++;break;case"[":o.push("]"),r++;break;case"}":case")":case"]":{const e=o.pop();t===e?r--:(c(d-h),n=e,m=!1)}}d++,d>u&&(m=!1)}}while(m);return n||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=t=>{if("string"==typeof t){for(let i=0;ie.charAt(l.i)===t,l.currentChar=()=>e.charAt(l.i),l.prevChar=()=>e.charAt(l.i-1),l.getInput=()=>e,l.peekNotNumeric=()=>{const t=e.charCodeAt(l.i);return t>57||t<43||47===t||44===t},l.start=i=>{e=i,l.i=t=a=n=0,r=[i],o=r[0],c(0)},l.end=()=>{let t;const i=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l})();function l(e,t){throw new O({index:a.i,filename:n.filename,type:t||"Syntax",message:e},i)}const c=new ce;function u(e,r,o,l){t.quiet||l&&t.quietDeprecations||l&&!c.shouldWarn(l)||s.warn(new O({index:r??a.i,filename:n.filename,type:o?o.toUpperCase()+" WARNING":"WARNING",message:e},i).toString())}function h(e,t){const i=e instanceof Function?e.call(o):a.$re(e);if(i)return i;l(t||("string"==typeof e?`expected '${e}' got '${a.currentChar()}'`:"unexpected token"))}function f(e,t){if(a.$char(e))return e;l(t||`expected '${e}' got '${a.currentChar()}'`)}function p(e){const t=n.filename;return{lineNumber:C(e,a.getInput()).line+1,fileName:t}}return{parserInput:a,imports:i,fileInfo:n,parseNode:function(e,t,s){let l;const c=[],u=a;try{u.start(e);for(let e,i=0;e=t[i];i++)l=o[e](),c.push(l||null);u.end().isFinished?s(null,c):s(!0,null)}catch(e){throw new O({index:e.index+r,message:e.message},i,n.filename)}},parse:function(s,r,c){let u,h,f,p,d=null,m="";if(c&&c.disablePluginRule&&(o.plugin=function(){a.$re(/^@plugin?\s+/)&&l("@plugin statements are not allowed when disablePluginRule is set to true")}),h=c&&c.globalVars?e.serializeVars(c.globalVars)+"\n":"",f=c&&c.modifyVars?"\n"+e.serializeVars(c.modifyVars):"",t.pluginManager){const e=t.pluginManager.getPreProcessors();for(let r=0;r(e=d||e||i.error)?(e instanceof O||(e=new O(e,i,n.filename)),r(e)):r(null,u);if(!1===t.processImports)return v();new re.ImportVisitor(i,v).run(u)},parsers:o={primary:function(){const e=this.mixin;let t,i=[];for(;;){for(;t=this.comment(),t;)i.push(t);if(a.finished)break;if(a.peek("}"))break;if(t=this.extendRule(),t)i=i.concat(t);else if(t=e.definition()||this.declaration()||e.call(!1,!1)||this.ruleset()||this.variableCall()||this.entities.call()||this.atrule(),t)i.push(t);else{let e=!1;for(;a.$char(";");)e=!0;if(!e)break}}return i},comment:function(){if(a.commentStore.length){const e=a.commentStore.shift();return new ze.Comment(e.text,e.isLineComment,e.index+r,n)}},entities:{mixinLookup:function(){return o.mixin.call(!0,!0)},quoted:function(e){let t;const i=a.i;let s=!1;if(a.save(),a.$char("~"))s=!0;else if(e)return void a.restore();if(t=a.$quoted(),t)return a.forget(),new ze.Quoted(t.charAt(0),t.slice(1,-1),s,i+r,n);a.restore()},keyword:function(){const e=a.$char("%")||a.$re(/^\[?(?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\]?/);if(e)return ze.Color.fromKeyword(e)||new ze.Keyword(e)},call:function(){let e,t,i;const s=a.i;if(!a.peek(/^url\(/i))if(a.save(),e=a.$re(/^([\w-]+|%|~|progid:[\w.]+)\(/),e){if(e=e[1],i=this.customFuncCall(e),i&&(t=i.parse(),t&&i.stop))return a.forget(),t;if(t=this.arguments(t),a.$char(")"))return a.forget(),new ze.Call(e,t,s+r,n);a.restore("Could not parse call arguments or missing ')'")}else a.forget()},declarationCall:function(){let e,t;const i=a.i;if(a.save(),e=a.$re(/^[\w]+\(/),!e)return void a.forget();if(e=e.substring(0,e.length-1),/^(and|or|not|only|layer)$/i.test(e))return void a.restore();let s,o=this.ruleProperty();if(o&&(s=this.value()),o&&s&&(t=[new ze.Declaration(o,s,null,null,a.i+r,n,!0)]),a.$char(")"))return a.forget(),new ze.Call(e,t,i+r,n);a.restore("Could not parse call arguments or missing ')'")},customFuncCall:function(e){return{alpha:t(o.ieAlpha,!0),boolean:t(i),if:t(i)}[e.toLowerCase()];function t(e,t){return{parse:e,stop:t}}function i(){return[h(o.condition,"expected condition")]}},arguments:function(e){let t=e||[];const i=[];let n,s;for(a.save();;){if(e)e=!1;else{if(s=o.detachedRuleset()||this.assignment()||o.expression(),!s)break;s.value&&1==s.value.length&&(s=s.value[0]),t.push(s)}a.$char(",")||(a.$char(";")||n)&&(n=!0,s=t.length<1?t[0]:new ze.Value(t),i.push(s),t=[])}return a.forget(),n?i:t},literal:function(){return this.dimension()||this.color()||this.quoted()||this.unicodeDescriptor()},assignment:function(){let e,t;if(a.save(),e=a.$re(/^\w+(?=\s?=)/i),e)if(a.$char("=")){if(t=o.entity(),t)return a.forget(),new ze.Assignment(e,t);a.restore()}else a.restore();else a.restore()},url:function(){let e;const t=a.i;if(a.autoCommentAbsorb=!1,a.$str("url("))return e=this.quoted()||this.variable()||this.property()||a.$re(/^(?:(?:\\[()'"])|[^()'"])+/)||"",a.autoCommentAbsorb=!0,f(")"),new ze.URL(void 0!==e.value||e instanceof ze.Variable||e instanceof ze.Property?e:new ze.Anonymous(e,t),t+r,n);a.autoCommentAbsorb=!0},variable:function(){let e,t;const i=a.i;if(a.save(),"@"===a.currentChar()&&(t=a.$re(/^@@?[\w-]+/))){if(e=a.currentChar(),"("===e&&!a.prevChar().match(/^\s/)||"["===e&&!a.prevChar().match(/^\s/)){const e=o.variableCall(t);if(e)return a.forget(),e}return a.forget(),new ze.Variable(t,i+r,n)}a.restore()},variableCurly:function(){let e;const t=a.i;if("@"===a.currentChar()&&(e=a.$re(/^@\{([\w-]+)\}/)))return new ze.Variable("@"+e[1],t+r,n)},property:function(){let e;const t=a.i;if("$"===a.currentChar()&&(e=a.$re(/^\$[\w-]+/)))return new ze.Property(e,t+r,n)},color:function(){let e;if(a.save(),"#"===a.currentChar()&&(e=a.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\w.#[])?/))&&!e[2])return a.forget(),new ze.Color(e[1],void 0,e[0]);a.restore()},colorKeyword:function(){a.save();const e=a.autoCommentAbsorb;a.autoCommentAbsorb=!1;const t=a.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);if(a.autoCommentAbsorb=e,!t)return void a.forget();a.restore();const i=ze.Color.fromKeyword(t);return i?(a.$str(t),i):void 0},dimension:function(){if(a.peekNotNumeric())return;const e=a.$re(/^([+-]?\d*\.?\d+)(%|[a-z_]+)?/i);return e?new ze.Dimension(e[1],e[2]):void 0},unicodeDescriptor:function(){let e;if(e=a.$re(/^U\+[0-9a-fA-F?]+(-[0-9a-fA-F?]+)?/),e)return new ze.UnicodeDescriptor(e[0])},javascript:function(){let e;const t=a.i;a.save();const i=a.$char("~");if(a.$char("`")){if(e=a.$re(/^[^`]*`/),e)return u("Inline JavaScript evaluation (backtick expressions) is deprecated and will be removed in Less 5.x. Use Less functions or custom plugins instead.",t,"DEPRECATED","js-eval"),a.forget(),new ze.JavaScript(e.slice(0,-1),Boolean(i),t+r,n);a.restore("invalid javascript definition")}else a.restore()}},variable:function(){let e;if("@"===a.currentChar()&&(e=a.$re(/^(@[\w-]+)\s*:/)))return e[1]},variableCall:function(e){let t;const i=a.i,s=!!e;let r=e;if(a.save(),r||"@"===a.currentChar()&&(r=a.$re(/^(@[\w-]+)(\(\s*\))?/))){if(t=this.mixin.ruleLookups(),!t&&(s&&"()"!==a.$str("()")||"()"!==r[2]))return void a.restore("Missing '[...]' lookup in variable call");s||(r=r[1]);const e=new ze.VariableCall(r,i,n);return!s&&o.end()?(a.forget(),e):(a.forget(),new ze.NamespaceValue(e,t,i,n))}a.restore()},extend:function(e){let t,i;const s=a.i;let o,c,f;if(a.$str(e?"&:extend(":":extend(")){do{o=null,t=null;let e=!0;for(;!(o=a.$re(/^(!?all)(?=\s*(\)|,))/))&&(i=this.element(),i);)!e&&i.combinator.value&&u("Targeting complex selectors can have unexpected behavior, and this behavior may change in the future.",s),e=!1,t?t.push(i):t=[i];o=o&&o[1],t||l("Missing target selector for :extend()."),f=new ze.Extend(new ze.Selector(t),o,s+r,n),c?c.push(f):c=[f]}while(a.$char(","));return h(/^\)/),e&&h(/^;/),c}},extendRule:function(){return this.extend(!0)},mixin:{call:function(e,t){const i=a.currentChar();let s,l=!1;const c=a.i;let h,p,d,m,g=!1;if("."===i||"#"===i){if(a.save(),h=this.elements(),h){if(m=a.i,g=a.isWhitespace(-1),a.$char("(")&&(p=this.args(!0).args,f(")"),d=!0,g&&u("Whitespace between a mixin name and parentheses for a mixin call is deprecated",m,"DEPRECATED","mixin-call-whitespace")),!1!==t&&(s=this.ruleLookups()),!0===t&&!s)return void a.restore();if(e&&!s&&!d)return void a.restore();if(!e&&o.important()&&(l=!0),e||o.end()){a.forget();const e=new ze.mixin.Call(h,p,c+r,n,!s&&l);return s?new ze.NamespaceValue(e,s):(d||u("Calling a mixin without parentheses is deprecated",m,"DEPRECATED","mixin-call-no-parens"),e)}}a.restore()}},elements:function(){let e,t,i,s,o;const l=/^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;for(;o=a.i,t=a.$re(l),t;)s=new ze.Element(i,t,!1,o+r,n),e?e.push(s):e=[s],i=a.$char(">");return e},args:function(e){const t=o.entities,i={args:null,variadic:!1};let n=[];const s=[],r=[];let c,u,h,f,p,d,m,g=!0;for(a.save();;){if(e)d=o.detachedRuleset()||o.expression();else{if(a.commentStore.length=0,a.$str("...")){i.variadic=!0,a.$char(";")&&!c&&(c=!0),(c?s:r).push({variadic:!0});break}d=t.variable()||t.property()||t.literal()||t.keyword()||this.call(!0)}if(!d||!g)break;f=null,d.throwAwayComments&&d.throwAwayComments(),p=d;let v=null;if(e?d.value&&1==d.value.length&&(v=d.value[0]):v=d,v&&(v instanceof ze.Variable||v instanceof ze.Property))if(a.$char(":")){if(n.length>0&&(c&&l("Cannot mix ; and , as delimiter types"),u=!0),p=o.detachedRuleset()||o.expression(),!p){if(!e)return a.restore(),i.args=[],i;l("could not understand value for named argument")}f=h=v.name}else if(a.$str("...")){if(!e){i.variadic=!0,a.$char(";")&&!c&&(c=!0),(c?s:r).push({name:d.name,variadic:!0});break}m=!0}else e||(h=f=v.name,p=null);p&&n.push(p),r.push({name:f,value:p,expand:m}),a.$char(",")?g=!0:(g=";"===a.$char(";"),(g||c)&&(u&&l("Cannot mix ; and , as delimiter types"),c=!0,n.length>1&&(p=new ze.Value(n)),s.push({name:h,value:p,expand:m}),h=null,n=[],u=!1))}return a.forget(),i.args=c?s:r,i},definition:function(){let e,t,i,n,s=[],r=!1;if(!("."!==a.currentChar()&&"#"!==a.currentChar()||a.peek(/^[^{]*\}/)))if(a.save(),t=a.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/),t){e=t[1];const l=this.args(!1);if(s=l.args,r=l.variadic,!a.$char(")"))return void a.restore("Missing closing ')'");if(a.commentStore.length=0,a.$str("when")&&(n=h(o.conditions,"expected condition")),i=o.block(),i)return a.forget(),new ze.mixin.Definition(e,s,i,n,r);a.restore()}else a.restore()},ruleLookups:function(){let e;const t=[];if("["===a.currentChar()){for(;;){if(a.save(),e=this.lookupValue(),!e&&""!==e){a.restore();break}t.push(e),a.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(a.save(),!a.$char("["))return void a.restore();const e=a.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(a.$char("]"))return e||""===e?(a.forget(),e):void a.restore();a.restore()}},entity:function(){const e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return a.$char(";")||a.peek("}")},ieAlpha:function(){let e;if(a.$re(/^opacity=/i))return e=a.$re(/^\d+/),e||(e=h(o.entities.variable,"Could not parse alpha"),e=`@{${e.name.slice(1)}}`),f(")"),new ze.Quoted("",`alpha(opacity=${e})`)},element:function(){let e,t,i;const s=a.i;if(t=this.combinator(),e=a.$re(/^(?:\d+\.\d+|\d+)%/)||a.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||a.$char("*")||a.$char("&")||this.attribute()||a.$re(/^\([^&()@]+\)/)||a.$re(/^[.#:](?=@)/)||this.entities.variableCurly(),!e)if(a.save(),a.$char("("))if(i=this.selector(!1)){let t=[];for(;a.$char(",");)t.push(i),t.push(new Y(",")),i=this.selector(!1);t.push(i),a.$char(")")?(e=t.length>1?new ze.Paren(new he(t)):new ze.Paren(i),a.forget()):a.restore("Missing closing ')'")}else a.restore("Missing closing ')'");else a.forget();if(e)return new ze.Element(t,e,e instanceof ze.Variable,s+r,n)},combinator:function(){let e=a.currentChar();if("/"===e){a.save();const e=a.$re(/^\/[a-z]+\//i);if(e)return a.forget(),new ze.Combinator(e);a.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(a.i++,"^"===e&&"^"===a.currentChar()&&(e="^^",a.i++);a.isWhitespace();)a.i++;return new ze.Combinator(e)}return a.isWhitespace(-1)?new ze.Combinator(" "):new ze.Combinator(null)},selector:function(e){const t=a.i;let i,s,o,c,u,f,p;for(e=!1!==e;(e&&(s=this.extend())||e&&(f=a.$str("when"))||(c=this.element()))&&(f?p=h(this.conditions,"expected condition"):p?l("CSS guard can only be used at the end of selector"):s?u=u?u.concat(s):s:(u&&l("Extend can only be used at the end of selector"),o=a.currentChar(),Array.isArray(c)&&c.forEach(e=>i.push(e)),i?i.push(c):i=[c],c=null),"{"!==o&&"}"!==o&&";"!==o&&","!==o&&")"!==o););if(i)return new ze.Selector(i,u,p,t+r,n);u&&l("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){let e,t;for(;e=this.selector(),e&&(t?t.push(e):t=[e],a.commentStore.length=0,e.condition&&t.length>1&&l("Guards are only currently allowed on a single selector."),a.$char(","));)e.condition&&l("Guards are only currently allowed on a single selector."),a.commentStore.length=0;return t},attribute:function(){if(!a.$char("["))return;const e=this.entities;let t,i,n,s;return(t=e.variableCurly())||(t=h(/^(?:[_A-Za-z0-9-*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),n=a.$re(/^[|~*$^]?=/),n&&(i=e.quoted()||a.$re(/^[0-9]+%/)||a.$re(/^[\w-]+/)||e.variableCurly(),i&&(s=a.$re(/^[iIsS]/))),f("]"),new ze.Attribute(t,n,i,s)},block:function(){let e;if(a.$char("{")&&(e=this.primary())&&a.$char("}"))return e},blockRuleset:function(){let e=this.block();if(e)return new ze.Ruleset(null,e)},detachedRuleset:function(){let e,t,i;if(a.save(),a.$re(/^[.#]\(/)&&(e=this.mixin.args(!1),t=e.args,i=e.variadic,!a.$char(")")))return void a.restore();const n=this.blockRuleset();if(n)return a.forget(),t?new ze.mixin.Definition(null,t,n,null,i):new ze.DetachedRuleset(n);a.restore()},ruleset:function(){let e,i,n;if(a.save(),t.dumpLineNumbers&&(n=p(a.i)),e=this.selectors(),e&&(i=this.block())){a.forget();const s=new ze.Ruleset(e,i,t.strictImports);return t.dumpLineNumbers&&(s.debugInfo=n),s}a.restore()},declaration:function(){let e,t;const i=a.i;let s;const o=a.currentChar();let l,c,u;if("."!==o&&"#"!==o&&"&"!==o&&":"!==o)if(a.save(),e=this.variable()||this.ruleProperty(),e){if(u="string"==typeof e,u&&(t=this.detachedRuleset(),t&&(s=!0)),a.commentStore.length=0,!t){if(c=!u&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?a.$char(";")?new Y(""):this.permissiveValue(/[;}]/,!0):this.anonymousValue(),t)return a.forget(),new ze.Declaration(e,t,!1,c,i+r,n);t||(t=this.value()),t?l=this.important():u&&(t=this.permissiveValue())}if(t&&(this.end()||s))return a.forget(),new ze.Declaration(e,t,l,c,i+r,n);a.restore()}else a.restore()},anonymousValue:function(){const e=a.i,t=a.$re(/^([^.#@$+/'"*`(;{}-]*);/);if(t)return new ze.Anonymous(t[1],e+r)},permissiveValue:function(e){let t,i,s,r;const o=e||";",c=a.i,h=[];function f(){const e=a.currentChar();return"string"==typeof o?e===o:o.test(e)}if(!f()){r=[];do{i=this.comment(),i?r.push(i):(i=this.entity(),i&&r.push(i),a.peek(",")&&(r.push(new ze.Anonymous(",",a.i)),a.$char(",")))}while(i);if(s=f(),r.length>0){if(r=new ze.Expression(r),s)return r;h.push(r)," "===a.prevChar()&&h.push(new ze.Anonymous(" ",c))}if(a.save(),r=a.$parseUntil(o),r){if("string"==typeof r&&l(`Expected '${r}'`,"Parse"),1===r.length&&" "===r[0])return a.forget(),new ze.Anonymous("",c);let e;for(t=0;t]=|<=|>=|[<>]|=)/)?(a.restore(),o=this.condition(),a.save(),c=this.atomicCondition(null,o.rvalue),c||a.restore()):(a.restore(),s=this.value()),a.$char(")")?o&&!s?(i.push(new ze.Paren(new ze.QueryInParens(o.op,o.lvalue,o.rvalue,c?c.op:null,c?c.rvalue:null,o._index))),s=o):o&&s?(i.push(new ze.Paren(new ze.Declaration(o,s,null,null,a.i+r,n,!0))),u||(i[i.length-1].noSpacing=!0),u=!1):s?(i.push(new ze.Paren(s)),u=!1):l("badly formed media feature definition"):l("Missing closing ')'","Parse"))}while(s);if(a.forget(),i.length>0)return new ze.Expression(i)},mediaFeatures:function(e){const t=this.entities,i=[];let n;do{if(n=this.mediaFeature(e),n){if(i.push(n),!a.$char(","))break;i[i.length-1].noSpacing||(i[i.length-1].noSpacing=!1)}else if(n=t.variable()||t.mixinLookup(),n){if(i.push(n),!a.$char(","))break;i[i.length-1].noSpacing||(i[i.length-1].noSpacing=!1)}}while(n);return i.length>0?i:null},prepareAndGetNestableAtRule:function(e,i,s,o){const c=this.mediaFeatures(o),u=this.block();u||l("media definitions require block statements after any features"),a.forget();const h=new e(u,c,i+r,n);return t.dumpLineNumbers&&(h.debugInfo=s),h},nestableAtRule:function(){let e;const i=a.i;if(t.dumpLineNumbers&&(e=p(i)),a.save(),a.$peekChar("@")){if(a.$str("@media"))return this.prepareAndGetNestableAtRule(ze.Media,i,e,ae);if(a.$str("@container"))return this.prepareAndGetNestableAtRule(ze.Container,i,e,le)}a.restore()},plugin:function(){let e,t,i;const s=a.i;if(a.$re(/^@plugin\s+/)){if(u("The @plugin directive is deprecated and will be removed in Less 5.x. Use --plugin CLI option or the programmatic plugin API instead.",s,"DEPRECATED","at-plugin"),t=this.pluginArgs(),i=t?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return a.$char(";")||(a.i=s,l("missing semi-colon on @plugin")),new ze.Import(e,null,i,s+r,n);a.i=s,l("malformed @plugin statement")}},pluginArgs:function(){if(a.save(),!a.$char("("))return a.restore(),null;const e=a.$re(/^\s*([^);]+)\)\s*/);return e[1]?(a.forget(),e[1].trim()):(a.restore(),null)},atruleUnknown:function(e,t,i){return e=this.permissiveValue(/^[{;]/),i="{"===a.currentChar(),e?e.value||(e=null):i||";"===a.currentChar()||l("".concat(t," rule is missing block or ending semi-colon")),[e,i]},atruleBlock:function(e,t,i,n){if(e=this.blockRuleset(),a.save(),e||i||(t=this.entity(),e=this.blockRuleset()),e||i)a.forget();else{a.restore();var s=[];for(t=this.entity();a.$char(",");)s.push(t),t=this.entity();t&&s.length>0?(s.push(t),t=s,n=!0):e=this.blockRuleset()}return[e,t,n]},atrule:function(){const e=a.i;let i,s,o,c,u,h,f,d=!0,m=!0,g=!1;if("@"===a.currentChar()){if(s=this.import()||this.plugin()||this.nestableAtRule(),s)return s;if(a.save(),i=a.$re(/^@[a-z-]+/),i){switch(c=i,"-"==i.charAt(1)&&i.indexOf("-",2)>0&&(c="@"+i.slice(i.indexOf("-",2)+1)),c){case"@charset":u=!0,d=!1;break;case"@namespace":h=!0,d=!1;break;case"@keyframes":case"@counter-style":u=!0;break;case"@document":case"@supports":f=!0,m=!1;break;case"@starting-style":case"@layer":m=!1;break;default:f=!0}if(a.commentStore.length=0,u)s=this.entity(),s||l(`expected ${i} identifier`);else if(h)s=this.expression(),s||l(`expected ${i} expression`);else if(f){const e=this.atruleUnknown(s,i,d);s=e[0],d=e[1]}if(d){let e=this.atruleBlock(o,s,m,g);if(o=e[0],s=e[1],g=e[2],!o&&!f){a.restore(),i=a.$re(/^@[a-z-]+/);const t=this.atruleUnknown(s,i,d);s=t[0],d=t[1],d&&(e=this.atruleBlock(o,s,m,g),o=e[0],s=e[1],g=e[2])}}if(o||g||!d&&s&&a.$char(";"))return a.forget(),new ze.AtRule(i,s,o,e+r,n,t.dumpLineNumbers?p(e):null,m);a.restore("at-rule options not recognised")}}},value:function(){let e;const t=[],i=a.i;do{if(e=this.expression(),e&&(t.push(e),!a.$char(",")))break}while(e);if(t.length>0)return new ze.Value(t,i+r)},important:function(){if("!"===a.currentChar())return a.$re(/^! *important/)},sub:function(){let e,t;if(a.save(),a.$char("("))return e=this.addition(),e&&a.$char(")")?(a.forget(),t=new ze.Expression([e]),t.parens=!0,t):void a.restore("Expected ')'");a.restore()},colorOperand:function(){a.save();const e=a.$re(/^[lchrgbs]\s+/);if(e)return a.forget(),new ze.Keyword(e[0]);a.restore()},multiplication:function(){let e,t,i,n,s;if(e=this.operand(),e){for(s=a.isWhitespace(-1);!a.peek(/^\/[*/]/);){if(a.save(),i=a.$char("/")||a.$char("*"),!i){let e=a.i;i=a.$str("./"),i&&u("./ operator is deprecated",e,"DEPRECATED","dot-slash-operator")}if(!i){a.forget();break}if(t=this.operand(),!t){a.restore();break}a.forget(),e.parensInOp=!0,t.parensInOp=!0,n=new ze.Operation(i,[n||e,t],s),s=a.isWhitespace(-1)}return n||e}},addition:function(){let e,t,i,n,s;if(e=this.multiplication(),e){for(s=a.isWhitespace(-1);i=a.$re(/^[-+]\s+/)||!s&&(a.$char("+")||a.$char("-")),i&&(t=this.multiplication(),t);)e.parensInOp=!0,t.parensInOp=!0,n=new ze.Operation(i,[n||e,t],s),s=a.isWhitespace(-1);return n||e}},conditions:function(){let e,t;const i=a.i;let n;if(e=this.condition(!0),e){for(;a.peek(/^,\s*(not\s*)?\(/)&&a.$char(",")&&(t=this.condition(!0),t);)n=new ze.Condition("or",n||e,t,i+r);return n||e}},condition:function(e){let t,i,n;if(t=this.conditionAnd(e),t){if(i=a.$str("or"),i){if(n=this.condition(e),!n)return;t=new ze.Condition(i,t,n)}return t}},conditionAnd:function(e){let t,i,n;const s=this;if(t=function(){const t=s.negatedCondition(e)||s.parenthesisCondition(e);return t||e?t:s.atomicCondition(e)}(),t){if(i=a.$str("and"),i){if(n=this.conditionAnd(e),!n)return;t=new ze.Condition(i,t,n)}return t}},negatedCondition:function(e){if(a.$str("not")){const t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){let t;if(a.save(),a.$str("(")){if(t=function(t){let i;if(a.save(),i=t.condition(e),i){if(a.$char(")"))return a.forget(),i;a.restore()}else a.restore()}(this),t)return a.forget(),t;if(t=this.atomicCondition(e),t){if(a.$char(")"))return a.forget(),t;a.restore(`expected ')' got '${a.currentChar()}'`)}else a.restore()}else a.restore()},atomicCondition:function(e,t){const i=this.entities,n=a.i;let s,o,c,u;const h=function(){return this.addition()||i.keyword()||i.quoted()||i.mixinLookup()}.bind(this);if(s=t||h(),s)return a.$char(">")?u=a.$char("=")?">=":">":a.$char("<")?u=a.$char("=")?"<=":"<":a.$char("=")&&(u=a.$char(">")?"=>":a.$char("<")?"=<":"="),u?(o=h(),o?c=new ze.Condition(u,s,o,n+r,!1):l("expected expression")):t||(c=new ze.Condition("=",s,new ze.Keyword("true"),n+r,!1)),c},operand:function(){const e=this.entities;let t;a.peek(/^-[@$(]/)&&(t=a.$char("-"));let i=this.sub()||e.dimension()||e.color()||e.variable()||e.property()||e.call()||e.quoted(!0)||e.colorKeyword()||this.colorOperand()||e.mixinLookup();return t&&(i.parensInOp=!0,i=new ze.Negative(i)),i},expression:function(){const e=[];let t,i;const n=a.i;do{t=this.comment(),!t||t.isLineComment?(t=this.addition()||this.entity(),t instanceof ze.Comment&&(t=null),t&&(e.push(t),a.peek(/^\/[/*]/)||(i=a.$char("/"),i&&e.push(new ze.Anonymous(i,n+r))))):e.push(t)}while(t);if(e.length>0)return new ze.Expression(e)},property:function(){const e=a.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){let e=[];const t=[];let i,s;a.save();const o=a.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(o)return e=[new ze.Keyword(o[1])],a.forget(),e;function l(i){const n=a.i,s=a.$re(i);if(s)return t.push(n),e.push(s[1])}for(l(/^(\*?)/);l(/^((?:[\w-]+)|(?:[@$]\{[\w-]+\}))/););if(e.length>1&&l(/^((?:\+_|\+)?)\s*:/)){for(a.forget(),""===e[0]&&(e.shift(),t.shift()),s=0;s{let t="";for(const i in e)if(Object.hasOwnProperty.call(e,i)){const n=e[i];t+=`${("@"===i[0]?"":"@")+i}: ${n}${";"===String(n).slice(-1)?"":";"}`}return t};const he=function(e,t,i,n,s,r){this.extendList=t,this.condition=i,this.evaldCondition=!i,this._index=n,this._fileInfo=s,this.elements=this.getElements(e),this.mixinElements_=void 0,this.copyVisibilityInfo(r),this.setParent(this.elements,this)};he.prototype=Object.assign(new c,{type:"Selector",accept(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},createDerived(e,t,i){e=this.getElements(e);const n=new he(e,t||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return n.evaldCondition=P(i)?this.evaldCondition:i,n.mediaEmpty=this.mediaEmpty,n},getElements(e){return e?("string"==typeof e&&new ue(this.parse.context,this.parse.importManager,this._fileInfo,this._index).parseNode(e,["selector"],(function(t,i){if(t)throw new O({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=i[0].elements})),e):[new g("","&",!1,this._index,this._fileInfo)]},createEmptySelectors(){const e=new g("","&",!1,this._index,this._fileInfo),t=[new he([e],null,null,this._index,this._fileInfo)];return t[0].mediaEmpty=!0,t},match(e){const t=this.elements,i=t.length;let n,s;if(n=(e=e.mixinElements()).length,0===n||i!0,accept(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},eval(e){let t,i,n,s,r,o=!1;if(this.selectors&&(i=this.selectors.length)){for(t=new Array(i),me.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),s=0;s!e||0===e.length,matchCondition(e,t){const i=this.selectors[this.selectors.length-1];return!!i.evaldCondition&&!(i.condition&&!i.condition.eval(new j.Eval(t,t.frames)))},resetCache(){this._rulesets=null,this._variables=null,this._properties=null,this._lookups={}},variables(){return this._variables||(this._variables=this.rules?this.rules.reduce((function(e,t){if(t instanceof de&&!0===t.variable&&(e[t.name]=t),"Import"===t.type&&t.root&&t.root.variables){const i=t.root.variables();for(const n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=t.root.variable(n))}return e}),{}):{}),this._variables},properties(){return this._properties||(this._properties=this.rules?this.rules.reduce((function(e,t){if(t instanceof de&&!0!==t.variable){const i=1===t.name.length&&t.name[0]instanceof fe?t.name[0].value:t.name;e["$"+i]?e["$"+i].push(t):e["$"+i]=[t]}return e}),{}):{}),this._properties},variable(e){const t=this.variables()[e];if(t)return this.parseValue(t)},property(e){const t=this.properties()[e];if(t)return this.parseValue(t)},lastDeclaration(){for(let e=this.rules.length;e>0;e--){const t=this.rules[e-1];if(t instanceof de)return this.parseValue(t)}},parseValue(e){const t=this;function i(e){return e.value instanceof Y&&!e.parsed?("string"==typeof e.value.value?new ue(this.parse.context,this.parse.importManager,e.fileInfo(),e.value.getIndex()).parseNode(e.value.value,["value","important"],(function(t,i){t&&(e.parsed=!0),i&&(e.value=i[0],e.important=i[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){const n=[];for(let s=0;ss){if(!i||i(o)){r=o.find(new he(e.elements.slice(s)),t,i);for(let e=0;e0&&t.add(u),e.firstSelector=!0,o[0].genCSS(e,t),e.firstSelector=!1,n=1;n0?(s=k(e),r=s.pop(),o=n.createDerived(k(r.elements))):o=n.createDerived([]),t.length>0){let e=i.combinator;const n=t[0].elements[0];e.emptyOrWhitespace&&!n.combinator.emptyOrWhitespace&&(e=n.combinator),o.elements.push(new g(e,n.value,i.isVariable,i._index,i._fileInfo)),o.elements=o.elements.concat(t[0].elements.slice(1))}if(0!==o.elements.length&&s.push(o),t.length>1){let e=t.slice(1);e=e.map((function(e){return e.createDerived(e.elements,[])})),s=s.concat(e)}return s}function o(e,t,i,n,s){let o;for(o=0;o0?n[n.length-1]=n[n.length-1].createDerived(n[n.length-1].elements.concat(e)):n.push(new he(e));else t.push([new he(e)])}function l(e,t){const i=t.createDerived(t.elements,t.extendList,t.evaldCondition);return i.copyVisibilityInfo(e),i}let c,u,h;if(u=[],h=function e(t,i,l){let c,u,h,f,d,m,v,y,b,w,x=!1;function S(e){let t;return e.value instanceof p?(t=e.value.value,t instanceof he?t:null):null}for(f=[],d=[[]],c=0;y=l.elements[c];c++)if("&"!==y.value){const t=S(y);if(null!==t){a(f,d);const r=[];let c;const u=[];if(t.elements.some(e=>e instanceof he)){const r=[];for(const n of t.elements)if(n instanceof he){const t=[],s=e(t,i,n);c=c||s,t.length>0&&t[0].length>0?r.push(t[0][0]):r.push(n)}else r.push(n);x=x||c;o(d,[s(n([new he(r)],y),y)],y,l,u)}else for(c=e(r,i,t),x=x||c,h=0;h0&&v[0].elements.push(new g(y.combinator,"",y.isVariable,y._index,y._fileInfo)),m.push(v);else for(h=0;h0&&(t.push(d[c]),w=d[c][b-1],d[c][b-1]=w.createDerived(w.elements,l.extendList));return x}(u,t,i),!h)if(t.length>0)for(u=[],c=0;c!0,accept(e){this.features&&(this.features=e.visit(this.features)),this.rules&&(this.rules=e.visitArray(this.rules))},evalFunction:function(){if(!this.features||!Array.isArray(this.features.value)||this.features.value.length<1)return;const e=this.features.value;let t,i;for(let n=0;n1){const i=new he([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();t=new ge(i,e.mediaBlocks),t.multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},evalNested(e){let t,i;this.evalFunction();const n=e.mediaPath.concat([this]);for(t=0;t-1&&e.mediaBlocks.splice(t,1),this}i=n[t].features instanceof te?n[t].features.value:n[t].features,n[t]=Array.isArray(i)?i:[i]}return this.features=new te(this.permute(n).map(e=>{for(e=e.map(e=>e.toCSS?e:new Y(e)),t=e.length-1;t>0;t--)e.splice(t,0,new Y("and"));return new ee(e)})),this.setParent(this.features,this),new ge([],[])},permute(e){if(0===e.length)return[];if(1===e.length)return e[0];{const t=[],i=this.permute(e.slice(1));for(let n=0;n{"Ruleset"===e.type&&e.rules&&(n=n&&this.declarationsBlock(e.rules,!0))}),e&&!o?(this.simpleBlock=!0,this.declarations=i):!n||1!==i.length||o||t?this.rules=i:(this.simpleBlock=!0,this.declarations=i[0].rules?i[0].rules:i)}else{!this.declarationsBlock(i.rules)||o||t?(this.rules=[i],this.rules[0].selectors=new he([],null,null,n,s).createEmptySelectors()):(this.simpleBlock=!0,this.declarations=i.rules)}if(!this.simpleBlock)for(l=0;lt?e.filter((function(e){return"Declaration"===e.type||"Comment"===e.type})).length===e.length:e.filter((function(e){return("Declaration"===e.type||"Comment"===e.type)&&!e.merge})).length===e.length,keywordList:e=>!!Array.isArray(e)&&e.filter((function(e){return"Keyword"===e.type||"Comment"===e.type})).length===e.length,accept(e){const t=this.value,i=this.rules,n=this.declarations;i?this.rules=e.visitArray(i):n&&(this.declarations=e.visitArray(n)),t&&(this.value=e.visit(t))},isRulesetLike(){return this.rules||!this.isCharset()},isCharset(){return"@charset"===this.name},genCSS(e,t){const i=this.value,n=this.rules||this.declarations;t.add(this.name,this.fileInfo(),this.getIndex()),i&&(t.add(" "),i.genCSS(e,t)),this.simpleBlock?this.outputRuleset(e,t,this.declarations):n?this.outputRuleset(e,t,n):t.add(";")},eval(e){let t,i,n=this.value,s=this.rules||this.declarations;if(t=e.mediaPath,i=e.mediaBlocks,e.mediaPath=[],e.mediaBlocks=[],n&&(n=n.eval(e)),s&&(s=this.evalRoot(e,s)),Array.isArray(s)&&s[0].rules&&Array.isArray(s[0].rules)&&s[0].rules.length){!this.declarationsBlock(s[0].rules,!0)||this.isRooted||n||(ie(s[0].rules),s=s[0].rules,s.forEach(e=>e.merge=!1))}return this.simpleBlock&&s&&(s[0].functionRegistry=e.frames[0].functionRegistry.inherit(),s=s.map((function(t){return t.eval(e)}))),e.mediaPath=t,e.mediaBlocks=i,new ye(this.name,n,s,this.getIndex(),this.fileInfo(),this.debugInfo,this.isRooted,this.visibilityInfo())},evalRoot(e,t){let i=0,n=0,s=!0;this.simpleBlock||(t=[t[0].eval(e)]);let r=[];if(e.frames.length>0)for(let t=0;t0&&o&&!o.root&&o.selectors&&o.selectors.length>0&&(r=r.concat(o.selectors)),r.length>0){r.every(e=>e.elements&&e.elements.length>0&&e.elements.every(e=>"&"===e.value))?(s=!1,n++):i++}}const o=i>0&&n>0&&!s;return(this.isRooted&&i>0&&0===n&&s||!o)&&(t[0].root=!0),t},variable(e){if(this.rules)return ge.prototype.variable.call(this.rules[0],e)},find(){if(this.rules)return ge.prototype.find.apply(this.rules[0],arguments)},rulesets(){if(this.rules)return ge.prototype.rulesets.apply(this.rules[0])},outputRuleset(e,t,i){const n=i.length;let s;if(e.tabLevel=1+(0|e.tabLevel),e.compress){for(t.add("{"),s=0;se.eval(this.context)));const i=e=>!("Comment"===e.type);return e=e.filter(i).map(e=>{if("Expression"===e.type){const t=e.value.filter(i);return 1===t.length?e.parens&&"/"===t[0].op?e:t[0]:new ee(t)}return e}),!1===t?this.func(this.context,...e):this.func(...e)}}const Ie=function(e,t,i,n){this.name=e,this.args=t,this.calc="calc"===e,this._index=i,this._fileInfo=n};Ie.prototype=Object.assign(new c,{type:"Call",accept(e){this.args&&(this.args=e.visitArray(this.args))},eval(e){const t=e.mathOn;e.mathOn=!this.calc,(this.calc||e.inCalc)&&e.enterCalc();const i=()=>{(this.calc||e.inCalc)&&e.exitCalc(),e.mathOn=t};let n;const s=new Se(this.name,e,this.getIndex(),this.fileInfo());if(s.isValid())try{n=s.call(this.args),i()}catch(e){if(e.hasOwnProperty("line")&&e.hasOwnProperty("column"))throw e;throw{type:e.type||"Runtime",message:`Error evaluating function \`${this.name}\`${e.message?": "+e.message:""}`,index:this.getIndex(),filename:this.fileInfo().filename,line:e.lineNumber,column:e.columnNumber}}if(null!=n)return n instanceof c||(n=new Y(n&&!0!==n?n.toString():null)),n._index=this._index,n._fileInfo=this._fileInfo,n;const r=this.args.map(t=>t.eval(e));return i(),new Ie(this.name,r,this.getIndex(),this.fileInfo())},genCSS(e,t){t.add(this.name+"(",this.fileInfo(),this.getIndex());for(let i=0;i=1){const t=e[0];if("Expression"===t.type&&Array.isArray(t.value)&&t.value.length>=2){e=t.value;"Keyword"===e[0].type&&"layer"===e[0].value&&"Paren"===e[1].type&&(this.css=!1)}}}if(this.options.inline){const e=new Y(this.root,0,{filename:this.importedFilename,reference:this.path._fileInfo&&this.path._fileInfo.reference},!0,!0);return this.features?new Me([e],this.features.value):[e]}if(this.css||this.layerCss){const t=new Pe(this.evalPath(e),n,this.options,this._index);if(this.layerCss&&(t.css=this.layerCss,t.path._fileInfo=this._fileInfo),!t.css&&this.error)throw this.error;return t}if(this.root){if(this.features){let e=this.features.value;if(Array.isArray(e)&&1===e.length){const t=e[0];if("Expression"===t.type&&Array.isArray(t.value)&&t.value.length>=2){e=t.value;if("Keyword"===e[0].type&&"layer"===e[0].value&&"Paren"===e[1].type)return this.layerCss=!0,e[0]=new ee(e.slice(0,2)),e.splice(1,1),e[0].noSpacing=!0,this}}}return t=new ge(null,k(this.root.rules)),t.evalImports(e),this.features?new Me(t.rules,this.features.value):t.rules}if(this.features){let e=this.features.value;if(Array.isArray(e)&&e.length>=1&&(e=e[0].value,Array.isArray(e)&&e.length>=2)){if("Keyword"===e[0].type&&"layer"===e[0].value&&"Paren"===e[1].type)return this.css=!0,e[0]=new ee(e.slice(0,2)),e.splice(1,1),e[0].noSpacing=!0,this}}return[]}});const Ee=function(){};Ee.prototype=Object.assign(new c,{evaluateJavaScript(e,t){let i;const n=this,s={};if(!t.javascriptEnabled)throw{message:"Inline JavaScript is not enabled. Is it set in your options?",filename:this.fileInfo().filename,index:this.getIndex()};e=e.replace(/@\{([\w-]+)\}/g,(function(e,i){return n.jsify(new Ce("@"+i,n.getIndex(),n.fileInfo()).eval(t))}));try{e=new Function(`return (${e})`)}catch(t){throw{message:`JavaScript evaluation error: ${t.message} from \`${e}\``,filename:this.fileInfo().filename,index:this.getIndex()}}const r=t.frames[0].variables();for(const e in r)r.hasOwnProperty(e)&&(s[e.slice(1)]={value:r[e].value,toJS:function(){return this.value.eval(t).toCSS()}});try{i=e.call(s)}catch(e){throw{message:`JavaScript evaluation error: '${e.name}: ${e.message.replace(/["]/g,"'")}'`,filename:this.fileInfo().filename,index:this.getIndex()}}return i},jsify:e=>Array.isArray(e.value)&&e.value.length>1?`[${e.value.map((function(e){return e.toCSS()})).join(", ")}]`:e.toCSS()});const Re=function(e,t,i,n){this.escaped=t,this.expression=e,this._index=i,this._fileInfo=n};Re.prototype=Object.assign(new Ee,{type:"JavaScript",eval(e){const t=this.evaluateJavaScript(this.expression,e),i=typeof t;return"number"!==i||isNaN(t)?"string"===i?new _e(`"${t}"`,t,this.escaped,this._index):Array.isArray(t)?new Y(t.join(", ")):new Y(t):new X(t)}});const Oe=function(e,t){this.key=e,this.value=t};Oe.prototype=Object.assign(new c,{type:"Assignment",accept(e){this.value=e.visit(this.value)},eval(e){return this.value.eval?new Oe(this.key,this.value.eval(e)):this},genCSS(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)}});const Fe=function(e,t,i,n,s){this.op=e.trim(),this.lvalue=t,this.rvalue=i,this._index=n,this.negate=s};Fe.prototype=Object.assign(new c,{type:"Condition",accept(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},eval(e){const t=function(e,t,i){switch(e){case"and":return t&&i;case"or":return t||i;default:switch(c.compare(t,i)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t}});const Ve=function(e,t,i,n,s,r){this.op=e.trim(),this.lvalue=t,this.mvalue=i,this.op2=n?n.trim():null,this.rvalue=s,this._index=r};Ve.prototype=Object.assign(new c,{type:"QueryInParens",accept(e){this.lvalue=e.visit(this.lvalue),this.mvalue=e.visit(this.mvalue),this.rvalue&&(this.rvalue=e.visit(this.rvalue))},eval(e){return new Ve(this.op,this.lvalue.eval(e),this.mvalue.eval(e),this.op2,this.rvalue?this.rvalue.eval(e):null,this._index)},genCSS(e,t){this.lvalue.genCSS(e,t),t.add(" "+this.op+" "),this.mvalue.genCSS(e,t),this.rvalue&&(t.add(" "+this.op2+" "),this.rvalue.genCSS(e,t))}});const Le=function(e,t,i,n,s){this._index=i,this._fileInfo=n;const r=new he([],null,null,this._index,this._fileInfo).createEmptySelectors();this.features=new te(t),this.rules=[new ge(r,e)],this.rules[0].allowImports=!0,this.copyVisibilityInfo(s),this.allowRoot=!0,this.setParent(r,this),this.setParent(this.features,this),this.setParent(this.rules,this)};Le.prototype=Object.assign(new ye,{type:"Container",...ve,genCSS(e,t){t.add("@container ",this._fileInfo,this._index),this.features.genCSS(e,t),this.outputRuleset(e,t,this.rules)},eval(e){if(this._evaluated)return this;e.mediaBlocks||(e.mediaBlocks=[],e.mediaPath=[]);const t=new Le(null,[],this._index,this._fileInfo,this.visibilityInfo());return t._evaluated=!0,this.debugInfo&&(this.rules[0].debugInfo=this.debugInfo,t.debugInfo=this.debugInfo),t.features=this.features.eval(e),e.mediaPath.push(t),e.mediaBlocks.push(t),this.rules[0].functionRegistry=e.frames[0].functionRegistry.inherit(),e.frames.unshift(this.rules[0]),t.rules=[this.rules[0].eval(e)],e.frames.shift(),e.mediaPath.pop(),0===e.mediaPath.length?t.evalTop(e):t.evalNested(e)}});const De=function(e){this.value=e};De.prototype=Object.assign(new c,{type:"UnicodeDescriptor"});const je=function(e){this.value=e};je.prototype=Object.assign(new c,{type:"Negative",genCSS(e,t){t.add("-"),this.value.genCSS(e,t)},eval(e){return e.isMathOn()?new xe("*",[new X(-1),this.value]).eval(e):new je(this.value.eval(e))}});const Ne=function(e,t,i,n,s){switch(this.selector=e,this.option=t,this.object_id=Ne.next_id++,this.parent_ids=[this.object_id],this._index=i,this._fileInfo=n,this.copyVisibilityInfo(s),this.allowRoot=!0,t){case"!all":case"all":this.allowBefore=!0,this.allowAfter=!0;break;default:this.allowBefore=!1,this.allowAfter=!1}this.setParent(this.selector,this)};Ne.prototype=Object.assign(new c,{type:"Extend",accept(e){this.selector=e.visit(this.selector)},eval(e){return new Ne(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},clone(e){return new Ne(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},findSelfSelectors(e){let t,i,n=[];for(t=0;t0&&i.length&&""===i[0].combinator.value&&(i[0].combinator.value=" "),n=n.concat(e[t].elements);this.selfSelectors=[new he(n)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())}}),Ne.next_id=0;const Be=function(e,t,i){this.variable=e,this._index=t,this._fileInfo=i,this.allowRoot=!0};Be.prototype=Object.assign(new c,{type:"VariableCall",eval(e){let t,i=new Ce(this.variable,this.getIndex(),this.fileInfo()).eval(e);const n=new O({message:"Could not evaluate variable call "+this.variable});if(!i.ruleset){if(i.rules)t=i;else if(Array.isArray(i))t=new ge("",i);else{if(!Array.isArray(i.value))throw n;t=new ge("",i.value)}i=new be(t)}if(i.ruleset)return i.callEval(e);throw n}});const Ue=function(e,t,i,n){this.value=e,this.lookups=t,this._index=i,this._fileInfo=n};Ue.prototype=Object.assign(new c,{type:"NamespaceValue",eval(e){let t,i,n=this.value.eval(e);for(t=0;tthis.params.length)return!1}n=Math.min(r,this.arity);for(let i=0;i0){for(f=!0,c=0;c0)v=2;else if(v=1,y[1]+y[2]>1)throw{type:"Runtime",message:`Ambiguous use of \`default()\` found when matching for \`${this.format(s)}\``,index:this.getIndex(),filename:this.fileInfo().filename};for(c=0;c0&&(e=e.slice(0,t)),t=e.lastIndexOf("/"),t<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)}tryAppendExtension(e,t){return/(\.[a-z]*$)|([?;].*)$/.test(e)?e:e+t}tryAppendLessExtension(e){return this.tryAppendExtension(e,".less")}supportsSync(){return!1}alwaysMakePathsAbsolute(){return!1}isPathAbsolute(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)}join(e,t){return e?e+t:t}pathDiff(e,t){const i=this.extractUrlParts(e),n=this.extractUrlParts(t);let s,r,o,a,l="";if(i.hostPart!==n.hostPart)return"";for(r=Math.max(n.directories.length,i.directories.length),s=0;sparseInt(t[i])?-1:1;return 0}versionToString(e){let t="";for(let i=0;i{return i=255,(t=e)instanceof X&&t.unit.is("%")?parseFloat(t.value*i/100):tt(t);var t,i});return n=tt(n),new u(s,n,"rgba")}catch(e){}},hsl:function(e,t,i){let n=1;if(e instanceof ee){const s=e.value;if(e=s[0],t=s[1],(i=s[2])instanceof xe){const e=i;i=e.operands[0],n=e.operands[1]}}const s=Qe.hsla(e,t,i,n);if(s)return s.value="hsl",s},hsla:function(e,t,i,n){let s,r;function o(e){return 6*(e=e<0?e+1:e>1?e-1:e)<1?s+(r-s)*e*6:2*e<1?r:3*e<2?s+(r-s)*(2/3-e)*6:s}try{if(e instanceof u)return n=t?tt(t):e.alpha,new u(e.rgb,n,"hsla");e=tt(e)%360/360,t=Ze(tt(t)),i=Ze(tt(i)),n=Ze(tt(n)),r=i<=.5?i*(t+1):i+t-i*t,s=2*i-r;const a=[255*o(e+1/3),255*o(e),255*o(e-1/3)];return n=tt(n),new u(a,n,"hsla")}catch(e){}},hsv:function(e,t,i){return Qe.hsva(e,t,i,1)},hsva:function(e,t,i,n){let s,r;e=tt(e)%360/360*360,t=tt(t),i=tt(i),n=tt(n),s=Math.floor(e/60%6),r=e/60-s;const o=[i,i*(1-t),i*(1-r*t),i*(1-(1-r)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return Qe.rgba(255*o[a[s][0]],255*o[a[s][1]],255*o[a[s][2]],n)},hue:function(e){return new X(Ye(e).h)},saturation:function(e){return new X(100*Ye(e).s,"%")},lightness:function(e){return new X(100*Ye(e).l,"%")},hsvhue:function(e){return new X(et(e).h)},hsvsaturation:function(e){return new X(100*et(e).s,"%")},hsvvalue:function(e){return new X(100*et(e).v,"%")},red:function(e){return new X(e.rgb[0])},green:function(e){return new X(e.rgb[1])},blue:function(e){return new X(e.rgb[2])},alpha:function(e){return new X(Ye(e).a)},luma:function(e){return new X(e.luma()*e.alpha*100,"%")},luminance:function(e){const t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new X(t*e.alpha*100,"%")},saturate:function(e,t,i){if(!e.rgb)return null;const n=Ye(e);return void 0!==i&&"relative"===i.value?n.s+=n.s*t.value/100:n.s+=t.value/100,n.s=Ze(n.s),Xe(e,n)},desaturate:function(e,t,i){const n=Ye(e);return void 0!==i&&"relative"===i.value?n.s-=n.s*t.value/100:n.s-=t.value/100,n.s=Ze(n.s),Xe(e,n)},lighten:function(e,t,i){const n=Ye(e);return void 0!==i&&"relative"===i.value?n.l+=n.l*t.value/100:n.l+=t.value/100,n.l=Ze(n.l),Xe(e,n)},darken:function(e,t,i){const n=Ye(e);return void 0!==i&&"relative"===i.value?n.l-=n.l*t.value/100:n.l-=t.value/100,n.l=Ze(n.l),Xe(e,n)},fadein:function(e,t,i){const n=Ye(e);return void 0!==i&&"relative"===i.value?n.a+=n.a*t.value/100:n.a+=t.value/100,n.a=Ze(n.a),Xe(e,n)},fadeout:function(e,t,i){const n=Ye(e);return void 0!==i&&"relative"===i.value?n.a-=n.a*t.value/100:n.a-=t.value/100,n.a=Ze(n.a),Xe(e,n)},fade:function(e,t){const i=Ye(e);return i.a=t.value/100,i.a=Ze(i.a),Xe(e,i)},spin:function(e,t){const i=Ye(e),n=(i.h+t.value)%360;return i.h=n<0?360+n:n,Xe(e,i)},mix:function(e,t,i){i||(i=new X(50));const n=i.value/100,s=2*n-1,r=Ye(e).a-Ye(t).a,o=((s*r==-1?s:(s+r)/(1+s*r))+1)/2,a=1-o,l=[e.rgb[0]*o+t.rgb[0]*a,e.rgb[1]*o+t.rgb[1]*a,e.rgb[2]*o+t.rgb[2]*a],c=e.alpha*n+t.alpha*(1-n);return new u(l,c)},greyscale:function(e){return Qe.desaturate(e,new X(100))},contrast:function(e,t,i,n){if(!e.rgb)return null;if(void 0===i&&(i=Qe.rgba(255,255,255,1)),void 0===t&&(t=Qe.rgba(0,0,0,1)),t.luma()>i.luma()){const e=i;i=t,t=e}return n=void 0===n?.43:tt(n),e.luma().5&&(n=1,i=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*n*(i-e)},hardlight:function(e,t){return st.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(const e in st)st.hasOwnProperty(e)&&(nt[e]=nt.bind(null,st[e]));var rt=e=>{const t=(e,t)=>new $e(t,e.index,e.currentFileInfo).eval(e.context);return{"data-uri":function(i,n){n||(n=i,i=null);let r=i&&i.value,o=n.value;const a=this.currentFileInfo,l=a.rewriteUrls?a.currentDirectory:a.entryPath,c=o.indexOf("#");let u="";-1!==c&&(u=o.slice(c),o=o.slice(0,c));const h=A(this.context);h.rawBuffer=!0;const f=e.getFileManager(o,l,h,e,!0);if(!f)return t(this,n);let p=!1;if(i)p=/;base64$/.test(r);else{if(r=e.mimeLookup(o),"image/svg+xml"===r)p=!1;else{const t=e.charsetLookup(r);p=["US-ASCII","UTF-8"].indexOf(t)<0}p&&(r+=";base64")}const d=f.loadFileSync(o,l,h,e);if(!d.contents)return s.warn(`Skipped data-uri embedding of ${o} because file not found`),t(this,n||i);let m=d.contents;if(p&&!e.encodeBase64)return t(this,n);m=p?e.encodeBase64(m):encodeURIComponent(m);const g=`data:${r},${m}${u}`;return new $e(new _e(`"${g}"`,g,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}};const ot=e=>Array.isArray(e.value)?e.value:Array(e);var at={_SELF:function(e){return e},"~":function(...e){return 1===e.length?e[0]:new te(e)},extract:function(e,t){return t=t.value-1,ot(e)[t]},length:function(e){return new X(ot(e).length)},range:function(e,t,i){let n,s,r=1;const o=[];t?(s=t,n=e.value,i&&(r=i.value)):(n=1,s=e);for(let e=n;e<=s.value;e+=r)o.push(new X(e,s.unit));return new ee(o)},each:function(e,t){const i=[];let n,s;const r=e=>e instanceof c?e.eval(this.context):e;s=!e.value||e instanceof _e?e.ruleset?r(e.ruleset).rules:e.rules?e.rules.map(r):Array.isArray(e)?e.map(r):[r(e)]:Array.isArray(e.value)?e.value.map(r):[r(e.value)];let o="@value",a="@key",l="@index";t.params?(o=t.params[0]&&t.params[0].name,a=t.params[1]&&t.params[1].name,l=t.params[2]&&t.params[2].name,t=t.rules):t=t.ruleset;for(let e=0;e{if(!(i instanceof X))throw{type:"Argument",message:"argument must be a number"};return null===t?t=i.unit:i=i.unify(),new X(e(parseFloat(i.value)),t)},ct={ceil:null,floor:null,sqrt:null,abs:null,tan:"",sin:"",cos:"",atan:"rad",asin:"rad",acos:"rad"};for(const e in ct)ct.hasOwnProperty(e)&&(ct[e]=lt.bind(null,Math[e],ct[e]));ct.round=(e,t)=>{const i=void 0===t?0:t.value;return lt(e=>e.toFixed(i),null,e)};const ut=function(e,t){switch((t=Array.prototype.slice.call(t)).length){case 0:throw{type:"Argument",message:"one or more arguments required"}}let i,n,s,r,o,a,l,c;const u=[],h={};for(i=0;io.value)&&(u[n]=s);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=u.length,u.push(s)}}return 1==u.length?u[0]:(t=u.map(e=>e.toCSS(this.context)).join(this.context.compress?",":", "),new Y(`${e?"min":"max"}(${t})`))};var ht={min:function(...e){try{return ut.call(this,!0,e)}catch(e){}},max:function(...e){try{return ut.call(this,!1,e)}catch(e){}},convert:function(e,t){return e.convertTo(t.value)},pi:function(){return new X(Math.PI)},mod:function(e,t){return new X(e.value%t.value,e.unit)},pow:function(e,t){if("number"==typeof e&&"number"==typeof t)e=new X(e),t=new X(t);else if(!(e instanceof X&&t instanceof X))throw{type:"Argument",message:"arguments must be numbers"};return new X(Math.pow(e.value,t.value),e.unit)},percentage:function(e){return lt(e=>100*e,"%",e)}},ft={e:function(e){return new _e('"',e instanceof Re?e.evaluated:e.value,!0)},escape:function(e){return new Y(encodeURI(e.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},replace:function(e,t,i,n){let s=e.value;return i="Quoted"===i.type?i.value:i.toCSS(),s=s.replace(new RegExp(t.value,n?n.value:""),i),new _e(e.quote||"",s,e.escaped)},"%":function(e){const t=Array.prototype.slice.call(arguments,1);let i=e.value;for(let e=0;e{const n="Quoted"===t[e].type&&i.match(/s/i)?t[e].value:t[e].toCSS();return i.match(/[A-Z]$/)?encodeURIComponent(n):n});return i=i.replace(/%%/g,"%"),new _e(e.quote||"",i,e.escaped)}},pt=()=>({"svg-gradient":function(e){let t,i,n="linear",s='x="0" y="0" width="1" height="1"';const r={compress:!1};let o;const a=e.toCSS(r);let l,c,h,f,p;function d(){throw{type:"Argument",message:"svg-gradient expects direction, start_color [start_position], [color position,]..., end_color [end_position] or direction, color list"}}switch(2==arguments.length?(arguments[1].value.length<2&&d(),t=arguments[1].value):arguments.length<3?d():t=Array.prototype.slice.call(arguments,1),a){case"to bottom":i='x1="0%" y1="0%" x2="0%" y2="100%"';break;case"to right":i='x1="0%" y1="0%" x2="100%" y2="0%"';break;case"to bottom right":i='x1="0%" y1="0%" x2="100%" y2="100%"';break;case"to top right":i='x1="0%" y1="100%" x2="100%" y2="0%"';break;case"ellipse":case"ellipse at center":n="radial",i='cx="50%" cy="50%" r="75%"',s='x="-50" y="-50" width="101" height="101"';break;default:throw{type:"Argument",message:"svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center'"}}for(o=`<${n}Gradient id="g" ${i}>`,l=0;l`;return o+=`${n}Gradient>`,o=encodeURIComponent(o),o="data:image/svg+xml,"+o,new $e(new _e(`'${o}'`,o,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}});const dt=(e,t)=>e instanceof t?fe.True:fe.False,mt=(e,t)=>{if(void 0===t)throw{type:"Argument",message:"missing the required second argument to isunit."};if("string"!=typeof(t="string"==typeof t.value?t.value:t))throw{type:"Argument",message:"Second argument to isunit should be a unit or a string."};return e instanceof X&&e.unit.is(t)?fe.True:fe.False};var gt={isruleset:function(e){return dt(e,be)},iscolor:function(e){return dt(e,u)},isnumber:function(e){return dt(e,X)},isstring:function(e){return dt(e,_e)},iskeyword:function(e){return dt(e,fe)},isurl:function(e){return dt(e,$e)},ispixel:function(e){return mt(e,"px")},ispercentage:function(e){return mt(e,"%")},isem:function(e){return mt(e,"em")},isunit:mt,unit:function(e,t){if(!(e instanceof X))throw{type:"Argument",message:"the first argument to unit must be a number"+(e instanceof xe?". Have you forgotten parenthesis?":"")};return t=t?t instanceof fe?t.value:t.toCSS():"",new X(e.value,t)},"get-unit":function(e){return new Y(e.unit)}};const vt=function(e){if(0===(e=Array.prototype.slice.call(e)).length)throw{type:"Argument",message:"one or more arguments required"};return e=[new Ce(e[0].value,this.index,this.currentFileInfo).eval(this.context)].map(e=>e.toCSS(this.context)).join(this.context.compress?",":", "),new Y(`style(${e})`)};var yt={style:function(...e){try{return vt.call(this,e)}catch(e){}}},bt=e=>{const t={functionRegistry:oe,functionCaller:Se};return oe.addMultiple(He),oe.add("default",me.eval.bind(me)),oe.addMultiple(it),oe.addMultiple(nt),oe.addMultiple(rt(e)),oe.addMultiple(at),oe.addMultiple(ct),oe.addMultiple(ht),oe.addMultiple(ft),oe.addMultiple(pt()),oe.addMultiple(gt),oe.addMultiple(yt),t};function wt(e,t){let i,n=(t=t||{}).variables;const s=new j.Eval(t);"object"!=typeof n||Array.isArray(n)||(n=Object.keys(n).map((function(e){let t=n[e];return t instanceof ze.Value||(t instanceof ze.Expression||(t=new ze.Expression([t])),t=new ze.Value([t])),new ze.Declaration("@"+e,t,!1,null,0)})),s.frames=[new ze.Ruleset(null,n)]);const r=[new re.JoinSelectorVisitor,new re.MarkVisibleSelectorsVisitor(!0),new re.ExtendVisitor,new re.ToCSSVisitor({compress:Boolean(t.compress)})],o=[];let a,l;if(t.pluginManager){l=t.pluginManager.visitor();for(let t=0;t<2;t++)for(l.first();a=l.get();)a.isPreEvalVisitor?0!==t&&-1!==o.indexOf(a)||(o.push(a),a.run(e)):0!==t&&-1!==r.indexOf(a)||(a.isPreVisitor?r.unshift(a):r.push(a))}i=e.eval(s);for(let e=0;e=t);i++);this.preProcessors.splice(i,0,{preProcessor:e,priority:t})}addPostProcessor(e,t){let i;for(i=0;i=t);i++);this.postProcessors.splice(i,0,{postProcessor:e,priority:t})}addFileManager(e){this.fileManagers.push(e)}getPreProcessors(){const e=[];for(let t=0;t0){let e;const t=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?e=this.sourceMapURL:this._sourceMapFilename&&(e=this._sourceMapFilename),this.sourceMapURL=e,this.sourceMap=t}return this._css.join("")}}}(e=new r(e,t)),o=function(e,t){return class{constructor(e){this.options=e}toCSS(t,i,n){const s=new e({contentsIgnoredCharsMap:n.contentsIgnoredChars,rootNode:t,contentsMap:n.contents,sourceMapFilename:this.options.sourceMapFilename,sourceMapURL:this.options.sourceMapURL,outputFilename:this.options.sourceMapOutputFilename,sourceMapBasepath:this.options.sourceMapBasepath,sourceMapRootpath:this.options.sourceMapRootpath,outputSourceFiles:this.options.outputSourceFiles,sourceMapGenerator:this.options.sourceMapGenerator,sourceMapFileInline:this.options.sourceMapFileInline,disableSourcemapAnnotation:this.options.disableSourcemapAnnotation}),r=s.toCSS(i);return this.sourceMap=s.sourceMap,this.sourceMapURL=s.sourceMapURL,this.options.sourceMapInputFilename&&(this.sourceMapInputFilename=s.normalizeFilename(this.options.sourceMapInputFilename)),void 0!==this.options.sourceMapBasepath&&void 0!==this.sourceMapURL&&(this.sourceMapURL=s.removeBasepath(this.sourceMapURL)),r+this.getCSSAppendage()}getCSSAppendage(){let e=this.sourceMapURL;if(this.options.sourceMapFileInline){if(void 0===this.sourceMap)return"";e="data:application/json;base64,"+t.encodeBase64(this.sourceMap)}return this.options.disableSourcemapAnnotation?"":e?`/*# sourceMappingURL=${e} */`:""}getExternalSourceMap(){return this.sourceMap}setExternalSourceMap(e){this.sourceMap=e}isInline(){return this.options.sourceMapFileInline}getSourceMapURL(){return this.sourceMapURL}getOutputFilename(){return this.options.sourceMapOutputFilename}getInputFilename(){return this.sourceMapInputFilename}}}(n,e),a=function(e){return class{constructor(e,t){this.root=e,this.imports=t}toCSS(t){let i;const n={};let r;try{i=wt(this.root,t)}catch(e){throw new O(e,this.imports)}try{const o=Boolean(t.compress);o&&s.warn("The compress option has been deprecated. We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.");const a={compress:o,dumpLineNumbers:t.dumpLineNumbers,strictUnits:Boolean(t.strictUnits),numPrecision:8};if(t.sourceMap){!0===t.sourceMap&&(t.sourceMap={});const s=t.sourceMap;if(!s.sourceMapInputFilename&&t.filename&&(s.sourceMapInputFilename=t.filename),void 0===s.sourceMapBasepath&&t.filename){const e=Math.max(t.filename.lastIndexOf("/"),t.filename.lastIndexOf("\\"));s.sourceMapBasepath=e>=0?t.filename.substring(0,e):"."}if(s.sourceMapFullFilename&&!s.sourceMapFileInline){if(!s.sourceMapFilename&&!s.sourceMapURL){const e=s.sourceMapFullFilename.split(/[/\\]/).pop();s.sourceMapFilename=e}}else if(!s.sourceMapFilename&&!s.sourceMapURL)if(s.sourceMapOutputFilename)s.sourceMapFilename=s.sourceMapOutputFilename+".map";else if(t.filename){const e=t.filename.split(/[/\\]/).pop().replace(/\.[^/.]+$/,"");s.sourceMapFilename=e+".css.map"}if(!s.sourceMapOutputFilename)if(t.filename){const e=t.filename.split(/[/\\]/).pop().replace(/\.[^/.]+$/,"");s.sourceMapOutputFilename=e+".css"}else s.sourceMapOutputFilename="output.css";r=new e(s),n.css=r.toCSS(i,a,this.imports)}else n.css=i.toCSS(a)}catch(e){throw new O(e,this.imports)}if(t.pluginManager){const e=t.pluginManager.getPostProcessors();for(let i=0;i{e?c(e):f(t)}),p?p.filename?f(p):c(p):d&&d.then(f,c)}}}(e);const u=function(e,t){const i=function(e,n,s){if("function"==typeof n?(s=n,n=$(this.options,{})):n=$(this.options,n||{}),!s){const t=this;return new Promise((function(s,r){i.call(t,e,n,(function(e,t){e?r(e):s(t)}))}))}this.parse(e,n,(function(e,i,n,r){if(e)return s(e);let o;try{o=new t(i,n).toCSS(r)}catch(e){return s(e)}s(null,o)}))};return i}(0,a),h=function(e,t,i){const n=function(e,t,s){if("function"==typeof t?(s=t,t=$(this.options,{})):t=$(this.options,t||{}),!s){const i=this;return new Promise((function(s,r){n.call(i,e,t,(function(e,t){e?r(e):s(t)}))}))}{let n,r;const o=new It(this,!t.reUsePluginManager);if(t.pluginManager=o,n=new j.Parse(t),t.rootFileInfo)r=t.rootFileInfo;else{const e=t.filename||"input",i=e.replace(/[^/\\]*$/,"");r={filename:e,rewriteUrls:n.rewriteUrls,rootpath:n.rootpath||"",currentDirectory:i,entryPath:i,rootFilename:e},r.rootpath&&"/"!==r.rootpath.slice(-1)&&(r.rootpath+="/")}const a=new i(this,n,r);this.importManager=a,t.plugins&&t.plugins.forEach((function(e){let t,i;if(e.fileContent){if(i=e.fileContent.replace(/^\uFEFF/,""),t=o.Loader.evalPlugin(i,n,a,e.options,e.filename),t instanceof O)return s(t)}else o.addPlugin(e)})),new ue(n,a,r).parse(e,(function(e,i){if(e)return s(e);s(null,i,a,t)}),t)}};return n}(0,0,c),f=Ct("v"+i),p={version:[f.major,f.minor,f.patch],data:l,tree:ze,Environment:r,AbstractFileManager:Ge,AbstractPluginLoader:We,environment:e,visitors:re,Parser:ue,functions:bt(e),contexts:j,SourceMapOutput:n,SourceMapBuilder:o,ParseTree:a,ImportManager:c,render:u,parse:h,LessError:O,transformTree:wt,utils:E,PluginManager:It,logger:s},d=function(e){return function(){const t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}};let m;const g=Object.create(p);for(const e in p.tree)if(m=p.tree[e],"function"==typeof m)g[e.toLowerCase()]=d(m);else{g[e]=Object.create(null);for(const t in m)g[e][t.toLowerCase()]=d(m[t])}return p.parse=p.parse.bind(g),p.render=p.render.bind(g),g}let At,_t,$t={};const Mt=function(){};Mt.prototype=Object.assign(new Ge,{alwaysMakePathsAbsolute:()=>!0,join(e,t){return e?this.extractUrlParts(t,e).path:t},doXHR(e,t,i,n){const s=new XMLHttpRequest,r=!At.isFileProtocol||At.fileAsync;function o(t,i,n){t.status>=200&&t.status<300?i(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof n&&n(t.status,e)}"function"==typeof s.overrideMimeType&&s.overrideMimeType("text/css"),_t.debug(`XHR: Getting '${e}'`),s.open("GET",e,r),s.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),s.send(null),At.isFileProtocol&&!At.fileAsync?0===s.status||s.status>=200&&s.status<300?i(s.responseText):n(s.status,e):r?s.onreadystatechange=()=>{4==s.readyState&&o(s,i,n)}:o(s,i,n)},supports:()=>!0,clearFileCache(){$t={}},loadFile(e,t,i){t&&!this.isPathAbsolute(e)&&(e=t+e),e=i.ext?this.tryAppendExtension(e,i.ext):e,i=i||{};const n=this.extractUrlParts(e,window.location.href).url,s=this;return new Promise((e,t)=>{if(i.useFileCache&&$t[n])try{const t=$t[n];return e({contents:t,filename:n,webInfo:{lastModified:new Date}})}catch(e){return t({filename:n,message:`Error loading file ${n} error was ${e.message}`})}s.doXHR(n,i.mime,(function(t,i){$t[n]=t,e({contents:t,filename:n,webInfo:{lastModified:i}})}),(function(e,i){t({type:"File",message:`'${i}' wasn't found (${e})`,href:n})}))})}});var Pt=(e,t)=>(At=e,_t=t,Mt);const Et=function(e){this.less=e};Et.prototype=Object.assign(new We,{loadPlugin:(e,t,i,n,s)=>new Promise((r,o)=>{s.loadFile(e,t,i,n).then(r).catch(o)})});var Rt=(t,n,s)=>({add:function(r,o){s.errorReporting&&"html"!==s.errorReporting?"console"===s.errorReporting?function(e,t){const i=e.filename||t,r=[];let o=`${e.type||"Syntax"}Error: ${e.message||"There is an error in your .less file"} in ${i}`;const a=(e,t,i)=>{void 0!==e.extract[t]&&r.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,i).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),o+=` on line ${e.line}, column ${e.column+1}:\n${r.join("\n")}`),e.stack&&(e.extract||s.logLevel>=4)&&(o+="\nStack Trace\n"+e.stack),n.logger.error(o)}(r,o):"function"==typeof s.errorReporting&&s.errorReporting("add",r,o):function(n,r){const o="less-error-message:"+e(r||""),a=t.document.createElement("div");let l,c;const u=[],h=n.filename||r,f=h.match(/([^/]+(\?.*)?)$/)[1];a.id=o,a.className="less-error-message",c=`${n.type||"Syntax"}Error: ${n.message||"There is an error in your .less file"}
in ${f} `;const p=(e,t,i)=>{void 0!==e.extract[t]&&u.push('
{content}'.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,i).replace(/\{content\}/,e.extract[t]))};n.line&&(p(n,0,""),p(n,1,"line"),p(n,2,""),c+=`on line ${n.line}, column ${n.column+1}:`),n.stack&&(n.extract||s.logLevel>=4)&&(c+="
Stack Trace"+n.stack.split("\n").slice(1).join("
")),a.innerHTML=c,i(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),a.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===s.env&&(l=setInterval(()=>{const e=t.document,i=e.body;i&&(e.getElementById(o)?i.replaceChild(a,e.getElementById(o)):i.insertBefore(a,i.firstChild),clearInterval(l))},10))}(r,o)},remove:function(i){s.errorReporting&&"html"!==s.errorReporting?"console"===s.errorReporting||"function"==typeof s.errorReporting&&s.errorReporting("remove",i):function(i){const n=t.document.getElementById("less-error-message:"+e(i));n&&n.parentNode.removeChild(n)}(i)}}),Ot="4.5.0";const Ft={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(const e in window.less)Object.prototype.hasOwnProperty.call(window.less,e)&&(Ft[e]=window.less[e]);((e,i)=>{t(i,n(e)),void 0===i.isFileProtocol&&(i.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),i.async=i.async||!1,i.fileAsync=i.fileAsync||!1,i.poll=i.poll||(i.isFileProtocol?1e3:1500),i.env=i.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||i.isFileProtocol?"development":"production");const s=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);s&&(i.dumpLineNumbers=s[1]),void 0===i.useFileCache&&(i.useFileCache=!0),void 0===i.onReady&&(i.onReady=!0),i.relativeUrls&&(i.rewriteUrls="all")})(window,Ft),Ft.plugins=Ft.plugins||[],window.LESS_PLUGINS&&(Ft.plugins=Ft.plugins.concat(window.LESS_PLUGINS));const Vt=((e,n)=>{const s=e.document,r=kt(void 0,void 0,Ot);r.options=n;const o=r.environment,a=Pt(n,r.logger),l=new a;o.addFileManager(l),r.FileManager=a,r.PluginLoader=Et,((e,t)=>{t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(let i=0;i{let n=null;if("development"!==t.env)try{n=void 0===e.localStorage?null:e.localStorage}catch(e){}return{setCSS:function(e,t,s,r){if(n){i.info(`saving ${e} to cache.`);try{n.setItem(e,r),n.setItem(e+":timestamp",t),s&&n.setItem(e+":vars",JSON.stringify(s))}catch(t){i.error(`failed to save "${e}" to local storage for caching.`)}}},getCSS:function(e,t,i){const s=n&&n.getItem(e),r=n&&n.getItem(e+":timestamp");let o=n&&n.getItem(e+":vars");if(i=i||{},o=o||"{}",r&&t.lastModified&&new Date(t.lastModified).valueOf()===new Date(r).valueOf()&&JSON.stringify(i)===o)return s}}})(e,n,r.logger);(()=>{function e(){throw{type:"Runtime",message:"Image size functions are not supported in browser version of less"}}const t={"image-size":function(t){return e(),-1},"image-width":function(t){return e(),-1},"image-height":function(t){return e(),-1}};oe.addMultiple(t)})(r.environment),n.functions&&r.functions.functionRegistry.addMultiple(n.functions);const h=/^text\/(x-)?less$/;function f(e){const t={};for(const i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t}function p(e){const t=s.getElementsByTagName("style");for(let i of t)if(i.type.match(h)){const t={...f(n),modifyVars:e,filename:s.location.href.replace(/#.*$/,"")},o=i.innerHTML||"";r.render(o,t,(e,t)=>{e?c.add(e,"inline"):(i.type="text/css",i.styleSheet?i.styleSheet.cssText=t.css:i.innerHTML=t.css)})}}function d(e,i,s,a,h){const p=f(n);t(p,e),p.mime=e.type,h&&(p.modifyVars=h),l.loadFile(e.href,null,p,o).then(t=>{!function(t){const n=t.contents,o=t.filename,h=t.webInfo,f={currentDirectory:l.getPath(o),filename:o,rootFilename:o,rewriteUrls:p.rewriteUrls};if(f.entryPath=f.currentDirectory,f.rootpath=p.rootpath||f.currentDirectory,h){h.remaining=a;const t=u.getCSS(o,h,p.modifyVars);if(!s&&t)return h.local=!0,void i(null,t,n,e,h,o)}c.remove(o),p.rootFileInfo=f,r.render(n,p,(t,s)=>{t?(t.href=o,i(t)):(u.setCSS(e.href,h.lastModified,p.modifyVars,s.css),i(null,s.css,n,e,h,o))})}(t)}).catch(e=>{console.log(e),i(e)})}function m(e,t,i){for(let n=0;n{r.watchMode&&(l.clearFileCache(),m((t,n,s,r,o)=>{t?c.add(t,t.href||r.href):n&&i(e.document,n,r)}))},n.poll))),this.watchMode=!0,!0},r.unwatch=function(){return clearInterval(r.watchTimer),this.watchMode=!1,!1},r.registerStylesheetsImmediately=()=>{const e=s.getElementsByTagName("link");r.sheets=[];for(let t=0;tnew Promise(e=>{r.registerStylesheetsImmediately(),e()}),r.modifyVars=e=>r.refresh(!0,e,!1),r.refresh=(t,n,s)=>((t||s)&&!1!==s&&l.clearFileCache(),new Promise((s,o)=>{let a,l,u,h;a=l=new Date,h=r.sheets.length,0===h?(l=new Date,u=l-a,r.logger.info("Less has finished and no sheets were loaded."),s({startTime:a,endTime:l,totalMilliseconds:u,sheets:r.sheets.length})):m((t,n,f,p,d)=>{if(t)return c.add(t,t.href||p.href),void o(t);d.local?r.logger.info(`Loading ${p.href} from cache.`):r.logger.info(`Rendered ${p.href} successfully.`),i(e.document,n,p),r.logger.info(`CSS for ${p.href} generated in ${new Date-l}ms`),h--,0===h&&(u=new Date-a,r.logger.info(`Less has finished. CSS generated in ${u}ms`),s({startTime:a,endTime:l,totalMilliseconds:u,sheets:r.sheets.length})),l=new Date},t,n),p(n)})),r.refreshStyles=p,r})(window,Ft);let Lt,Dt,jt;function Nt(e){e.filename&&console.warn(e),Ft.async||Dt.removeChild(jt)}return window.less=Vt,Ft.onReady&&(/!watch/.test(window.location.hash)&&Vt.watch(),Ft.async||(Lt="body { display: none !important }",Dt=document.head||document.getElementsByTagName("head")[0],jt=document.createElement("style"),jt.type="text/css",jt.styleSheet?jt.styleSheet.cssText=Lt:jt.appendChild(document.createTextNode(Lt)),Dt.appendChild(jt)),Vt.registerStylesheetsImmediately(),Vt.pageLoadFinished=Vt.refresh("development"===Vt.env).then(Nt,Nt)),Vt}));
//# sourceMappingURL=less.min.js.map
diff --git a/packages/less/dist/less.min.js.map b/packages/less/dist/less.min.js.map
index 54621a946..747bd5b6f 100644
--- a/packages/less/dist/less.min.js.map
+++ b/packages/less/dist/less.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"less.min.js","sources":["../src/less-browser/utils.js","../src/less-browser/browser.js","../src/less/logger.js","../src/less/environment/environment.js","../src/less/data/colors.js","../src/less/data/unit-conversions.js","../src/less/data/index.js","../src/less/tree/node.js","../src/less/tree/color.js","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs","../src/less/tree/paren.js","../src/less/tree/combinator.js","../src/less/tree/element.js","../src/less/constants.js","../../../node_modules/.pnpm/is-what@3.14.1/node_modules/is-what/dist/index.esm.js","../../../node_modules/.pnpm/copy-anything@2.0.6/node_modules/copy-anything/dist/index.es.js","../src/less/utils.js","../src/less/less-error.js","../src/less/visitors/visitor.js","../src/less/contexts.js","../src/less/visitors/import-sequencer.js","../src/less/visitors/import-visitor.js","../src/less/visitors/set-tree-visibility-visitor.js","../src/less/visitors/extend-visitor.js","../src/less/visitors/join-selector-visitor.js","../src/less/visitors/to-css-visitor.js","../src/less/visitors/index.js","../src/less/parser/parser-input.js","../src/less/parser/chunker.js","../src/less/functions/function-registry.js","../src/less/tree/atrule-syntax.js","../src/less/tree/anonymous.js","../src/less/parser/parser.js","../src/less/tree/selector.js","../src/less/tree/value.js","../src/less/tree/keyword.js","../src/less/tree/declaration.js","../src/less/tree/debug-info.js","../src/less/tree/comment.js","../src/less/functions/default.js","../src/less/tree/ruleset.js","../src/less/tree/unit.js","../src/less/tree/dimension.js","../src/less/tree/expression.js","../src/less/tree/nested-at-rule.js","../src/less/tree/atrule.js","../src/less/tree/detached-ruleset.js","../src/less/tree/operation.js","../src/less/functions/function-caller.js","../src/less/tree/call.js","../src/less/tree/variable.js","../src/less/tree/property.js","../src/less/tree/attribute.js","../src/less/tree/quoted.js","../src/less/tree/url.js","../src/less/tree/media.js","../src/less/tree/import.js","../src/less/tree/js-eval-node.js","../src/less/tree/javascript.js","../src/less/tree/assignment.js","../src/less/tree/condition.js","../src/less/tree/query-in-parens.js","../src/less/tree/container.js","../src/less/tree/unicode-descriptor.js","../src/less/tree/negative.js","../src/less/tree/extend.js","../src/less/tree/variable-call.js","../src/less/tree/namespace-value.js","../src/less/tree/mixin-definition.js","../src/less/tree/mixin-call.js","../src/less/tree/index.js","../src/less/environment/abstract-file-manager.js","../src/less/environment/abstract-plugin-loader.js","../src/less/functions/boolean.js","../src/less/functions/color.js","../src/less/functions/color-blending.js","../src/less/functions/data-uri.js","../src/less/functions/list.js","../src/less/functions/math-helper.js","../src/less/functions/math.js","../src/less/functions/number.js","../src/less/functions/string.js","../src/less/functions/types.js","../src/less/functions/style.js","../src/less/functions/index.js","../src/less/functions/svg.js","../src/less/transform-tree.js","../src/less/plugin-manager.js","../../../node_modules/.pnpm/parse-node-version@1.0.1/node_modules/parse-node-version/index.js","../src/less-browser/file-manager.js","../src/less/index.js","../src/less/parse-tree.js","../src/less/source-map-builder.js","../src/less/source-map-output.js","../src/less/import-manager.js","../src/less/render.js","../src/less/parse.js","../src/less-browser/plugin-loader.js","../src/less-browser/log-listener.js","../src/less-browser/error-reporting.js","../src/less-browser/bootstrap.js","../src/less/default-options.js","../src/less-browser/add-default-options.js","../src/less-browser/index.js","../src/less-browser/cache.js","../src/less-browser/image-size.js"],"sourcesContent":["\nexport function extractId(href) {\n return href.replace(/^[a-z-]+:\\/+?[^/]+/, '') // Remove protocol & domain\n .replace(/[?&]livereload=\\w+/, '') // Remove LiveReload cachebuster\n .replace(/^\\//, '') // Remove root /\n .replace(/\\.[a-zA-Z]+$/, '') // Remove simple extension\n .replace(/[^.\\w-]+/g, '-') // Replace illegal characters\n .replace(/\\./g, ':'); // Replace dots with colons(for valid id)\n}\n\nexport function addDataAttr(options, tag) {\n if (!tag) {return;} // in case of tag is null or undefined\n for (const opt in tag.dataset) {\n if (Object.prototype.hasOwnProperty.call(tag.dataset, opt)) {\n if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') {\n options[opt] = tag.dataset[opt];\n } else {\n try {\n options[opt] = JSON.parse(tag.dataset[opt]);\n }\n catch (_) {}\n }\n }\n }\n}\n","import * as utils from './utils';\n\nexport default {\n createCSS: function (document, styles, sheet) {\n // Strip the query-string\n const href = sheet.href || '';\n\n // If there is no title set, use the filename, minus the extension\n const id = `less:${sheet.title || utils.extractId(href)}`;\n\n // If this has already been inserted into the DOM, we may need to replace it\n const oldStyleNode = document.getElementById(id);\n let keepOldStyleNode = false;\n\n // Create a new stylesheet node for insertion or (if necessary) replacement\n const styleNode = document.createElement('style');\n styleNode.setAttribute('type', 'text/css');\n if (sheet.media) {\n styleNode.setAttribute('media', sheet.media);\n }\n styleNode.id = id;\n\n if (!styleNode.styleSheet) {\n styleNode.appendChild(document.createTextNode(styles));\n\n // If new contents match contents of oldStyleNode, don't replace oldStyleNode\n keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory === undefined) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","/**\n * The reason why Node is a class and other nodes simply do not extend\n * from Node (since we're transpiling) is due to this issue:\n * \n * @see https://github.com/less/less.js/issues/3434\n */\nclass Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n }\n\n get currentFileInfo() {\n return this.fileInfo();\n }\n\n get index() {\n return this.getIndex();\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n // remove when genCSS has JSDoc types\n // eslint-disable-next-line no-unused-vars\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks === undefined) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks === undefined) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks === undefined) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nconst Color = function(rgb, a, originalForm) {\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n}\n\nColor.prototype = Object.assign(new Node(), {\n type: 'Color',\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n // eslint-disable-next-line no-fallthrough\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n },\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n },\n\n toRGB() {\n return toHex(this.rgb);\n },\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n },\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n },\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n },\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n});\n\nColor.fromKeyword = function(keyword) {\n let c;\n const key = keyword.toLowerCase();\n // eslint-disable-next-line no-prototype-builtins\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n};\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n }).join('')}`;\n}\n\nexport default Color;\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","import Node from './node';\n\nconst Paren = function(node) {\n this.value = node;\n};\n\nParen.prototype = Object.assign(new Node(), {\n type: 'Paren',\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n const paren = new Paren(this.value.eval(context));\n \n if (this.noSpacing) {\n paren.noSpacing = true;\n }\n\n return paren;\n }\n});\n\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nconst Combinator = function(value) {\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n}\n\nCombinator.prototype = Object.assign(new Node(), {\n type: 'Combinator',\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n});\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nconst Element = function(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n}\n\nElement.prototype = Object.assign(new Node(), {\n type: 'Element',\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n },\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n },\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n});\n\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/**\r\n * Returns the object type of the given payload\r\n *\r\n * @param {*} payload\r\n * @returns {string}\r\n */\r\nfunction getType(payload) {\r\n return Object.prototype.toString.call(payload).slice(8, -1);\r\n}\r\n/**\r\n * Returns whether the payload is undefined\r\n *\r\n * @param {*} payload\r\n * @returns {payload is undefined}\r\n */\r\nfunction isUndefined(payload) {\r\n return getType(payload) === 'Undefined';\r\n}\r\n/**\r\n * Returns whether the payload is null\r\n *\r\n * @param {*} payload\r\n * @returns {payload is null}\r\n */\r\nfunction isNull(payload) {\r\n return getType(payload) === 'Null';\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isPlainObject(payload) {\r\n if (getType(payload) !== 'Object')\r\n return false;\r\n return payload.constructor === Object && Object.getPrototypeOf(payload) === Object.prototype;\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isObject(payload) {\r\n return isPlainObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is { [K in any]: never }}\r\n */\r\nfunction isEmptyObject(payload) {\r\n return isPlainObject(payload) && Object.keys(payload).length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isFullObject(payload) {\r\n return isPlainObject(payload) && Object.keys(payload).length > 0;\r\n}\r\n/**\r\n * Returns whether the payload is an any kind of object (including special classes or objects with different prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isAnyObject(payload) {\r\n return getType(payload) === 'Object';\r\n}\r\n/**\r\n * Returns whether the payload is an object like a type passed in < >\r\n *\r\n * Usage: isObjectLike<{id: any}>(payload) // will make sure it's an object and has an `id` prop.\r\n *\r\n * @template T this must be passed in < >\r\n * @param {*} payload\r\n * @returns {payload is T}\r\n */\r\nfunction isObjectLike(payload) {\r\n return isAnyObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a function (regular or async)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is AnyFunction}\r\n */\r\nfunction isFunction(payload) {\r\n return typeof payload === 'function';\r\n}\r\n/**\r\n * Returns whether the payload is an array\r\n *\r\n * @param {any} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isArray(payload) {\r\n return getType(payload) === 'Array';\r\n}\r\n/**\r\n * Returns whether the payload is a an array with at least 1 item\r\n *\r\n * @param {*} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isFullArray(payload) {\r\n return isArray(payload) && payload.length > 0;\r\n}\r\n/**\r\n * Returns whether the payload is a an empty array\r\n *\r\n * @param {*} payload\r\n * @returns {payload is []}\r\n */\r\nfunction isEmptyArray(payload) {\r\n return isArray(payload) && payload.length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is a string\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isString(payload) {\r\n return getType(payload) === 'String';\r\n}\r\n/**\r\n * Returns whether the payload is a string, BUT returns false for ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isFullString(payload) {\r\n return isString(payload) && payload !== '';\r\n}\r\n/**\r\n * Returns whether the payload is ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isEmptyString(payload) {\r\n return payload === '';\r\n}\r\n/**\r\n * Returns whether the payload is a number (but not NaN)\r\n *\r\n * This will return `false` for `NaN`!!\r\n *\r\n * @param {*} payload\r\n * @returns {payload is number}\r\n */\r\nfunction isNumber(payload) {\r\n return getType(payload) === 'Number' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a boolean\r\n *\r\n * @param {*} payload\r\n * @returns {payload is boolean}\r\n */\r\nfunction isBoolean(payload) {\r\n return getType(payload) === 'Boolean';\r\n}\r\n/**\r\n * Returns whether the payload is a regular expression (RegExp)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is RegExp}\r\n */\r\nfunction isRegExp(payload) {\r\n return getType(payload) === 'RegExp';\r\n}\r\n/**\r\n * Returns whether the payload is a Map\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Map}\r\n */\r\nfunction isMap(payload) {\r\n return getType(payload) === 'Map';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakMap\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakMap}\r\n */\r\nfunction isWeakMap(payload) {\r\n return getType(payload) === 'WeakMap';\r\n}\r\n/**\r\n * Returns whether the payload is a Set\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Set}\r\n */\r\nfunction isSet(payload) {\r\n return getType(payload) === 'Set';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakSet\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakSet}\r\n */\r\nfunction isWeakSet(payload) {\r\n return getType(payload) === 'WeakSet';\r\n}\r\n/**\r\n * Returns whether the payload is a Symbol\r\n *\r\n * @param {*} payload\r\n * @returns {payload is symbol}\r\n */\r\nfunction isSymbol(payload) {\r\n return getType(payload) === 'Symbol';\r\n}\r\n/**\r\n * Returns whether the payload is a Date, and that the date is valid\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Date}\r\n */\r\nfunction isDate(payload) {\r\n return getType(payload) === 'Date' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a Blob\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Blob}\r\n */\r\nfunction isBlob(payload) {\r\n return getType(payload) === 'Blob';\r\n}\r\n/**\r\n * Returns whether the payload is a File\r\n *\r\n * @param {*} payload\r\n * @returns {payload is File}\r\n */\r\nfunction isFile(payload) {\r\n return getType(payload) === 'File';\r\n}\r\n/**\r\n * Returns whether the payload is a Promise\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Promise}\r\n */\r\nfunction isPromise(payload) {\r\n return getType(payload) === 'Promise';\r\n}\r\n/**\r\n * Returns whether the payload is an Error\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Error}\r\n */\r\nfunction isError(payload) {\r\n return getType(payload) === 'Error';\r\n}\r\n/**\r\n * Returns whether the payload is literally the value `NaN` (it's `NaN` and also a `number`)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is typeof NaN}\r\n */\r\nfunction isNaNValue(payload) {\r\n return getType(payload) === 'Number' && isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a primitive type (eg. Boolean | Null | Undefined | Number | String | Symbol)\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is boolean | null | undefined | number | string | symbol)}\r\n */\r\nfunction isPrimitive(payload) {\r\n return (isBoolean(payload) ||\r\n isNull(payload) ||\r\n isUndefined(payload) ||\r\n isNumber(payload) ||\r\n isString(payload) ||\r\n isSymbol(payload));\r\n}\r\n/**\r\n * Returns true whether the payload is null or undefined\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is null | undefined)}\r\n */\r\nvar isNullOrUndefined = isOneOf(isNull, isUndefined);\r\nfunction isOneOf(a, b, c, d, e) {\r\n return function (value) {\r\n return a(value) || b(value) || (!!c && c(value)) || (!!d && d(value)) || (!!e && e(value));\r\n };\r\n}\r\n/**\r\n * Does a generic check to check that the given payload is of a given type.\r\n * In cases like Number, it will return true for NaN as NaN is a Number (thanks javascript!);\r\n * It will, however, differentiate between object and null\r\n *\r\n * @template T\r\n * @param {*} payload\r\n * @param {T} type\r\n * @throws {TypeError} Will throw type error if type is an invalid type\r\n * @returns {payload is T}\r\n */\r\nfunction isType(payload, type) {\r\n if (!(type instanceof Function)) {\r\n throw new TypeError('Type must be a function');\r\n }\r\n if (!Object.prototype.hasOwnProperty.call(type, 'prototype')) {\r\n throw new TypeError('Type is not a class');\r\n }\r\n // Classes usually have names (as functions usually have names)\r\n var name = type.name;\r\n return getType(payload) === name || Boolean(payload && payload.constructor === type);\r\n}\n\nexport { getType, isAnyObject, isArray, isBlob, isBoolean, isDate, isEmptyArray, isEmptyObject, isEmptyString, isError, isFile, isFullArray, isFullObject, isFullString, isFunction, isMap, isNaNValue, isNull, isNullOrUndefined, isNumber, isObject, isObjectLike, isOneOf, isPlainObject, isPrimitive, isPromise, isRegExp, isSet, isString, isSymbol, isType, isUndefined, isWeakMap, isWeakSet };\n","import { isArray, isPlainObject } from 'is-what';\n\nfunction assignProp(carry, key, newVal, originalObject, includeNonenumerable) {\r\n const propType = {}.propertyIsEnumerable.call(originalObject, key)\r\n ? 'enumerable'\r\n : 'nonenumerable';\r\n if (propType === 'enumerable')\r\n carry[key] = newVal;\r\n if (includeNonenumerable && propType === 'nonenumerable') {\r\n Object.defineProperty(carry, key, {\r\n value: newVal,\r\n enumerable: false,\r\n writable: true,\r\n configurable: true,\r\n });\r\n }\r\n}\r\n/**\r\n * Copy (clone) an object and all its props recursively to get rid of any prop referenced of the original object. Arrays are also cloned, however objects inside arrays are still linked.\r\n *\r\n * @export\r\n * @template T\r\n * @param {T} target Target can be anything\r\n * @param {Options} [options = {}] Options can be `props` or `nonenumerable`\r\n * @returns {T} the target with replaced values\r\n * @export\r\n */\r\nfunction copy(target, options = {}) {\r\n if (isArray(target)) {\r\n return target.map((item) => copy(item, options));\r\n }\r\n if (!isPlainObject(target)) {\r\n return target;\r\n }\r\n const props = Object.getOwnPropertyNames(target);\r\n const symbols = Object.getOwnPropertySymbols(target);\r\n return [...props, ...symbols].reduce((carry, key) => {\r\n if (isArray(options.props) && !options.props.includes(key)) {\r\n return carry;\r\n }\r\n const val = target[key];\r\n const newVal = copy(val, options);\r\n assignProp(carry, key, newVal, target, options.nonenumerable);\r\n return carry;\r\n }, {});\r\n}\n\nexport { copy };\n","/* jshint proto: true */\nimport * as Constants from './constants';\nimport { copy } from 'copy-anything';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = copy(obj1);\n newObj._defaults = defaults;\n const cloned = obj2 ? copy(obj2) : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (Object.prototype.hasOwnProperty.call(obj2, prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}\n\nexport function isNullOrUndefined(val) {\n return val === null || val === undefined\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n var line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n lineAdjust = 1 - parseInt(match[2]);\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n options = options || {};\n const isWarning = (this.type ?? '').toLowerCase().includes('warning');\n const type = isWarning ? this.type : `${this.type}Error`;\n const color = isWarning ? 'yellow' : 'red';\n\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (!isWarning && typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (!isWarning && typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${type}: ${this.message}`, color);\n if (this.filename) {\n message += stylize(' in ', color) + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', color) + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import tree from '../tree';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (Object.prototype.hasOwnProperty.call(original, propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager', // Used as the plugin manager for the session\n 'quiet', // option - whether to log warnings\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n importItem.args = Array.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","/* eslint-disable no-unused-vars */\n/**\n * @todo - Remove unused when JSDoc types are added for visitor methods\n */\nimport contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this,\n inlineCSS = importNode.options.inline,\n isPlugin = importNode.options.isPlugin,\n isOptional = importNode.options.optional,\n duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n if (atRuleNode.value) {\n this.context.frames.unshift(atRuleNode);\n } else if (atRuleNode.declarations && atRuleNode.declarations.length) {\n if (atRuleNode.isRooted) {\n this.context.frames.unshift(atRuleNode);\n } else {\n this.context.frames.unshift(atRuleNode.declarations[0]);\n }\n } else if (atRuleNode.rules && atRuleNode.rules.length) {\n this.context.frames.unshift(atRuleNode);\n }\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","/* eslint-disable no-unused-vars */\n/**\n * @todo - Remove unused when JSDoc types are added for visitor methods\n */\nimport tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(extend) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n /**\n * @todo Shouldn't this be an error? To alert the developer\n * that they may have made an error in the selector they are\n * targeting?\n */\n logger.warn(`WARNING: extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(function (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","/* eslint-disable no-unused-vars */\n/**\n * @todo - Remove unused when JSDoc types are added for visitor methods\n */\nimport Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n\n if (atRuleNode.declarations && atRuleNode.declarations.length) {\n atRuleNode.declarations[0].root = (context.length === 0 || context[0].multiMedia);\n }\n else if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","/* eslint-disable no-unused-vars */\n/**\n * @todo - Remove unused when JSDoc types are added for visitor methods\n */\nimport tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$peekChar = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar: {\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n }\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']': {\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default function (input, fail) {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n}\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n // eslint-disable-next-line no-prototype-builtins\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","export const MediaSyntaxOptions = {\n queryInParens: true\n};\n\nexport const ContainerSyntaxOptions = {\n queryInParens: true\n};\n","import Node from './node';\n\nconst Anonymous = function(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n}\n\nAnonymous.prototype = Object.assign(new Node(), {\n type: 'Anonymous',\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n },\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n },\n isRulesetLike() {\n return this.rulesetLike;\n },\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n})\n\nexport default Anonymous;\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\nimport { ContainerSyntaxOptions, MediaSyntaxOptions } from '../tree/atrule-syntax';\nimport logger from '../logger';\nimport Selector from '../tree/selector';\nimport Anonymous from '../tree/anonymous';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo, currentIndex) {\n currentIndex = currentIndex || 0;\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n /**\n * \n * @param {string} msg \n * @param {number} index \n * @param {string} type \n */\n function warn(msg, index, type) {\n if (!context.quiet) {\n logger.warn(\n (new LessError(\n {\n index: index ?? parserInput.i,\n filename: fileInfo.filename,\n type: type ? `${type.toUpperCase()} WARNING` : 'WARNING',\n message: msg\n },\n imports\n )).toString()\n );\n }\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n\n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n *\n * @param {String} str - string to parse\n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p; (p = parseList[x]); x++) {\n result = parsers[p]();\n returnNodes.push(result || null);\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let err = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n // Optionally disable @plugin parsing\n if (additionalData && additionalData.disablePluginRule) {\n parsers.plugin = function() {\n var dir = parserInput.$re(/^@plugin?\\s+/);\n if (dir) {\n error('@plugin statements are not allowed when disablePluginRule is set to true');\n }\n }\n }\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n\n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n err = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = err || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) ||\n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index + currentIndex, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index + currentIndex, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w.]+)\\(/);\n if (!name) {\n parserInput.forget();\n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index + currentIndex, fileInfo);\n },\n\n declarationCall: function () {\n let validCall;\n let args;\n const index = parserInput.i;\n\n parserInput.save();\n\n validCall = parserInput.$re(/^[\\w]+\\(/);\n if (!validCall) {\n parserInput.forget();\n return;\n }\n\n validCall = validCall.substring(0, validCall.length - 1);\n\n let rule = this.ruleProperty();\n let value;\n \n if (rule) {\n value = this.value();\n }\n \n if (rule && value) {\n args = [new (tree.Declaration)(rule, value, null, null, parserInput.i + currentIndex, fileInfo, true)];\n }\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(validCall, args, index + currentIndex, fileInfo);\n },\n\n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result,\n // otherwise continue for plain args\n };\n }\n\n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[()'\"])|[^()'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value !== undefined ||\n value instanceof tree.Variable ||\n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index + currentIndex, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index + currentIndex, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index + currentIndex, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index + currentIndex, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index + currentIndex, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n }\n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index + currentIndex, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n let first = true;\n while (!(option = parserInput.$re(/^(!?all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n\n if (!e) {\n break;\n }\n /**\n * @note - This will not catch selectors in pseudos like :is() and :where() because\n * they don't currently parse their contents as selectors.\n */\n if (!first && e.combinator.value) {\n warn('Targeting complex selectors can have unexpected behavior, and this behavior may change in the future.', index)\n }\n\n first = false;\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index + currentIndex, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n let parensIndex;\n let parensWS = false;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n parensIndex = parserInput.i;\n if (parserInput.$char('(')) {\n parensWS = parserInput.isWhitespace(-2);\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n if (parensWS) {\n warn('Whitespace between a mixin name and parentheses for a mixin call is deprecated', parensIndex, 'DEPRECATED');\n }\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (inValue && !lookups && !hasParens) {\n // This isn't a valid in-value mixin call\n parserInput.restore();\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index + currentIndex, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n if (!hasParens) {\n warn('Calling a mixin without parentheses is deprecated', parensIndex, 'DEPRECATED');\n }\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n\n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex + currentIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n\n ruleLookups: function() {\n let rule;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') {\n return;\n }\n\n while (true) {\n parserInput.save();\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n\n lookupValue: function() {\n parserInput.save();\n\n if (!parserInput.$char('[')) {\n parserInput.restore();\n return;\n }\n\n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n\n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n }\n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n\n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n /** \n * A Selector Element\n *\n * div\n * + h1\n * #socks\n * input[type=\"text\"]\n *\n * Elements are the building blocks for Selectors,\n * they are made out of a `Combinator` (see combinator rule),\n * and an element name, such as a tag a class, or `*`.\n */\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n /** This selector parser is quite simplistic and will pass a number of invalid selectors. */\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n // eslint-disable-next-line no-control-regex\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false))) {\n let selectors = [];\n while (parserInput.$char(',')) {\n selectors.push(v);\n selectors.push(new Anonymous(','));\n v = this.selector(false);\n }\n selectors.push(v);\n \n if (parserInput.$char(')')) {\n if (selectors.length > 1) {\n e = new (tree.Paren)(new Selector(selectors));\n } else {\n e = new(tree.Paren)(v);\n }\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index + currentIndex, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (Array.isArray(e)){\n e.forEach(ele => elements.push(ele));\n } if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index + currentIndex, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error('Guards are only currently allowed on a single selector.');\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error('Guards are only currently allowed on a single selector.');\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n //\n // case-insensitive flag\n // e.g. [attr operator value i]\n //\n let cif;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n if (val) {\n cif = parserInput.$re(/^[iIsS]/);\n }\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val, cif);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not\n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n if (parserInput.$char(';')) {\n value = new Anonymous('');\n } else {\n value = this.permissiveValue(/[;}]/, true);\n }\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index + currentIndex, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n /**\n * As a last resort, try permissiveValue\n *\n * @todo - This has created some knock-on problems of not\n * flagging incorrect syntax or detecting user intent.\n */\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index + currentIndex, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@$+/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index + currentIndex);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n *\n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n * \n * @param {RexExp} untilTokens - Characters to stop parsing at\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n if (parserInput.peek(',')) {\n value.push(new (tree.Anonymous)(',', parserInput.i));\n parserInput.$char(',');\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n /** @type {string} */\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n const variableRegex = /@([\\w-]+)/g;\n const propRegex = /\\$([\\w-]+)/g;\n if (variableRegex.test(item)) {\n warn('@[ident] in unknown values will not be evaluated as variables in the future. Use @{[ident]}', index, 'DEPRECATED');\n }\n if (propRegex.test(item)) {\n warn('$[ident] in unknown values will not be evaluated as property references in the future. Use ${[ident]}', index, 'DEPRECATED');\n }\n quote.variableRegex = /@([\\w-]+)|@{([\\w-]+)}/g;\n quote.propRegex = /\\$([\\w-]+)|\\${([\\w-]+)}/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures({});\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index + currentIndex, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function (syntaxOptions) {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n let rangeP;\n let spacing = false;\n parserInput.save();\n do {\n parserInput.save();\n if (parserInput.$re(/^[0-9a-z-]*\\s+\\(/)) {\n spacing = true;\n }\n parserInput.restore();\n\n e = entities.declarationCall.bind(this)() || entities.keyword() || entities.variable() || entities.mixinLookup()\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n parserInput.save();\n if (!p && syntaxOptions.queryInParens && parserInput.$re(/^[0-9a-z-]*\\s*([<>]=|<=|>=|[<>]|=)/)) {\n parserInput.restore();\n p = this.condition();\n\n parserInput.save();\n rangeP = this.atomicCondition(null, p.rvalue);\n if (!rangeP) {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n e = this.value();\n }\n if (parserInput.$char(')')) {\n if (p && !e) {\n nodes.push(new (tree.Paren)(new (tree.QueryInParens)(p.op, p.lvalue, p.rvalue, rangeP ? rangeP.op : null, rangeP ? rangeP.rvalue : null, p._index)));\t\t\t\t \n e = p;\n } else if (p && e) {\n nodes.push(new (tree.Paren)(new (tree.Declaration)(p, e, null, null, parserInput.i + currentIndex, fileInfo, true)));\n if (!spacing) {\n nodes[nodes.length - 1].noSpacing = true;\n }\n spacing = false;\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n spacing = false;\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function (syntaxOptions) {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature(syntaxOptions);\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n else if (!features[features.length - 1].noSpacing) {\n features[features.length - 1].noSpacing = false;\n }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n else if (!features[features.length - 1].noSpacing) {\n features[features.length - 1].noSpacing = false;\n }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n prepareAndGetNestableAtRule: function (treeType, index, debugInfo, syntaxOptions) {\n const features = this.mediaFeatures(syntaxOptions);\n\n const rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n const atRule = new (treeType)(rules, features, index + currentIndex, fileInfo);\n if (context.dumpLineNumbers) {\n atRule.debugInfo = debugInfo;\n }\n\n return atRule;\n },\n\n nestableAtRule: function () {\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n parserInput.save();\n\n if (parserInput.$peekChar('@')) {\n if (parserInput.$str('@media')) {\n return this.prepareAndGetNestableAtRule(tree.Media, index, debugInfo, MediaSyntaxOptions);\n }\n \n if (parserInput.$str('@container')) {\n return this.prepareAndGetNestableAtRule(tree.Container, index, debugInfo, ContainerSyntaxOptions);\n }\n }\n \n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index + currentIndex, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else {\n parserInput.restore();\n return null;\n }\n },\n atruleUnknown: function (value, name, hasBlock) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(''.concat(name, ' rule is missing block or ending semi-colon'));\n }\n }\n else if (!value.value) {\n value = null;\n }\n return [value, hasBlock];\n },\n atruleBlock: function (rules, value, isRooted, isKeywordList) {\n rules = this.blockRuleset();\n parserInput.save();\n if (!rules && !isRooted) {\n value = this.entity();\n rules = this.blockRuleset();\n }\n if (!rules && !isRooted) {\n parserInput.restore();\n var e = [];\n value = this.entity();\n while (parserInput.$char(',')) {\n e.push(value);\n value = this.entity();\n }\n if (value && e.length > 0) {\n e.push(value);\n value = e;\n isKeywordList = true;\n }\n else {\n rules = this.blockRuleset();\n }\n }\n else {\n parserInput.forget();\n }\n \n return [rules, value, isKeywordList];\n },\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n let isKeywordList = false;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.nestableAtRule();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n case '@starting-style':\n isRooted = false;\n break;\n case '@layer':\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n const unknownPackage = this.atruleUnknown(value, name, hasBlock);\n value = unknownPackage[0];\n hasBlock = unknownPackage[1];\n }\n \n if (hasBlock) {\n let blockPackage = this.atruleBlock(rules, value, isRooted, isKeywordList);\n rules = blockPackage[0];\n value = blockPackage[1];\n isKeywordList = blockPackage[2];\n\n if (!rules && !hasUnknown) {\n parserInput.restore();\n name = parserInput.$re(/^@[a-z-]+/);\n const unknownPackage = this.atruleUnknown(value, name, hasBlock);\n value = unknownPackage[0];\n hasBlock = unknownPackage[1];\n if (hasBlock) {\n blockPackage = this.atruleBlock(rules, value, isRooted, isKeywordList);\n rules = blockPackage[0];\n value = blockPackage[1];\n isKeywordList = blockPackage[2];\n }\n }\n }\n\n if (rules || isKeywordList || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index + currentIndex, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index + currentIndex);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n colorOperand: function () {\n parserInput.save();\n \n // hsl or rgb or lch operand\n const match = parserInput.$re(/^[lchrgbs]\\s+/);\n if (match) {\n return new tree.Keyword(match[0]);\n }\n\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*');\n if (!op) {\n let index = parserInput.i;\n op = parserInput.$str('./');\n if (op) {\n warn('./ operator is deprecated', index, 'DEPRECATED');\n }\n }\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index + currentIndex);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens, preparsedCond) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n const cond = (function() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }).bind(this)\n\n if (preparsedCond) {\n a = preparsedCond;\n } else {\n a = cond();\n }\n\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index + currentIndex, false);\n } else {\n error('expected expression');\n }\n } else if (!preparsedCond) {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index + currentIndex, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@$(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n this.colorOperand() || entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e && !e.isLineComment) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index + currentIndex));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k] + currentIndex, fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k] + currentIndex, fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\nimport * as utils from '../utils';\nimport Parser from '../parser/parser';\n\nconst Selector = function(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n};\n\nSelector.prototype = Object.assign(new Node(), {\n type: 'Selector',\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (!utils.isNullOrUndefined(evaldCondition)) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n },\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n new Parser(this.parse.context, this.parse.importManager, this._fileInfo, this._index).parseNode(\n els,\n ['selector'],\n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n },\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n },\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n },\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v.value.value || v.value);\n }).join('').match(/[,*.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n },\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n },\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(function (e) { return e.eval(context); });\n extendList = extendList && extendList.map(function(extend) { return extend.eval(context); });\n\n return this.createDerived(elements, extendList, evaldCondition);\n },\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n },\n\n getIsOutput() {\n return this.evaldCondition;\n }\n});\n\nexport default Selector;\n","import Node from './node';\n\nconst Value = function(value) {\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n};\n\nValue.prototype = Object.assign(new Node(), {\n type: 'Value',\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n },\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n },\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n});\n\nexport default Value;\n","import Node from './node';\n\nconst Keyword = function(value) {\n this.value = value;\n};\n\nKeyword.prototype = Object.assign(new Node(), {\n type: 'Keyword',\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n});\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nconst Declaration = function(name, value, important, merge, index, currentFileInfo, inline, variable) {\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n};\n\nDeclaration.prototype = Object.assign(new Node(), {\n type: 'Declaration',\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n },\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n },\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n});\n\nexport default Declaration;","function asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n}\n\nfunction asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '/';\n }\n return `\\\\${a}`;\n })}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n}\n\nfunction debugInfo(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = asComment(ctx);\n break;\n case 'mediaquery':\n result = asMediaQuery(ctx);\n break;\n case 'all':\n result = asComment(ctx) + (lineSeparator || '') + asMediaQuery(ctx);\n break;\n }\n }\n return result;\n}\n\nexport default debugInfo;\n\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nconst Comment = function(value, isLineComment, index, currentFileInfo) {\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n}\n\nComment.prototype = Object.assign(new Node(), {\n type: 'Comment',\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n },\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n});\n\nexport default Comment;\n","import Keyword from '../tree/keyword';\nimport * as utils from '../utils';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (!utils.isNullOrUndefined(v)) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\nimport Parser from '../parser/parser';\n\nconst Ruleset = function(selectors, rules, strictImports, visibilityInfo) {\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n}\n\nRuleset.prototype = Object.assign(new Node(), {\n type: 'Ruleset',\n isRuleset: true,\n\n isRulesetLike() { return true; },\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n eval(context) {\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (let j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n const startingIndex = selectors[0].getIndex();\n const selectorFileInfo = selectors[0].fileInfo();\n new Parser(context, this.parse.importManager, selectorFileInfo, startingIndex).parseNode(\n toParseSelectors.join(','),\n ['selectors'],\n function(err, result) {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n }(context.frames)).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (let j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n },\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n },\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n },\n\n matchArgs(args) {\n return !args || args.length === 0;\n },\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n },\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n },\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n // eslint-disable-next-line no-prototype-builtins\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n },\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n },\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n },\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n new Parser(this.parse.context, this.parse.importManager, decl.fileInfo(), decl.value.getIndex()).parseNode(\n decl.value.value,\n ['value', 'important'],\n function(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function(n) {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n },\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n },\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n },\n\n find(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (rule) {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n },\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n },\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n },\n\n joinSelector(paths, context, selector) {\n\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen, j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element, selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n return selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i, sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector !== null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n});\n\nexport default Ruleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nconst Unit = function(numerator, denominator, backupUnit) {\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n};\n\nUnit.prototype = Object.assign(new Node(), {\n type: 'Unit',\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n },\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n },\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n },\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n },\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n },\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n },\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n },\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n },\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n },\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n // eslint-disable-next-line no-prototype-builtins\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n // eslint-disable-next-line no-prototype-builtins\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n },\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n // eslint-disable-next-line no-prototype-builtins\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n});\n\nexport default Unit;\n","/* eslint-disable no-prototype-builtins */\nimport Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nconst Dimension = function(value, unit) {\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n};\n\nDimension.prototype = Object.assign(new Node(), {\n type: 'Dimension',\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n },\n\n // remove when Nodes have JSDoc types\n // eslint-disable-next-line no-unused-vars\n eval(context) {\n return this;\n },\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n },\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n },\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value);\n let unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error('Incompatible units. Change the units or use the unit function. '\n + `Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n },\n\n compare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n },\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n },\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n});\n\nexport default Dimension;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport Anonymous from './anonymous';\n\nconst Expression = function(value, noSpacing) {\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n};\n\nExpression.prototype = Object.assign(new Node(), {\n type: 'Expression',\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n },\n\n eval(context) {\n const noSpacing = this.noSpacing;\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen\n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n returnValue.noSpacing = returnValue.noSpacing || noSpacing;\n return returnValue;\n },\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n if (i + 1 < this.value.length && !(this.value[i + 1] instanceof Anonymous) ||\n this.value[i + 1] instanceof Anonymous && this.value[i + 1].value !== ',') {\n output.add(' ');\n }\n }\n }\n },\n\n throwAwayComments() {\n this.value = this.value.filter(function(v) {\n return !(v instanceof Comment);\n });\n }\n});\n\nexport default Expression;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport * as utils from '../utils';\n\nconst NestableAtRulePrototype = {\n\n isRulesetLike() {\n return true;\n },\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n evalFunction: function () {\n if (!this.features || !Array.isArray(this.features.value) || this.features.value.length < 1) {\n return;\n }\n\n const exprValues = this.features.value;\n let expr, paren;\n\n for (let index = 0; index < exprValues.length; ++index) {\n expr = exprValues[index];\n\n if (expr.type === 'Keyword' && index + 1 < exprValues.length && (expr.noSpacing || expr.noSpacing == null)) {\n paren = exprValues[index + 1];\n \n if (paren.type === 'Paren' && paren.noSpacing) {\n exprValues[index]= new Expression([expr, paren]);\n exprValues.splice(index + 1, 1);\n exprValues[index].noSpacing = true;\n }\n }\n }\n },\n\n evalTop(context) {\n this.evalFunction();\n\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n },\n\n evalNested(context) {\n this.evalFunction();\n\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n if (path[i].type !== this.type) { \n context.mediaBlocks.splice(i, 1); \n \n return this; \n }\n \n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n },\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n },\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n};\n\nexport default NestableAtRulePrototype;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport NestableAtRulePrototype from './nested-at-rule';\n\nconst AtRule = function(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n) {\n let i;\n var selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n const allDeclarations = this.declarationsBlock(rules);\n \n let allRulesetDeclarations = true;\n rules.forEach(rule => {\n if (rule.type === 'Ruleset' && rule.rules) allRulesetDeclarations = allRulesetDeclarations && this.declarationsBlock(rule.rules, true);\n });\n\n if (allDeclarations && !isRooted) {\n this.simpleBlock = true;\n this.declarations = rules;\n } else if (allRulesetDeclarations && rules.length === 1 && !isRooted && !value) {\n this.simpleBlock = true;\n this.declarations = rules[0].rules ? rules[0].rules : rules;\n } else {\n this.rules = rules;\n }\n } else {\n const allDeclarations = this.declarationsBlock(rules.rules);\n \n if (allDeclarations && !isRooted && !value) {\n this.simpleBlock = true;\n this.declarations = rules.rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n }\n if (!this.simpleBlock) {\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n }\n this.setParent(selectors, this);\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nAtRule.prototype = Object.assign(new Node(), {\n type: 'AtRule',\n\n ...NestableAtRulePrototype,\n\n declarationsBlock(rules, mergeable = false) {\n if (!mergeable) {\n return rules.filter(function (node) { return (node.type === 'Declaration' || node.type === 'Comment') && !node.merge}).length === rules.length;\n } else {\n return rules.filter(function (node) { return (node.type === 'Declaration' || node.type === 'Comment'); }).length === rules.length;\n }\n },\n\n keywordList(rules) {\n if (!Array.isArray(rules)) {\n return false;\n } else { \n return rules.filter(function (node) { return (node.type === 'Keyword' || node.type === 'Comment'); }).length === rules.length;\n }\n },\n\n accept(visitor) {\n const value = this.value, rules = this.rules, declarations = this.declarations;\n\n if (rules) {\n this.rules = visitor.visitArray(rules);\n } else if (declarations) {\n this.declarations = visitor.visitArray(declarations); \n }\n if (value) {\n this.value = visitor.visit(value);\n }\n },\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n },\n\n isCharset() {\n return '@charset' === this.name;\n },\n\n genCSS(context, output) {\n const value = this.value, rules = this.rules || this.declarations;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (this.simpleBlock) {\n this.outputRuleset(context, output, this.declarations);\n } else if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n },\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules || this.declarations;\n \n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n if (value.value && this.keywordList(value.value)) {\n value = new Anonymous(value.value.map(keyword => keyword.value).join(', '), this.getIndex(), this.fileInfo());\n }\n }\n\n if (rules) {\n rules = this.evalRoot(context, rules);\n }\n if (Array.isArray(rules) && rules[0].rules && Array.isArray(rules[0].rules) && rules[0].rules.length) {\n const allMergeableDeclarations = this.declarationsBlock(rules[0].rules, true);\n if (allMergeableDeclarations && !this.isRooted && !value) {\n var mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n mergeRules(rules[0].rules);\n rules = rules[0].rules;\n rules.forEach(rule => rule.merge = false);\n }\n }\n if (this.simpleBlock && rules) {\n rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n rules = rules.map(function (rule) { return rule.eval(context); });\n }\n\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n return new AtRule(this.name, value, rules, this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n },\n\n evalRoot(context, rules) {\n let ampersandCount = 0;\n let noAmpersandCount = 0;\n let noAmpersands = true;\n let allAmpersands = false;\n\n if (!this.simpleBlock) {\n rules = [rules[0].eval(context)];\n }\n\n let precedingSelectors = [];\n if (context.frames.length > 0) {\n for (let index = 0; index < context.frames.length; index++) {\n const frame = context.frames[index];\n if (\n frame.type === 'Ruleset' &&\n frame.rules &&\n frame.rules.length > 0\n ) {\n if (frame && !frame.root && frame.selectors && frame.selectors.length > 0) {\n precedingSelectors = precedingSelectors.concat(frame.selectors);\n }\n }\n if (precedingSelectors.length > 0) {\n let value = '';\n const output = { add: function (s) { value += s; } };\n for (let i = 0; i < precedingSelectors.length; i++) {\n precedingSelectors[i].genCSS(context, output);\n }\n if (/^&+$/.test(value.replace(/\\s+/g, ''))) {\n noAmpersands = false;\n noAmpersandCount++;\n } else {\n allAmpersands = false;\n ampersandCount++;\n }\n }\n }\n }\n\n const mixedAmpersands = ampersandCount > 0 && noAmpersandCount > 0 && !allAmpersands && !noAmpersands;\n if (\n (this.isRooted && ampersandCount > 0 && noAmpersandCount === 0 && !allAmpersands && noAmpersands)\n || !mixedAmpersands\n ) {\n rules[0].root = true;\n }\n return rules;\n },\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n },\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\n },\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n },\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n});\n\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nconst DetachedRuleset = function(ruleset, frames) {\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n};\n\nDetachedRuleset.prototype = Object.assign(new Node(), {\n type: 'DetachedRuleset',\n evalFirst: true,\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n },\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n },\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n});\n\nexport default DetachedRuleset;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nconst Operation = function(op, operands, isSpaced) {\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n};\n\nOperation.prototype = Object.assign(new Node(), {\n type: 'Operation',\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n },\n\n eval(context) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate || !b.operate) {\n if (\n (a instanceof Operation || b instanceof Operation)\n && a.op === '/' && context.math === MATH.PARENS_DIVISION\n ) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n },\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n});\n\nexport default Operation;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n // https://github.com/less/less.js/issues/3616\n if (item.parens && subNodes[0].op === '/') {\n return item;\n }\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\n\n//\n// A function call node.\n//\nconst Call = function(name, args, index, currentFileInfo) {\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nCall.prototype = Object.assign(new Node(), {\n type: 'Call',\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n },\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n // eslint-disable-next-line no-prototype-builtins\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n },\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n});\n\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nconst Variable = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nVariable.prototype = Object.assign(new Node(), {\n type: 'Variable',\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nconst Property = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nProperty.prototype = Object.assign(new Node(), {\n type: 'Property',\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Property;\n","import Node from './node';\n\nconst Attribute = function(key, op, value, cif) {\n this.key = key;\n this.op = op;\n this.value = value;\n this.cif = cif;\n}\n\nAttribute.prototype = Object.assign(new Node(), {\n type: 'Attribute',\n\n eval(context) {\n return new Attribute(\n this.key.eval ? this.key.eval(context) : this.key,\n this.op,\n (this.value && this.value.eval) ? this.value.eval(context) : this.value,\n this.cif\n );\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n if (this.cif) {\n value = value + ' ' + this.cif;\n }\n\n return `[${value}]`;\n }\n});\n\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\nconst Quoted = function(str, content, escaped, index, currentFileInfo) {\n this.escaped = (escaped === undefined) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n};\n\nQuoted.prototype = Object.assign(new Node(), {\n type: 'Quoted',\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n },\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n },\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = function (_, name1, name2) {\n const v = new Variable(`@${name1 ?? name2}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name1, name2) {\n const v = new Property(`$${name1 ?? name2}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n },\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n});\n\nexport default Quoted;\n","import Node from './node';\n\nfunction escapePath(path) {\n return path.replace(/[()'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nconst URL = function(val, index, currentFileInfo, isEvald) {\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n};\n\nURL.prototype = Object.assign(new Node(), {\n type: 'Url',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n});\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport AtRule from './atrule';\nimport NestableAtRulePrototype from './nested-at-rule';\n\nconst Media = function(value, features, index, currentFileInfo, visibilityInfo) {\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n};\n\nMedia.prototype = Object.assign(new AtRule(), {\n type: 'Media',\n\n ...NestableAtRulePrototype,\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n },\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n }\n});\n\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\nimport Expression from './expression';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nconst Import = function(path, features, options, index, currentFileInfo, visibilityInfo) {\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#.&?]css([?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n};\n\nImport.prototype = Object.assign(new Node(), {\n type: 'Import',\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n },\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n },\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n },\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n },\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n },\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n },\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n },\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.features) {\n let featureValue = this.features.value;\n if (Array.isArray(featureValue) && featureValue.length >= 1) {\n const expr = featureValue[0];\n if (expr.type === 'Expression' && Array.isArray(expr.value) && expr.value.length >= 2) {\n featureValue = expr.value;\n const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'\n && featureValue[1].type === 'Paren';\n if (isLayer) {\n this.css = false;\n }\n }\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css || this.layerCss) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (this.layerCss) {\n newImport.css = this.layerCss;\n newImport.path._fileInfo = this._fileInfo;\n }\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n if (this.features) {\n let featureValue = this.features.value;\n if (Array.isArray(featureValue) && featureValue.length === 1) {\n const expr = featureValue[0];\n if (expr.type === 'Expression' && Array.isArray(expr.value) && expr.value.length >= 2) {\n featureValue = expr.value;\n const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'\n && featureValue[1].type === 'Paren';\n if (isLayer) {\n this.layerCss = true;\n featureValue[0] = new Expression(featureValue.slice(0, 2));\n featureValue.splice(1, 1);\n featureValue[0].noSpacing = true;\n return this;\n }\n }\n }\n }\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n if (this.features) {\n let featureValue = this.features.value;\n if (Array.isArray(featureValue) && featureValue.length >= 1) {\n featureValue = featureValue[0].value;\n if (Array.isArray(featureValue) && featureValue.length >= 2) {\n const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'\n && featureValue[1].type === 'Paren';\n if (isLayer) {\n this.css = true;\n featureValue[0] = new Expression(featureValue.slice(0, 2));\n featureValue.splice(1, 1);\n featureValue[0].noSpacing = true;\n return this;\n }\n }\n }\n }\n return [];\n }\n }\n});\n\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nconst JsEvalNode = function() {};\n\nJsEvalNode.prototype = Object.assign(new Node(), {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n // eslint-disable-next-line no-prototype-builtins\n if (variables.hasOwnProperty(k)) {\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n },\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n});\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nconst JavaScript = function(string, escaped, index, currentFileInfo) {\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nJavaScript.prototype = Object.assign(new JsEvalNode(), {\n type: 'JavaScript',\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n});\n\nexport default JavaScript;\n","import Node from './node';\n\nconst Assignment = function(key, val) {\n this.key = key;\n this.value = val;\n}\n\nAssignment.prototype = Object.assign(new Node(), {\n type: 'Assignment',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n },\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n});\n\nexport default Assignment;\n","import Node from './node';\n\nconst Condition = function(op, l, r, i, negate) {\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n};\n\nCondition.prototype = Object.assign(new Node(), {\n type: 'Condition',\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n },\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n});\n\nexport default Condition;\n","import { copy } from 'copy-anything';\nimport Declaration from './declaration';\nimport Node from './node';\n\nconst QueryInParens = function (op, l, m, op2, r, i) {\n this.op = op.trim();\n this.lvalue = l;\n this.mvalue = m;\n this.op2 = op2 ? op2.trim() : null;\n this.rvalue = r;\n this._index = i;\n this.mvalues = [];\n};\n\nQueryInParens.prototype = Object.assign(new Node(), {\n type: 'QueryInParens',\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.mvalue = visitor.visit(this.mvalue);\n if (this.rvalue) {\n this.rvalue = visitor.visit(this.rvalue);\n }\n },\n\n eval(context) {\n this.lvalue = this.lvalue.eval(context);\n \n let variableDeclaration;\n let rule;\n\n for (let i = 0; (rule = context.frames[i]); i++) {\n if (rule.type === 'Ruleset') {\n variableDeclaration = rule.rules.find(function (r) {\n if ((r instanceof Declaration) && r.variable) {\n return true;\n }\n\n return false;\n });\n \n if (variableDeclaration) {\n break;\n }\n }\n }\n\n if (!this.mvalueCopy) {\n this.mvalueCopy = copy(this.mvalue);\n }\n \n if (variableDeclaration) {\n this.mvalue = this.mvalueCopy;\n this.mvalue = this.mvalue.eval(context);\n this.mvalues.push(this.mvalue);\n } else {\n this.mvalue = this.mvalue.eval(context);\n }\n\n if (this.rvalue) {\n this.rvalue = this.rvalue.eval(context);\n }\n return this;\n },\n\n genCSS(context, output) {\n this.lvalue.genCSS(context, output);\n output.add(' ' + this.op + ' ');\n if (this.mvalues.length > 0) {\n this.mvalue = this.mvalues.shift();\n }\n this.mvalue.genCSS(context, output);\n if (this.rvalue) {\n output.add(' ' + this.op2 + ' ');\n this.rvalue.genCSS(context, output);\n }\n },\n});\n\nexport default QueryInParens;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport AtRule from './atrule';\nimport NestableAtRulePrototype from './nested-at-rule';\n\nconst Container = function(value, features, index, currentFileInfo, visibilityInfo) {\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n};\n\nContainer.prototype = Object.assign(new AtRule(), {\n type: 'Container',\n\n ...NestableAtRulePrototype,\n\n genCSS(context, output) {\n output.add('@container ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n },\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Container(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n }\n});\n\nexport default Container;\n","import Node from './node';\n\nconst UnicodeDescriptor = function(value) {\n this.value = value;\n}\n\nUnicodeDescriptor.prototype = Object.assign(new Node(), {\n type: 'UnicodeDescriptor'\n})\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nconst Negative = function(node) {\n this.value = node;\n};\n\nNegative.prototype = Object.assign(new Node(), {\n type: 'Negative',\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n },\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n});\n\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nconst Extend = function(selector, option, index, currentFileInfo, visibilityInfo) {\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case '!all':\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n};\n\nExtend.prototype = Object.assign(new Node(), {\n type: 'Extend',\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n },\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n // remove when Nodes have JSDoc types\n // eslint-disable-next-line no-unused-vars\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n});\n\nExtend.next_id = 0;\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nconst VariableCall = function(variable, index, currentFileInfo) {\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n};\n\nVariableCall.prototype = Object.assign(new Node(), {\n type: 'VariableCall',\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n});\n\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nconst NamespaceValue = function(ruleCall, lookups, index, fileInfo) {\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n};\n\nNamespaceValue.prototype = Object.assign(new Node(), {\n type: 'NamespaceValue',\n\n eval(context) {\n let i, name, rules = this.value.eval(context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n});\n\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nconst Definition = function(name, params, rules, condition, variadic, frames, visibilityInfo) {\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nDefinition.prototype = Object.assign(new Ruleset(), {\n type: 'MixinDefinition',\n evalFirst: true,\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n },\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n },\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n },\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n },\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n },\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n});\n\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nconst MixinCall = function(elements, args, index, currentFileInfo, important) {\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n};\n\nMixinCall.prototype = Object.assign(new Node(), {\n type: 'MixinCall',\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n },\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n },\n\n _setVisibilityToReplacement(replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n },\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n});\n\nexport default MixinCall;\n","import Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport QueryInParens from './query-in-parens';\nimport Paren from './paren';\nimport Media from './media';\nimport Container from './container';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, Container, QueryInParens, \n UnicodeDescriptor, Negative, Extend, VariableCall, \n NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlParts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n /**\n * Helper function, not part of API.\n * This should be replaceable by newer Node / Browser APIs\n * \n * @param {string} url \n * @param {string} baseUrl\n */\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^/?#]*\\/)|([/\\\\]))?((?:[^/\\\\?#]*[/\\\\])*)([^/\\\\?#]*)([#?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager;\n","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = function() {\n return null;\n }\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false;\n\nfunction isdefined(context, variable) {\n try {\n variable.eval(context);\n return Keyword.True;\n } catch (e) {\n return Keyword.False;\n }\n}\n\nisdefined.evalArgs = false;\n\nexport default { isdefined, boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport Expression from '../tree/expression';\nimport Operation from '../tree/operation';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 128 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Expression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n // eslint-disable-next-line no-prototype-builtins\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Comment from '../tree/comment';\nimport Node from '../tree/node';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\nimport Value from '../tree/value';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...expr) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n const tryEval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset).rules;\n } else if (list.rules) {\n iterator = list.rules.map(tryEval);\n } else if (Array.isArray(list)) {\n iterator = list.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element('', '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element('', '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit === null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n // eslint-disable-next-line no-prototype-builtins\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n continue;\n } else {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(a => { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n try {\n return minMax.call(this, true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax.call(this, false, args);\n } catch (e) {}\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import Variable from '../tree/variable';\nimport Anonymous from '../tree/variable';\n\nconst styleExpression = function (args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n \n const entityList = [new Variable(args[0].value, this.index, this.currentFileInfo).eval(this.context)];\n \n args = entityList.map(a => { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n \n return new Anonymous(`style(${args})`);\n};\n\nexport default {\n style: function(...args) {\n try {\n return styleExpression.call(this, args);\n } catch (e) {}\n },\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\nimport style from './style';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n functionRegistry.addMultiple(style);\n\n return functions;\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default () => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += `${gradientType}Gradient>`;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default function(root, options) {\n options = options || {};\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(function (k) {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (let i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (let i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n}\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","'use strict';\n\nfunction parseNodeVersion(version) {\n var match = version.match(/^v(\\d{1,2})\\.(\\d{1,2})\\.(\\d{1,2})(?:-([0-9A-Za-z-.]+))?(?:\\+([0-9A-Za-z-.]+))?$/); // eslint-disable-line max-len\n if (!match) {\n throw new Error('Unable to parse: ' + version);\n }\n\n var res = {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n patch: parseInt(match[3], 10),\n pre: match[4] || '',\n build: match[5] || '',\n };\n\n return res;\n}\n\nmodule.exports = parseNodeVersion;\n","import AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nconst FileManager = function() {}\nFileManager.prototype = Object.assign(new AbstractFileManager(), {\n alwaysMakePathsAbsolute() {\n return true;\n },\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n },\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n },\n\n supports() {\n return true;\n },\n\n clearFileCache() {\n fileCache = {};\n },\n\n loadFile(filename, currentDirectory, options) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n});\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import Environment from './environment/environment';\nimport data from './data';\nimport tree from './tree';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport functions from './functions';\nimport contexts from './contexts';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\nimport SourceMapOutput from './source-map-output';\nimport SourceMapBuilder from './source-map-builder';\nimport ParseTree from './parse-tree';\nimport ImportManager from './import-manager';\nimport Parse from './parse';\nimport Render from './render';\nimport { version } from '../../package.json';\nimport parseVersion from 'parse-node-version';\n\nexport default function(environment, fileManagers) {\n let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n environment = new Environment(environment, fileManagers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(sourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse(environment, parseTree, importManager);\n\n const v = parseVersion(`v${version}`);\n const initial = {\n version: [v.major, v.minor, v.patch],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n\n const ctor = function(t) {\n return function() {\n const obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.slice.call(arguments, 0));\n return obj;\n };\n };\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n}\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default function(SourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n result.imports = [];\n for (const file in this.imports.files) {\n if (Object.prototype.hasOwnProperty.call(this.imports.files, file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n return result;\n }\n }\n\n return ParseTree;\n}\n","export default function (SourceMapOutput, environment) {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n}\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n /** \n * ignore empty content, or failsafe\n * if contents map is incorrect\n */\n if (inputSource === undefined) {\n this._css.push(chunk);\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n // eslint-disable-next-line no-prototype-builtins\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n}\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n // same name as they used to do before this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n // import (multiple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[resolvedFilename]\n && !importManager.files[resolvedFilename].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n}\n","import * as utils from './utils';\n\nexport default function(environment, ParseTree) {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n render.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, function(err, root, imports, options) {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n}\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, function (e, root) {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n}\n","/**\n * @todo Add tests for browser `@plugin`\n */\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nconst PluginLoader = function(less) {\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n};\n\nPluginLoader.prototype = Object.assign(new AbstractPluginLoader(), {\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n});\n\nexport default PluginLoader;\n\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '{content}';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `
in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:
`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
Stack Trace${e.stack.split('\\n').slice(1).join('
')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole() {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (Object.prototype.hasOwnProperty.call(window.less, key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default function() {\n return {\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n}","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n /**\n * @todo remove when this is typed with JSDoc\n */\n // eslint-disable-next-line no-unused-vars\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || '{}'; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","Object","prototype","hasOwnProperty","call","JSON","parse","_","browser","document","styles","sheet","id","concat","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","logger$1","error","msg","this","_fireEvent","warn","info","debug","addListener","listener","_listeners","push","removeListener","i_1","splice","type","i_2","logFunction","Environment","externalEnvironment","fileManagers","requiredFunctions","functions","propName","environmentFunc","bind","getFileManager","filename","currentDirectory","environment","isSync","logger","undefined","pluginManager","getFileManagers","fileManager","addFileManager","clearFileManagers","colors","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","unitConversions","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math","PI","deg","grad","turn","data","Node","parent","visibilityBlocks","nodeVisible","rootNode","parsed","defineProperty","get","fileInfo","getIndex","setParent","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","isRulesetLike","toCSS","context","strs","genCSS","add","chunk","index","isEmpty","join","output","value","accept","visitor","visit","eval","_operate","op","a","b","fround","precision","numPrecision","Number","toFixed","compare","numericCompare","blocksVisibility","addVisibilityBlock","removeVisibilityBlock","ensureVisibility","ensureInvisibility","isVisible","visibilityInfo","copyVisibilityInfo","Color","rgb","originalForm","self","match","map","c","i","parseInt","alpha","split","clamp","v","max","min","toHex","round","toString","assign","luma","r","g","pow","doNotCompress","color","colorFunction","compress","args","indexOf","toHSL","h","l","toRGB","splitcolor","operate","other","d","toHSV","toARGB","x","fromKeyword","keyword","key","toLowerCase","slice","__assign","t","n","arguments","p","apply","SuppressedError","Paren","paren","noSpacing","_noSpaceCombinators"," ","|","Combinator","emptyOrWhitespace","trim","spaceOrEmpty","Element","combinator","isVariable","currentFileInfo","clone","firstSelector","charAt","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getType","payload","copy","target","item","constructor","getPrototypeOf","getOwnPropertyNames","getOwnPropertySymbols","reduce","carry","props","includes","newVal","originalObject","includeNonenumerable","propType","propertyIsEnumerable","enumerable","writable","configurable","assignProp","nonenumerable","getLocation","inputStream","line","column","copyArray","arr","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","isNullOrUndefined","val","anonymousFunc","LessError","fileContentMap","currentFilename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","create","F","isWarning","_a","stylize","str","type_1","errorTxt","substr","_visitArgs","visitDeeper","_hasIndexed","_noop","Visitor","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","tree","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","visitArray","nonReplacing","out","evald","flatten","nestedCnt","j","nestedItem","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","test","isPathLocalRelative","Eval","frames","importantScope","enterCalc","calcStack","inCalc","exitCalc","pop","inParenthesis","parensStack","outOfParenthesis","mathOn","isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePath","segment","segments","reverse","ImportSequencer","onSequencerEmpty","imports","variableImports","_onSequencerEmpty","_currentDepth","addImport","callback","importSequencer","importItem","isReady","tryRun","addVariableImport","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","root","isFinished","visitImport","importNode","inlineCSS","inline","css","utils.copyArray","importParent","isVariableImport","processImportNode","evaldImportNode","evalForImport","multiple","importMultiple","tryAppendLessExtension","rules","onImported","sequencedOnImported","getPath","importedAtRoot","fullPath","importVisitor","isPlugin","isOptional","optional","duplicateImport","skip","importedFilename","oldContext","visitDeclaration","declNode","unshift","visitDeclarationOut","shift","visitAtRule","atRuleNode","declarations","isRooted","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","SetTreeVisibilityVisitor","visible","ExtendFinderVisitor","allExtendsStack","allExtends","extend","extendList","allSelectorsExtendList","ruleCnt","Extend","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","findSelfSelectors","ruleset","firstExtendOnThisSelectorPath","selectors","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","filter","hasFoundMatches","parent_ids","selector","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","newSelector","targetExtend","newExtend","extendsToAdd","extendVisitor","object_id","selfSelectors","findMatch","selfSelector","extendSelector","option","extendChainCount","selectorOne","selectorTwo","ruleNode","visitSelector","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","elements","potentialMatches","allowBefore","matched","initialCombinator","isElementValuesEqual","finished","allowAfter","endPathIndex","endPathElementIndex","elementValue1","elementValue2","Attribute","Selector","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","createDerived","newAllExtends","lastIndex","JoinSelectorVisitor","getIsOutput","joinSelectors","multiMedia","CSSVisitorUtils","_context","containsSilentNonBlockedChild","bodyRules","rule","isSilent","keepOnlyVisibleChilds","owner","thing","hasVisibleSelector","resolveVisibility","compiledRulesBody","isVisibleRuleset","firstRoot","ToCSSVisitor","utils","variable","mixinNode","visitExtend","extendNode","visitComment","commentNode","originalRules","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","_mergeRules","name","charset","debugInfo","comment","Comment","checkValidNodes","isRoot","Declaration","Call","allowRoot","rulesets","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","ruleList","ruleCache","ruleCSS","groups","groupsArr","i_3","merge","group","result_1","space_1","comma_1","Expression","important","Value","visitors","MarkVisibleSelectorsVisitor","ExtendVisitor","getParserInput","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","isLineComment","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$peekChar","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","quote","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","len","level","parenLevel","emitFrom","emitChunk","force","String","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","functionRegistry","makeRegistry","base","_data","addMultiple","_this","keys","getLocalFunctions","inherit","MediaSyntaxOptions","queryInParens","ContainerSyntaxOptions","Anonymous","mapLines","rulesetLike","Boolean","Parser","currentIndex","parsers","quiet","toUpperCase","expect","arg","expectChar","getDebugInfo","lineNumber","fileName","parseNode","parseList","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","err","preText","disablePluginRule","plugin","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","Ruleset","primary","endInfo","processImports","mixin","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","k","customFuncCall","stop","declarationCall","validCall","substring","ruleProperty","f","ieAlpha","boolean","condition","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","detachedRuleset","assignment","expression","literal","dimension","unicodeDescriptor","entity","url","property","Variable","Property","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","lookups","inValue","ruleLookups","VariableCall","NamespaceValue","isRule","first","element","getLookup","hasParens","parensIndex","parensWS","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expand","returner","variadic","expressions","hasSep","throwAwayComments","cond","params","argInfo","conditions","block","lookupValue","Quoted","attribute","slashedCombinator","isLess","when","ele","cif","content","blockRuleset","Definition","DetachedRuleset","dumpLineNumbers","strictImports","hasDR","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","variableRegex","propRegex","import","features","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","syntaxOptions","rangeP","spacing","atomicCondition","rvalue","lvalue","prepareAndGetNestableAtRule","treeType","atRule","nestableAtRule","Media","Container","pluginArgs","atruleUnknown","hasBlock","atruleBlock","isKeywordList","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","unknownPackage","blockPackage","sub","addition","parens","colorOperand","Keyword","multiplication","operation","isSpaced","operand","parensInOp","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","negate","body","me","tryConditionFollowedByParenthesis","preparsedCond","delim","simpleProperty","vars","name_1","evaldCondition","getElements","mixinElements_","utils.isNullOrUndefined","mediaEmpty","els","importManager","createEmptySelectors","el","sels","olen","mixinElements","isJustParentSelector","True","False","MATH","asComment","ctx","asMediaQuery","filenameWithProtocol","lineSeparator","lastRule","prevMath","evaldValue","mathBypass","evalName","importantResult","makeImportant","isCompressed","defaultFunc","value_","error_","reset","_lookups","_variables","_properties","isRuleset","selCnt","hasVariable","hasOnePassingSelector","toParseSelectors","startingIndex","selectorFileInfo","utils.flattenArray","subRule","originalRuleset","allowImports","globalFunctionRegistry","ctxFrames","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","resetCache","bubbleSelectors","importRules","matchArgs","matchCondition","lastSelector","_rulesets","variables","hash","properties","name_2","decl","parseValue","lastDeclaration","toParse","transformDeclaration","nodes_1","filtRules","prependRule","find","foundMixins","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","currentElements","newSelectors","selectorsMultiplied","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","Unit","numerator","denominator","backupUnit","sort","strictUnits","returnStr","is","unitString","isLength","RegExp","isSingular","usedUnits","mapUnit","groupName","atomicUnit","cancel","counter","count","Dimension","unit","parseFloat","isNaN","toColor","strValue","convertTo","unify","conversions","targetUnit","applyUnit","derivedConversions","returnValue","doubleParen","NestableAtRulePrototype","evalFunction","expr","exprValues","evalTop","mediaPath","evalNested","permute","fragment","rest","AtRule","allDeclarations","declarationsBlock","allRulesetDeclarations_1","simpleBlock","mergeable","keywordList","outputRuleset","mediaPathBackup","mediaBlocksBackup","evalRoot","mergeRules","less","ampersandCount","noAmpersandCount","noAmpersands","allAmpersands","precedingSelectors","frame","value_1","mixedAmpersands","callEval","Operation","operands","functionCaller","isValid","evalArgs","commentFilter","subNodes","to","from","pack","ar","__spreadArray","calc","currentMathContext","funcCaller","FunctionCaller","columnNumber","evaluating","fun","vArr","escaped","containsVariables","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","name1","name2","URL","isEvald","urlArgs","Import","pathValue","reference","evalPath","doEval","registry","featureValue","layerCss","newImport","JsEvalNode","evaluateJavaScript","evalContext","javascriptEnabled","jsify","toJS","JavaScript","string","Assignment","Condition","QueryInParens","op2","mvalue","mvalues","variableDeclaration","mvalueCopy","UnicodeDescriptor","Negative","next_id","selectorElements","selfElements","ruleCall","arity","optionalParameters","required","evalParams","mixinEnv","evaldArguments","varargs","isNamedFound","argIndex","argsLength","evalCall","_arguments","mixinFrames","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixinPath","argValue","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","MixinDefinition","format","newRules","_setVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","tryAppendExtension","ext","supportsSync","alwaysMakePathsAbsolute","isPathAbsolute","basePath","laterPath","pathDiff","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","rawDirectories","rawPath","fileUrl","AbstractPluginLoader","require","evalPlugin","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","validatePlugin","minVersion","compareVersion","addPlugin","setOptions","version","versionToString","aVersion","bVersion","versionString","printUsage","plugins","If","trueValue","falseValue","isdefined","colorFunctions","boolean$1","hsla","origColor","hsl","number","rgba","size","m1","m2","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","argb","tint","shade","colorBlend","mode","cb","cs","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","list","_SELF","~","_i","values","range","step","stepValue","each","rs","iterator","tryEval","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","types","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","styleExpression","style$1","style","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","transformTree","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","isPreEvalVisitor","isPreVisitor","pm","PluginManager","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","addPlugins","install","addVisitor","addPreProcessor","preProcessor","priority","indexToInsertAt","addPostProcessor","postProcessor","manager","getPostProcessors","getVisitors","PluginManagerFactory","newFactory","parseNodeVersion_1","major","minor","patch","pre","build","lessRoot","sourceMapOutput","sourceMapBuilder","parseTree","SourceMapBuilder","ParseTree","toCSSOptions","sourceMap","file_1","getExternalSourceMap","files","rootFilename","SourceMapOutput","contentsIgnoredCharsMap","contentsMap","sourceMapFilename","sourceMapURL","outputFilename","sourceMapOutputFilename","sourceMapBasepath","sourceMapRootpath","outputSourceFiles","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","normalizeFilename","removeBasepath","getCSSAppendage","setExternalSourceMap","isInline","getSourceMapURL","getOutputFilename","getInputFilename","_css","_rootNode","_contentsMap","_contentsIgnoredCharsMap","_sourceMapFilename","_outputFilename","_sourceMapBasepath","_sourceMapRootpath","_outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","file","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","ImportManager","rootFileInfo","mime","queue","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","newEnv","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","parseVersion","initial","ctor","api","fileCache","doXHR","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","supports","clearFileCache","location","useFileCache","lessText_1","webInfo","lastModified","Date","FM","log","fulfill","catch","ErrorReporting","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","loggers","console","LogListener","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"less.min.js","sources":["../lib/less-browser/utils.js","../lib/less-browser/browser.js","../lib/less/logger.js","../lib/less/environment/environment.js","../lib/less/data/colors.js","../lib/less/data/unit-conversions.js","../lib/less/data/index.js","../lib/less/tree/node.js","../lib/less/tree/color.js","../lib/less/tree/paren.js","../lib/less/tree/combinator.js","../lib/less/tree/element.js","../lib/less/constants.js","../../../node_modules/.pnpm/is-what@3.14.1/node_modules/is-what/dist/index.esm.js","../../../node_modules/.pnpm/copy-anything@2.0.6/node_modules/copy-anything/dist/index.es.js","../lib/less/utils.js","../lib/less/less-error.js","../lib/less/visitors/visitor.js","../lib/less/contexts.js","../lib/less/visitors/import-sequencer.js","../lib/less/visitors/import-visitor.js","../lib/less/visitors/extend-visitor.js","../lib/less/tree/debug-info.js","../lib/less/tree/comment.js","../lib/less/tree/unit.js","../lib/less/tree/dimension.js","../lib/less/tree/anonymous.js","../lib/less/tree/expression.js","../lib/less/tree/value.js","../lib/less/tree/merge-rules.js","../lib/less/visitors/to-css-visitor.js","../lib/less/visitors/index.js","../lib/less/visitors/set-tree-visibility-visitor.js","../lib/less/visitors/join-selector-visitor.js","../lib/less/functions/function-registry.js","../lib/less/tree/atrule-syntax.js","../lib/less/deprecation.js","../lib/less/parser/parser.js","../lib/less/parser/parser-input.js","../lib/less/tree/selector.js","../lib/less/tree/keyword.js","../lib/less/tree/declaration.js","../lib/less/functions/default.js","../lib/less/tree/ruleset.js","../lib/less/tree/nested-at-rule.js","../lib/less/tree/atrule.js","../lib/less/tree/detached-ruleset.js","../lib/less/tree/operation.js","../lib/less/functions/function-caller.js","../lib/less/tree/call.js","../lib/less/tree/variable.js","../lib/less/tree/property.js","../lib/less/tree/attribute.js","../lib/less/tree/quoted.js","../lib/less/tree/url.js","../lib/less/tree/media.js","../lib/less/tree/import.js","../lib/less/tree/js-eval-node.js","../lib/less/tree/javascript.js","../lib/less/tree/assignment.js","../lib/less/tree/condition.js","../lib/less/tree/query-in-parens.js","../lib/less/tree/container.js","../lib/less/tree/unicode-descriptor.js","../lib/less/tree/negative.js","../lib/less/tree/extend.js","../lib/less/tree/variable-call.js","../lib/less/tree/namespace-value.js","../lib/less/tree/mixin-definition.js","../lib/less/tree/mixin-call.js","../lib/less/tree/index.js","../lib/less/environment/abstract-file-manager.js","../lib/less/environment/abstract-plugin-loader.js","../lib/less/functions/boolean.js","../lib/less/functions/color.js","../lib/less/functions/color-blending.js","../lib/less/functions/data-uri.js","../lib/less/functions/list.js","../lib/less/functions/math-helper.js","../lib/less/functions/math.js","../lib/less/functions/number.js","../lib/less/functions/string.js","../lib/less/functions/svg.js","../lib/less/functions/types.js","../lib/less/functions/style.js","../lib/less/functions/index.js","../lib/less/transform-tree.js","../lib/less/plugin-manager.js","../../../node_modules/.pnpm/parse-node-version@1.0.1/node_modules/parse-node-version/index.js","../lib/less/index.js","../lib/less/source-map-output.js","../lib/less/source-map-builder.js","../lib/less/parse-tree.js","../lib/less/import-manager.js","../lib/less/render.js","../lib/less/parse.js","../lib/less-browser/file-manager.js","../lib/less-browser/plugin-loader.js","../lib/less-browser/log-listener.js","../lib/less-browser/error-reporting.js","../lib/less-browser/bootstrap.js","../lib/less/default-options.js","../lib/less-browser/add-default-options.js","../lib/less-browser/index.js","../lib/less-browser/cache.js","../lib/less-browser/image-size.js"],"sourcesContent":["\nexport function extractId(href) {\n return href.replace(/^[a-z-]+:\\/+?[^/]+/, '') // Remove protocol & domain\n .replace(/[?&]livereload=\\w+/, '') // Remove LiveReload cachebuster\n .replace(/^\\//, '') // Remove root /\n .replace(/\\.[a-zA-Z]+$/, '') // Remove simple extension\n .replace(/[^.\\w-]+/g, '-') // Replace illegal characters\n .replace(/\\./g, ':'); // Replace dots with colons(for valid id)\n}\n\nexport function addDataAttr(options, tag) {\n if (!tag) {return;} // in case of tag is null or undefined\n for (const opt in tag.dataset) {\n if (Object.prototype.hasOwnProperty.call(tag.dataset, opt)) {\n if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') {\n options[opt] = tag.dataset[opt];\n } else {\n try {\n options[opt] = JSON.parse(tag.dataset[opt]);\n }\n catch (_) {}\n }\n }\n }\n}\n","import * as utils from './utils.js';\n\nexport default {\n createCSS: function (document, styles, sheet) {\n // Strip the query-string\n const href = sheet.href || '';\n\n // If there is no title set, use the filename, minus the extension\n const id = `less:${sheet.title || utils.extractId(href)}`;\n\n // If this has already been inserted into the DOM, we may need to replace it\n const oldStyleNode = document.getElementById(id);\n let keepOldStyleNode = false;\n\n // Create a new stylesheet node for insertion or (if necessary) replacement\n const styleNode = document.createElement('style');\n styleNode.setAttribute('type', 'text/css');\n if (sheet.media) {\n styleNode.setAttribute('media', sheet.media);\n }\n styleNode.id = id;\n\n if (!styleNode.styleSheet) {\n styleNode.appendChild(document.createTextNode(styles));\n\n // If new contents match contents of oldStyleNode, don't replace oldStyleNode\n keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger.js';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory === undefined) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors.js';\nimport unitConversions from './unit-conversions.js';\n\nexport default { colors, unitConversions };\n","/**\n * The reason why Node is a class and other nodes simply do not extend\n * from Node (since we're transpiling) is due to this issue:\n * \n * @see https://github.com/less/less.js/issues/3434\n */\nclass Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n }\n\n get currentFileInfo() {\n return this.fileInfo();\n }\n\n get index() {\n return this.getIndex();\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n // remove when genCSS has JSDoc types\n // eslint-disable-next-line no-unused-vars\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks === undefined) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks === undefined) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks === undefined) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","import Node from './node.js';\nimport colors from '../data/colors.js';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nconst Color = function(rgb, a, originalForm) {\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n}\n\nColor.prototype = Object.assign(new Node(), {\n type: 'Color',\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n // eslint-disable-next-line no-fallthrough\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n },\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n },\n\n toRGB() {\n return toHex(this.rgb);\n },\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n },\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n },\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n },\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n});\n\nColor.fromKeyword = function(keyword) {\n let c;\n const key = keyword.toLowerCase();\n // eslint-disable-next-line no-prototype-builtins\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n};\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n }).join('')}`;\n}\n\nexport default Color;\n","import Node from './node.js';\n\nconst Paren = function(node) {\n this.value = node;\n};\n\nParen.prototype = Object.assign(new Node(), {\n type: 'Paren',\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n const paren = new Paren(this.value.eval(context));\n \n if (this.noSpacing) {\n paren.noSpacing = true;\n }\n\n return paren;\n }\n});\n\nexport default Paren;\n","import Node from './node.js';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nconst Combinator = function(value) {\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n}\n\nCombinator.prototype = Object.assign(new Node(), {\n type: 'Combinator',\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n});\n\nexport default Combinator;\n","import Node from './node.js';\nimport Paren from './paren.js';\nimport Combinator from './combinator.js';\n\nconst Element = function(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n}\n\nElement.prototype = Object.assign(new Node(), {\n type: 'Element',\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n },\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n },\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n});\n\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/**\r\n * Returns the object type of the given payload\r\n *\r\n * @param {*} payload\r\n * @returns {string}\r\n */\r\nfunction getType(payload) {\r\n return Object.prototype.toString.call(payload).slice(8, -1);\r\n}\r\n/**\r\n * Returns whether the payload is undefined\r\n *\r\n * @param {*} payload\r\n * @returns {payload is undefined}\r\n */\r\nfunction isUndefined(payload) {\r\n return getType(payload) === 'Undefined';\r\n}\r\n/**\r\n * Returns whether the payload is null\r\n *\r\n * @param {*} payload\r\n * @returns {payload is null}\r\n */\r\nfunction isNull(payload) {\r\n return getType(payload) === 'Null';\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isPlainObject(payload) {\r\n if (getType(payload) !== 'Object')\r\n return false;\r\n return payload.constructor === Object && Object.getPrototypeOf(payload) === Object.prototype;\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isObject(payload) {\r\n return isPlainObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is { [K in any]: never }}\r\n */\r\nfunction isEmptyObject(payload) {\r\n return isPlainObject(payload) && Object.keys(payload).length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isFullObject(payload) {\r\n return isPlainObject(payload) && Object.keys(payload).length > 0;\r\n}\r\n/**\r\n * Returns whether the payload is an any kind of object (including special classes or objects with different prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isAnyObject(payload) {\r\n return getType(payload) === 'Object';\r\n}\r\n/**\r\n * Returns whether the payload is an object like a type passed in < >\r\n *\r\n * Usage: isObjectLike<{id: any}>(payload) // will make sure it's an object and has an `id` prop.\r\n *\r\n * @template T this must be passed in < >\r\n * @param {*} payload\r\n * @returns {payload is T}\r\n */\r\nfunction isObjectLike(payload) {\r\n return isAnyObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a function (regular or async)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is AnyFunction}\r\n */\r\nfunction isFunction(payload) {\r\n return typeof payload === 'function';\r\n}\r\n/**\r\n * Returns whether the payload is an array\r\n *\r\n * @param {any} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isArray(payload) {\r\n return getType(payload) === 'Array';\r\n}\r\n/**\r\n * Returns whether the payload is a an array with at least 1 item\r\n *\r\n * @param {*} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isFullArray(payload) {\r\n return isArray(payload) && payload.length > 0;\r\n}\r\n/**\r\n * Returns whether the payload is a an empty array\r\n *\r\n * @param {*} payload\r\n * @returns {payload is []}\r\n */\r\nfunction isEmptyArray(payload) {\r\n return isArray(payload) && payload.length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is a string\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isString(payload) {\r\n return getType(payload) === 'String';\r\n}\r\n/**\r\n * Returns whether the payload is a string, BUT returns false for ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isFullString(payload) {\r\n return isString(payload) && payload !== '';\r\n}\r\n/**\r\n * Returns whether the payload is ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isEmptyString(payload) {\r\n return payload === '';\r\n}\r\n/**\r\n * Returns whether the payload is a number (but not NaN)\r\n *\r\n * This will return `false` for `NaN`!!\r\n *\r\n * @param {*} payload\r\n * @returns {payload is number}\r\n */\r\nfunction isNumber(payload) {\r\n return getType(payload) === 'Number' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a boolean\r\n *\r\n * @param {*} payload\r\n * @returns {payload is boolean}\r\n */\r\nfunction isBoolean(payload) {\r\n return getType(payload) === 'Boolean';\r\n}\r\n/**\r\n * Returns whether the payload is a regular expression (RegExp)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is RegExp}\r\n */\r\nfunction isRegExp(payload) {\r\n return getType(payload) === 'RegExp';\r\n}\r\n/**\r\n * Returns whether the payload is a Map\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Map}\r\n */\r\nfunction isMap(payload) {\r\n return getType(payload) === 'Map';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakMap\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakMap}\r\n */\r\nfunction isWeakMap(payload) {\r\n return getType(payload) === 'WeakMap';\r\n}\r\n/**\r\n * Returns whether the payload is a Set\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Set}\r\n */\r\nfunction isSet(payload) {\r\n return getType(payload) === 'Set';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakSet\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakSet}\r\n */\r\nfunction isWeakSet(payload) {\r\n return getType(payload) === 'WeakSet';\r\n}\r\n/**\r\n * Returns whether the payload is a Symbol\r\n *\r\n * @param {*} payload\r\n * @returns {payload is symbol}\r\n */\r\nfunction isSymbol(payload) {\r\n return getType(payload) === 'Symbol';\r\n}\r\n/**\r\n * Returns whether the payload is a Date, and that the date is valid\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Date}\r\n */\r\nfunction isDate(payload) {\r\n return getType(payload) === 'Date' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a Blob\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Blob}\r\n */\r\nfunction isBlob(payload) {\r\n return getType(payload) === 'Blob';\r\n}\r\n/**\r\n * Returns whether the payload is a File\r\n *\r\n * @param {*} payload\r\n * @returns {payload is File}\r\n */\r\nfunction isFile(payload) {\r\n return getType(payload) === 'File';\r\n}\r\n/**\r\n * Returns whether the payload is a Promise\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Promise}\r\n */\r\nfunction isPromise(payload) {\r\n return getType(payload) === 'Promise';\r\n}\r\n/**\r\n * Returns whether the payload is an Error\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Error}\r\n */\r\nfunction isError(payload) {\r\n return getType(payload) === 'Error';\r\n}\r\n/**\r\n * Returns whether the payload is literally the value `NaN` (it's `NaN` and also a `number`)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is typeof NaN}\r\n */\r\nfunction isNaNValue(payload) {\r\n return getType(payload) === 'Number' && isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a primitive type (eg. Boolean | Null | Undefined | Number | String | Symbol)\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is boolean | null | undefined | number | string | symbol)}\r\n */\r\nfunction isPrimitive(payload) {\r\n return (isBoolean(payload) ||\r\n isNull(payload) ||\r\n isUndefined(payload) ||\r\n isNumber(payload) ||\r\n isString(payload) ||\r\n isSymbol(payload));\r\n}\r\n/**\r\n * Returns true whether the payload is null or undefined\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is null | undefined)}\r\n */\r\nvar isNullOrUndefined = isOneOf(isNull, isUndefined);\r\nfunction isOneOf(a, b, c, d, e) {\r\n return function (value) {\r\n return a(value) || b(value) || (!!c && c(value)) || (!!d && d(value)) || (!!e && e(value));\r\n };\r\n}\r\n/**\r\n * Does a generic check to check that the given payload is of a given type.\r\n * In cases like Number, it will return true for NaN as NaN is a Number (thanks javascript!);\r\n * It will, however, differentiate between object and null\r\n *\r\n * @template T\r\n * @param {*} payload\r\n * @param {T} type\r\n * @throws {TypeError} Will throw type error if type is an invalid type\r\n * @returns {payload is T}\r\n */\r\nfunction isType(payload, type) {\r\n if (!(type instanceof Function)) {\r\n throw new TypeError('Type must be a function');\r\n }\r\n if (!Object.prototype.hasOwnProperty.call(type, 'prototype')) {\r\n throw new TypeError('Type is not a class');\r\n }\r\n // Classes usually have names (as functions usually have names)\r\n var name = type.name;\r\n return getType(payload) === name || Boolean(payload && payload.constructor === type);\r\n}\n\nexport { getType, isAnyObject, isArray, isBlob, isBoolean, isDate, isEmptyArray, isEmptyObject, isEmptyString, isError, isFile, isFullArray, isFullObject, isFullString, isFunction, isMap, isNaNValue, isNull, isNullOrUndefined, isNumber, isObject, isObjectLike, isOneOf, isPlainObject, isPrimitive, isPromise, isRegExp, isSet, isString, isSymbol, isType, isUndefined, isWeakMap, isWeakSet };\n","import { isArray, isPlainObject } from 'is-what';\n\nfunction assignProp(carry, key, newVal, originalObject, includeNonenumerable) {\r\n const propType = {}.propertyIsEnumerable.call(originalObject, key)\r\n ? 'enumerable'\r\n : 'nonenumerable';\r\n if (propType === 'enumerable')\r\n carry[key] = newVal;\r\n if (includeNonenumerable && propType === 'nonenumerable') {\r\n Object.defineProperty(carry, key, {\r\n value: newVal,\r\n enumerable: false,\r\n writable: true,\r\n configurable: true,\r\n });\r\n }\r\n}\r\n/**\r\n * Copy (clone) an object and all its props recursively to get rid of any prop referenced of the original object. Arrays are also cloned, however objects inside arrays are still linked.\r\n *\r\n * @export\r\n * @template T\r\n * @param {T} target Target can be anything\r\n * @param {Options} [options = {}] Options can be `props` or `nonenumerable`\r\n * @returns {T} the target with replaced values\r\n * @export\r\n */\r\nfunction copy(target, options = {}) {\r\n if (isArray(target)) {\r\n return target.map((item) => copy(item, options));\r\n }\r\n if (!isPlainObject(target)) {\r\n return target;\r\n }\r\n const props = Object.getOwnPropertyNames(target);\r\n const symbols = Object.getOwnPropertySymbols(target);\r\n return [...props, ...symbols].reduce((carry, key) => {\r\n if (isArray(options.props) && !options.props.includes(key)) {\r\n return carry;\r\n }\r\n const val = target[key];\r\n const newVal = copy(val, options);\r\n assignProp(carry, key, newVal, target, options.nonenumerable);\r\n return carry;\r\n }, {});\r\n}\n\nexport { copy };\n","/* jshint proto: true */\nimport * as Constants from './constants.js';\nimport { copy } from 'copy-anything';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = copy(obj1);\n newObj._defaults = defaults;\n const cloned = obj2 ? copy(obj2) : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (Object.prototype.hasOwnProperty.call(obj2, prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}\n\nexport function isNullOrUndefined(val) {\n return val === null || val === undefined\n}","import * as utils from './utils.js';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n \n // Set type early so it's always available, even if fileContentMap is missing\n this.type = e.type || 'Syntax';\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n var line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n *\n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n lineAdjust = 1 - parseInt(match[2]);\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n options = options || {};\n const isWarning = (this.type ?? '').toLowerCase().includes('warning');\n const type = isWarning ? this.type : `${this.type}Error`;\n const color = isWarning ? 'yellow' : 'red';\n\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (!isWarning && typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].slice(this.column, this.column + 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (!isWarning && typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${type}: ${this.message}`, color);\n if (this.filename) {\n message += stylize(' in ', color) + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', color) + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;\n","import tree from '../tree/index.js';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants.js';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (Object.prototype.hasOwnProperty.call(original, propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead. All modes ('comments', 'mediaquery', 'all') will be removed in a future version.\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager', // Used as the plugin manager for the session\n 'quiet', // option - whether to log warnings\n 'quietDeprecations', // option - whether to suppress deprecation warnings only\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n importItem.args = Array.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","/* eslint-disable no-unused-vars */\n/**\n * @todo - Remove unused when JSDoc types are added for visitor methods\n */\nimport contexts from '../contexts.js';\nimport Visitor from './visitor.js';\nimport ImportSequencer from './import-sequencer.js';\nimport * as utils from '../utils.js';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this,\n inlineCSS = importNode.options.inline,\n isPlugin = importNode.options.isPlugin,\n isOptional = importNode.options.optional,\n duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n if (atRuleNode.value) {\n this.context.frames.unshift(atRuleNode);\n } else if (atRuleNode.declarations && atRuleNode.declarations.length) {\n if (atRuleNode.isRooted) {\n this.context.frames.unshift(atRuleNode);\n } else {\n this.context.frames.unshift(atRuleNode.declarations[0]);\n }\n } else if (atRuleNode.rules && atRuleNode.rules.length) {\n this.context.frames.unshift(atRuleNode);\n }\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","/* eslint-disable no-unused-vars */\n/**\n * @todo - Remove unused when JSDoc types are added for visitor methods\n */\nimport tree from '../tree/index.js';\nimport Visitor from './visitor.js';\nimport logger from '../logger.js';\nimport * as utils from '../utils.js';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(extend) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n /**\n * @todo Shouldn't this be an error? To alert the developer\n * that they may have made an error in the selector they are\n * targeting?\n */\n logger.warn(`WARNING: extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const paths = rulesetNode.paths;\n const pathCount = paths.length;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (let extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n const extend = allExtends[extendIndex];\n for (let pathIndex = 0; pathIndex < pathCount; pathIndex++) {\n const selectorPath = paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n const selfSelectors = extend.selfSelectors;\n const isVisible = extend.isVisible();\n for (let si = 0; si < selfSelectors.length; si++) {\n selectorsToAdd.push(this.extendSelector(matches, selectorPath, selfSelectors[si], isVisible));\n }\n }\n }\n }\n rulesetNode.paths = paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!this.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(function (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","/**\n * @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead.\n * This will be removed in a future version.\n * \n * @param {Object} ctx - Context object with debugInfo\n * @returns {string} Debug info as CSS comment\n */\nfunction asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n}\n\n/**\n * @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead.\n * This function generates Sass-compatible debug info using @media -sass-debug-info syntax.\n * This format had short-lived usage and is no longer recommended.\n * This will be removed in a future version.\n * \n * @param {Object} ctx - Context object with debugInfo\n * @returns {string} Sass-compatible debug info as @media query\n */\nfunction asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '/';\n }\n return `\\\\${a}`;\n })}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n}\n\n/**\n * Generates debug information (line numbers) for CSS output.\n * \n * @param {Object} context - Context object with dumpLineNumbers option\n * @param {Object} ctx - Context object with debugInfo\n * @param {string} [lineSeparator] - Separator between comment and media query (for 'all' mode)\n * @returns {string} Debug info string\n * \n * @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead.\n * All modes ('comments', 'mediaquery', 'all') are deprecated and will be removed in a future version.\n * The 'mediaquery' and 'all' modes generate Sass-compatible @media -sass-debug-info output\n * which had short-lived usage and is no longer recommended.\n */\nfunction debugInfo(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = asComment(ctx);\n break;\n case 'mediaquery':\n result = asMediaQuery(ctx);\n break;\n case 'all':\n result = asComment(ctx) + (lineSeparator || '') + asMediaQuery(ctx);\n break;\n }\n }\n return result;\n}\n\nexport default debugInfo;\n\n","import Node from './node.js';\nimport getDebugInfo from './debug-info.js';\n\nconst Comment = function(value, isLineComment, index, currentFileInfo) {\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n}\n\nComment.prototype = Object.assign(new Node(), {\n type: 'Comment',\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n },\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n});\n\nexport default Comment;\n","import Node from './node.js';\nimport unitConversions from '../data/unit-conversions.js';\nimport * as utils from '../utils.js';\n\nconst Unit = function(numerator, denominator, backupUnit) {\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n};\n\nUnit.prototype = Object.assign(new Node(), {\n type: 'Unit',\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n },\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n },\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n },\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n },\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n },\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n },\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n },\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n },\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n },\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n // eslint-disable-next-line no-prototype-builtins\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n // eslint-disable-next-line no-prototype-builtins\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n },\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n // eslint-disable-next-line no-prototype-builtins\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n});\n\nexport default Unit;\n","/* eslint-disable no-prototype-builtins */\nimport Node from './node.js';\nimport unitConversions from '../data/unit-conversions.js';\nimport Unit from './unit.js';\nimport Color from './color.js';\n\n//\n// A number with a unit\n//\nconst Dimension = function(value, unit) {\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n};\n\nDimension.prototype = Object.assign(new Node(), {\n type: 'Dimension',\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n },\n\n // remove when Nodes have JSDoc types\n // eslint-disable-next-line no-unused-vars\n eval(context) {\n return this;\n },\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n },\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).slice(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n },\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value);\n let unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error('Incompatible units. Change the units or use the unit function. '\n + `Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n },\n\n compare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n },\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n },\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n});\n\nexport default Dimension;\n","import Node from './node.js';\n\nconst Anonymous = function(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n}\n\nAnonymous.prototype = Object.assign(new Node(), {\n type: 'Anonymous',\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n },\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n },\n isRulesetLike() {\n return this.rulesetLike;\n },\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n})\n\nexport default Anonymous;\n","import Node from './node.js';\nimport Paren from './paren.js';\nimport Comment from './comment.js';\nimport Dimension from './dimension.js';\nimport Anonymous from './anonymous.js';\n\nconst Expression = function(value, noSpacing) {\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n};\n\nExpression.prototype = Object.assign(new Node(), {\n type: 'Expression',\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n },\n\n eval(context) {\n const noSpacing = this.noSpacing;\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen\n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n returnValue.noSpacing = returnValue.noSpacing || noSpacing;\n return returnValue;\n },\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n if (!(this.value[i + 1] instanceof Anonymous) ||\n this.value[i + 1] instanceof Anonymous && this.value[i + 1].value !== ',') {\n output.add(' ');\n }\n }\n }\n },\n\n throwAwayComments() {\n this.value = this.value.filter(function(v) {\n return !(v instanceof Comment);\n });\n }\n});\n\nexport default Expression;\n","import Node from './node.js';\n\nconst Value = function(value) {\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n};\n\nValue.prototype = Object.assign(new Node(), {\n type: 'Value',\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n },\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n },\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n});\n\nexport default Value;\n","import Expression from './expression.js';\nimport Value from './value.js';\n\n/**\n * Merges declarations with merge flags (+ or ,) into combined values.\n * Used by both the ToCSSVisitor and AtRule eval.\n */\nexport default function mergeRules(rules) {\n if (!rules) {\n return;\n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) :\n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new Value(comma);\n }\n });\n}\n","/* eslint-disable no-unused-vars */\n/**\n * @todo - Remove unused when JSDoc types are added for visitor methods\n */\nimport tree from '../tree/index.js';\nimport Visitor from './visitor.js';\nimport mergeRules from '../tree/merge-rules.js';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n for (let i = rules.length - 1; i >= 0 ; i--) {\n let rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!Object.prototype.hasOwnProperty.call(ruleCache, rule.name)) {\n ruleCache[rule.name] = rule;\n } else {\n let ruleList = ruleCache[rule.name];\n if (!Array.isArray(ruleList)) {\n const prevRuleCSS = ruleList.toCSS(this._context);\n ruleList = ruleCache[rule.name] = [prevRuleCSS];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: mergeRules\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor.js';\nimport ImportVisitor from './import-visitor.js';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor.js';\nimport ExtendVisitor from './extend-visitor.js';\nimport JoinSelectorVisitor from './join-selector-visitor.js';\nimport ToCSSVisitor from './to-css-visitor.js';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","/* eslint-disable no-unused-vars */\n/**\n * @todo - Remove unused when JSDoc types are added for visitor methods\n */\nimport Visitor from './visitor.js';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n\n if (atRuleNode.declarations && atRuleNode.declarations.length) {\n atRuleNode.declarations[0].root = (context.length === 0 || context[0].multiMedia);\n }\n else if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n // eslint-disable-next-line no-prototype-builtins\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","export const MediaSyntaxOptions = {\n queryInParens: true\n};\n\nexport const ContainerSyntaxOptions = {\n queryInParens: true\n};\n","/**\n * Deprecation registry for Less.js\n *\n * Each deprecation has a unique ID and description.\n * Repetition limiting caps warnings at 5 per deprecation type per parse.\n * Use --quiet-deprecations to suppress all deprecation warnings.\n */\n\nconst deprecations = {\n 'mixin-call-no-parens': {\n description: 'Calling a mixin without parentheses is deprecated.'\n },\n 'mixin-call-whitespace': {\n description: 'Whitespace between a mixin name and parentheses for a mixin call is deprecated.'\n },\n 'dot-slash-operator': {\n description: 'The ./ operator is deprecated.'\n },\n 'variable-in-unknown-value': {\n description: '@[ident] in custom property values is treated as literal text.'\n },\n 'property-in-unknown-value': {\n description: '$[ident] in custom property values is treated as literal text.'\n },\n 'js-eval': {\n description: 'Inline JavaScript evaluation (backtick expressions) is deprecated and will be removed in Less 5.x.'\n },\n 'at-plugin': {\n description: 'The @plugin directive is deprecated and will be removed in Less 5.x.'\n },\n 'dump-line-numbers': {\n description: 'The dumpLineNumbers option is deprecated and will be removed in Less 5.x.'\n },\n 'math-always': {\n description: '--math=always is deprecated and will be removed in Less 5.x.'\n }\n};\n\nconst MAX_REPETITIONS = 5;\n\nclass DeprecationHandler {\n constructor() {\n this._counts = {};\n }\n\n shouldWarn(deprecationId) {\n if (!deprecationId) { return true; }\n const count = (this._counts[deprecationId] || 0) + 1;\n this._counts[deprecationId] = count;\n return count <= MAX_REPETITIONS;\n }\n\n summarize(logger) {\n for (const id of Object.keys(this._counts)) {\n const omitted = this._counts[id] - MAX_REPETITIONS;\n if (omitted > 0) {\n logger.warn(`${omitted} repetitive \"${id}\" deprecation warning(s) omitted.`);\n }\n }\n }\n}\n\nexport { deprecations, DeprecationHandler, MAX_REPETITIONS };\nexport default { deprecations, DeprecationHandler };\n","import LessError from '../less-error.js';\nimport tree from '../tree/index.js';\nimport visitors from '../visitors/index.js';\nimport getParserInput from './parser-input.js';\nimport * as utils from '../utils.js';\nimport functionRegistry from '../functions/function-registry.js';\nimport { ContainerSyntaxOptions, MediaSyntaxOptions } from '../tree/atrule-syntax.js';\nimport logger from '../logger.js';\nimport { DeprecationHandler } from '../deprecation.js';\nimport Selector from '../tree/selector.js';\nimport Anonymous from '../tree/anonymous.js';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo, currentIndex) {\n currentIndex = currentIndex || 0;\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n const deprecationHandler = new DeprecationHandler();\n\n /**\n * @param {string} msg\n * @param {number} index\n * @param {string} type\n * @param {string} [deprecationId] - stable deprecation ID for repetition limiting\n */\n function warn(msg, index, type, deprecationId) {\n if (context.quiet) { return; }\n if (deprecationId && context.quietDeprecations) { return; }\n if (deprecationId && !deprecationHandler.shouldWarn(deprecationId)) { return; }\n\n logger.warn(\n (new LessError(\n {\n index: index ?? parserInput.i,\n filename: fileInfo.filename,\n type: type ? `${type.toUpperCase()} WARNING` : 'WARNING',\n message: msg\n },\n imports\n )).toString()\n );\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n\n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n *\n * @param {String} str - string to parse\n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str);\n for (let x = 0, p; (p = parseList[x]); x++) {\n result = parsers[p]();\n returnNodes.push(result || null);\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let err = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n // Optionally disable @plugin parsing\n if (additionalData && additionalData.disablePluginRule) {\n parsers.plugin = function() {\n var dir = parserInput.$re(/^@plugin?\\s+/);\n if (dir) {\n error('@plugin statements are not allowed when disablePluginRule is set to true');\n }\n }\n }\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str);\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n\n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n err = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = err || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) ||\n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index + currentIndex, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.slice(1, -1), isEscaped, index + currentIndex, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w.]+)\\(/);\n if (!name) {\n parserInput.forget();\n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index + currentIndex, fileInfo);\n },\n\n declarationCall: function () {\n let validCall;\n let args;\n const index = parserInput.i;\n\n parserInput.save();\n\n validCall = parserInput.$re(/^[\\w]+\\(/);\n if (!validCall) {\n parserInput.forget();\n return;\n }\n\n validCall = validCall.substring(0, validCall.length - 1);\n\n // CSS at-rule keywords should never be parsed as declaration calls\n if (/^(and|or|not|only|layer)$/i.test(validCall)) {\n parserInput.restore();\n return;\n }\n\n let rule = this.ruleProperty();\n let value;\n \n if (rule) {\n value = this.value();\n }\n \n if (rule && value) {\n args = [new (tree.Declaration)(rule, value, null, null, parserInput.i + currentIndex, fileInfo, true)];\n }\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(validCall, args, index + currentIndex, fileInfo);\n },\n\n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result,\n // otherwise continue for plain args\n };\n }\n\n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[()'\"])|[^()'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value !== undefined ||\n value instanceof tree.Variable ||\n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index + currentIndex, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if ((ch === '(' && !parserInput.prevChar().match(/^\\s/))\n || (ch === '[' && !parserInput.prevChar().match(/^\\s/))) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index + currentIndex, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index + currentIndex, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index + currentIndex, fileInfo);\n }\n },\n\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n }\n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n warn('Inline JavaScript evaluation (backtick expressions) is deprecated and will be removed in Less 5.x. Use Less functions or custom plugins instead.', index, 'DEPRECATED', 'js-eval');\n parserInput.forget();\n return new(tree.JavaScript)(js.slice(0, -1), Boolean(escape), index + currentIndex, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n let first = true;\n while (!(option = parserInput.$re(/^(!?all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n\n if (!e) {\n break;\n }\n /**\n * @note - This will not catch selectors in pseudos like :is() and :where() because\n * they don't currently parse their contents as selectors.\n */\n if (!first && e.combinator.value) {\n warn('Targeting complex selectors can have unexpected behavior, and this behavior may change in the future.', index)\n }\n\n first = false;\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index + currentIndex, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n let parensIndex;\n let parensWS = false;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n parensIndex = parserInput.i;\n parensWS = parserInput.isWhitespace(-1);\n if (parserInput.$char('(')) { \n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n if (parensWS) {\n warn('Whitespace between a mixin name and parentheses for a mixin call is deprecated', parensIndex, 'DEPRECATED', 'mixin-call-whitespace');\n }\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (inValue && !lookups && !hasParens) {\n // This isn't a valid in-value mixin call\n parserInput.restore();\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index + currentIndex, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n if (!hasParens) {\n warn('Calling a mixin without parentheses is deprecated', parensIndex, 'DEPRECATED', 'mixin-call-no-parens');\n }\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n\n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex + currentIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n\n ruleLookups: function() {\n let rule;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') {\n return;\n }\n\n while (true) {\n parserInput.save();\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n\n lookupValue: function() {\n parserInput.save();\n\n if (!parserInput.$char('[')) {\n parserInput.restore();\n return;\n }\n\n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n\n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n }\n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n\n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n /** \n * A Selector Element\n *\n * div\n * + h1\n * #socks\n * input[type=\"text\"]\n *\n * Elements are the building blocks for Selectors,\n * they are made out of a `Combinator` (see combinator rule),\n * and an element name, such as a tag a class, or `*`.\n */\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n /** This selector parser is quite simplistic and will pass a number of invalid selectors. */\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n // eslint-disable-next-line no-control-regex\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false))) {\n let selectors = [];\n while (parserInput.$char(',')) {\n selectors.push(v);\n selectors.push(new Anonymous(','));\n v = this.selector(false);\n }\n selectors.push(v);\n \n if (parserInput.$char(')')) {\n if (selectors.length > 1) {\n e = new (tree.Paren)(new Selector(selectors));\n } else {\n e = new(tree.Paren)(v);\n }\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index + currentIndex, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (Array.isArray(e)){\n e.forEach(ele => elements.push(ele));\n } if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index + currentIndex, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error('Guards are only currently allowed on a single selector.');\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error('Guards are only currently allowed on a single selector.');\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n //\n // case-insensitive flag\n // e.g. [attr operator value i]\n //\n let cif;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n if (val) {\n cif = parserInput.$re(/^[iIsS]/);\n }\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val, cif);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n if (block) {\n return new tree.Ruleset(null, block);\n }\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not\n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n if (parserInput.$char(';')) {\n value = new Anonymous('');\n } else {\n value = this.permissiveValue(/[;}]/, true);\n }\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index + currentIndex, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n /**\n * As a last resort, try permissiveValue\n *\n * @todo - This has created some knock-on problems of not\n * flagging incorrect syntax or detecting user intent.\n */\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index + currentIndex, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@$+/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index + currentIndex);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n *\n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n * \n * @param {RexExp} untilTokens - Characters to stop parsing at\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n if (parserInput.peek(',')) {\n value.push(new (tree.Anonymous)(',', parserInput.i));\n parserInput.$char(',');\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n /** @type {string} */\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n const variableRegex = /@([\\w-]+)/g;\n const propRegex = /\\$([\\w-]+)/g;\n if (variableRegex.test(item)) {\n warn('@[ident] in unknown values will not be evaluated as variables in the future. Use @{[ident]}', index, 'DEPRECATED', 'variable-in-unknown-value');\n }\n if (propRegex.test(item)) {\n warn('$[ident] in unknown values will not be evaluated as property references in the future. Use ${[ident]}', index, 'DEPRECATED', 'property-in-unknown-value');\n }\n quote.variableRegex = /@([\\w-]+)|@{([\\w-]+)}/g;\n quote.propRegex = /\\$([\\w-]+)|\\${([\\w-]+)}/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures({});\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index + currentIndex, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function (syntaxOptions) {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n let rangeP;\n let spacing = false;\n parserInput.save();\n do {\n parserInput.save();\n if (parserInput.$re(/^[0-9a-z-]*\\s+\\(/)) {\n spacing = true;\n }\n parserInput.restore();\n\n e = entities.declarationCall.bind(this)() || entities.keyword() || entities.variable() || entities.mixinLookup()\n if (e) {\n nodes.push(e);\n if (e.type === 'Variable' ||\n (e.type === 'Keyword' && /^(and|or|not|only)$/i.test(e.value))) {\n spacing = true;\n }\n } else if (parserInput.$char('(')) {\n p = this.property();\n parserInput.save();\n if (!p && syntaxOptions.queryInParens && parserInput.$re(/^[0-9a-z-]*\\s*([<>]=|<=|>=|[<>]|=)/)) {\n parserInput.restore();\n p = this.condition();\n\n parserInput.save();\n rangeP = this.atomicCondition(null, p.rvalue);\n if (!rangeP) {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n e = this.value();\n }\n if (parserInput.$char(')')) {\n if (p && !e) {\n nodes.push(new (tree.Paren)(new (tree.QueryInParens)(p.op, p.lvalue, p.rvalue, rangeP ? rangeP.op : null, rangeP ? rangeP.rvalue : null, p._index)));\n e = p;\n } else if (p && e) {\n nodes.push(new (tree.Paren)(new (tree.Declaration)(p, e, null, null, parserInput.i + currentIndex, fileInfo, true)));\n if (!spacing) {\n nodes[nodes.length - 1].noSpacing = true;\n }\n spacing = false;\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n spacing = false;\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function (syntaxOptions) {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature(syntaxOptions);\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n else if (!features[features.length - 1].noSpacing) {\n features[features.length - 1].noSpacing = false;\n }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n else if (!features[features.length - 1].noSpacing) {\n features[features.length - 1].noSpacing = false;\n }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n prepareAndGetNestableAtRule: function (treeType, index, debugInfo, syntaxOptions) {\n const features = this.mediaFeatures(syntaxOptions);\n\n const rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n const atRule = new (treeType)(rules, features, index + currentIndex, fileInfo);\n if (context.dumpLineNumbers) {\n atRule.debugInfo = debugInfo;\n }\n\n return atRule;\n },\n\n nestableAtRule: function () {\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n parserInput.save();\n\n if (parserInput.$peekChar('@')) {\n if (parserInput.$str('@media')) {\n return this.prepareAndGetNestableAtRule(tree.Media, index, debugInfo, MediaSyntaxOptions);\n }\n\n if (parserInput.$str('@container')) {\n return this.prepareAndGetNestableAtRule(tree.Container, index, debugInfo, ContainerSyntaxOptions);\n }\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin\\s+/);\n\n if (dir) {\n warn('The @plugin directive is deprecated and will be removed in Less 5.x. Use --plugin CLI option or the programmatic plugin API instead.', index, 'DEPRECATED', 'at-plugin');\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index + currentIndex, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else {\n parserInput.restore();\n return null;\n }\n },\n atruleUnknown: function (value, name, hasBlock) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(''.concat(name, ' rule is missing block or ending semi-colon'));\n }\n }\n else if (!value.value) {\n value = null;\n }\n return [value, hasBlock];\n },\n atruleBlock: function (rules, value, isRooted, isKeywordList) {\n rules = this.blockRuleset();\n parserInput.save();\n if (!rules && !isRooted) {\n value = this.entity();\n rules = this.blockRuleset();\n }\n if (!rules && !isRooted) {\n parserInput.restore();\n var e = [];\n value = this.entity();\n while (parserInput.$char(',')) {\n e.push(value);\n value = this.entity();\n }\n if (value && e.length > 0) {\n e.push(value);\n value = e;\n isKeywordList = true;\n }\n else {\n rules = this.blockRuleset();\n }\n }\n else {\n parserInput.forget();\n }\n \n return [rules, value, isKeywordList];\n },\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n let isKeywordList = false;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.nestableAtRule();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n case '@starting-style':\n isRooted = false;\n break;\n case '@layer':\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n const unknownPackage = this.atruleUnknown(value, name, hasBlock);\n value = unknownPackage[0];\n hasBlock = unknownPackage[1];\n }\n \n if (hasBlock) {\n let blockPackage = this.atruleBlock(rules, value, isRooted, isKeywordList);\n rules = blockPackage[0];\n value = blockPackage[1];\n isKeywordList = blockPackage[2];\n\n if (!rules && !hasUnknown) {\n parserInput.restore();\n name = parserInput.$re(/^@[a-z-]+/);\n const unknownPackage = this.atruleUnknown(value, name, hasBlock);\n value = unknownPackage[0];\n hasBlock = unknownPackage[1];\n if (hasBlock) {\n blockPackage = this.atruleBlock(rules, value, isRooted, isKeywordList);\n rules = blockPackage[0];\n value = blockPackage[1];\n isKeywordList = blockPackage[2];\n }\n }\n }\n\n if (rules || isKeywordList || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index + currentIndex, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index + currentIndex);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n colorOperand: function () {\n parserInput.save();\n\n // hsl or rgb or lch operand\n const match = parserInput.$re(/^[lchrgbs]\\s+/);\n if (match) {\n parserInput.forget();\n return new tree.Keyword(match[0]);\n }\n\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*');\n if (!op) {\n let index = parserInput.i;\n op = parserInput.$str('./');\n if (op) {\n warn('./ operator is deprecated', index, 'DEPRECATED', 'dot-slash-operator');\n }\n }\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index + currentIndex);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens, preparsedCond) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n const cond = (function() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }).bind(this)\n\n if (preparsedCond) {\n a = preparsedCond;\n } else {\n a = cond();\n }\n\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index + currentIndex, false);\n } else {\n error('expected expression');\n }\n } else if (!preparsedCond) {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index + currentIndex, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@$(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n this.colorOperand() || entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e && !e.isLineComment) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index + currentIndex));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k] + currentIndex, fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k] + currentIndex, fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","export default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.slice(comment.index, parserInput.i);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.slice(parserInput.i, nextStarSlash + 2),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$peekChar = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar: {\n const str = input.slice(currentPosition, currentPosition + i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n }\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.slice(lastPos, i);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' &&\n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.slice(lastPos, i + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.slice(lastPos, i), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']': {\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n chunks = [str];\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","import Node from './node.js';\nimport Element from './element.js';\nimport LessError from '../less-error.js';\nimport * as utils from '../utils.js';\nimport Parser from '../parser/parser.js';\n\nconst Selector = function(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n};\n\nSelector.prototype = Object.assign(new Node(), {\n type: 'Selector',\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (!utils.isNullOrUndefined(evaldCondition)) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n },\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n new Parser(this.parse.context, this.parse.importManager, this._fileInfo, this._index).parseNode(\n els,\n ['selector'],\n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n },\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n },\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n },\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v.value.value || v.value);\n }).join('').match(/[,*.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n },\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n },\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n if (elements) {\n const evaldElements = new Array(elements.length);\n for (let i = 0; i < elements.length; i++) {\n evaldElements[i] = elements[i].eval(context);\n }\n elements = evaldElements;\n }\n if (extendList) {\n const evaldExtends = new Array(extendList.length);\n for (let i = 0; i < extendList.length; i++) {\n evaldExtends[i] = extendList[i].eval(context);\n }\n extendList = evaldExtends;\n }\n\n return this.createDerived(elements, extendList, evaldCondition);\n },\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n },\n\n getIsOutput() {\n return this.evaldCondition;\n }\n});\n\nexport default Selector;\n","import Node from './node.js';\n\nconst Keyword = function(value) {\n this.value = value;\n};\n\nKeyword.prototype = Object.assign(new Node(), {\n type: 'Keyword',\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n});\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node.js';\nimport Value from './value.js';\nimport Keyword from './keyword.js';\nimport Anonymous from './anonymous.js';\nimport * as Constants from '../constants.js';\nconst MATH = Constants.Math;\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nconst Declaration = function(name, value, important, merge, index, currentFileInfo, inline, variable) {\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n};\n\nDeclaration.prototype = Object.assign(new Node(), {\n type: 'Declaration',\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n },\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n },\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n});\n\nexport default Declaration;","import Keyword from '../tree/keyword.js';\nimport * as utils from '../utils.js';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (!utils.isNullOrUndefined(v)) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node.js';\nimport Declaration from './declaration.js';\nimport Keyword from './keyword.js';\nimport Comment from './comment.js';\nimport Paren from './paren.js';\nimport Selector from './selector.js';\nimport Element from './element.js';\nimport Anonymous from './anonymous.js';\nimport contexts from '../contexts.js';\nimport globalFunctionRegistry from '../functions/function-registry.js';\nimport defaultFunc from '../functions/default.js';\nimport getDebugInfo from './debug-info.js';\nimport * as utils from '../utils.js';\nimport Parser from '../parser/parser.js';\n\nconst Ruleset = function(selectors, rules, strictImports, visibilityInfo) {\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n}\n\nRuleset.prototype = Object.assign(new Node(), {\n type: 'Ruleset',\n isRuleset: true,\n\n isRulesetLike() { return true; },\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n eval(context) {\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (let j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n const startingIndex = selectors[0].getIndex();\n const selectorFileInfo = selectors[0].fileInfo();\n new Parser(context, this.parse.importManager, selectorFileInfo, startingIndex).parseNode(\n toParseSelectors.join(','),\n ['selectors'],\n function(err, result) {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n let foundRegistry;\n for (let fi = 0, fn = ctxFrames.length; fi !== fn; ++fi) {\n foundRegistry = ctxFrames[fi].functionRegistry;\n if (foundRegistry) { break; }\n }\n ruleset.functionRegistry = (foundRegistry || globalFunctionRegistry).inherit();\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (let j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n },\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n },\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n },\n\n matchArgs(args) {\n return !args || args.length === 0;\n },\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n },\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n },\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (Object.prototype.hasOwnProperty.call(vars, name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n },\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n },\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n },\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n new Parser(this.parse.context, this.parse.importManager, decl.fileInfo(), decl.value.getIndex()).parseNode(\n decl.value.value,\n ['value', 'important'],\n function(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n for (let ti = 0; ti < toParse.length; ti++) {\n nodes.push(transformDeclaration.call(self, toParse[ti]));\n }\n return nodes;\n }\n },\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n },\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n },\n\n find(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (rule) {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n },\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n },\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n },\n\n joinSelector(paths, context, selector) {\n\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen, j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element, selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n return selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i, sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector !== null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n\n // Check if this is a comma-separated selector list inside the paren\n // e.g. :not(&.a, &.b) produces Selector([Selector, Anonymous(','), Selector])\n const hasSubSelectors = nestedSelector.elements.some(e => e instanceof Selector);\n\n if (hasSubSelectors) {\n // Process each sub-selector individually\n const resolvedElements = [];\n for (const subEl of nestedSelector.elements) {\n if (subEl instanceof Selector) {\n const subPaths = [];\n const subReplaced = replaceParentSelector(subPaths, context, subEl);\n replaced = replaced || subReplaced;\n if (subPaths.length > 0 && subPaths[0].length > 0) {\n resolvedElements.push(subPaths[0][0]);\n } else {\n resolvedElements.push(subEl);\n }\n } else {\n resolvedElements.push(subEl);\n }\n }\n hadParentSelector = hadParentSelector || replaced;\n const resolvedNestedSelector = new Selector(resolvedElements);\n const replacementSelector = createSelector(createParenthesis([resolvedNestedSelector], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n } else {\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n});\n\nexport default Ruleset;\n","import Ruleset from './ruleset.js';\nimport Value from './value.js';\nimport Selector from './selector.js';\nimport Anonymous from './anonymous.js';\nimport Expression from './expression.js';\nimport * as utils from '../utils.js';\n\nconst NestableAtRulePrototype = {\n\n isRulesetLike() {\n return true;\n },\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n evalFunction: function () {\n if (!this.features || !Array.isArray(this.features.value) || this.features.value.length < 1) {\n return;\n }\n\n const exprValues = this.features.value;\n let expr, paren;\n\n for (let index = 0; index < exprValues.length; ++index) {\n expr = exprValues[index];\n\n if ((expr.type === 'Keyword' || expr.type === 'Variable')\n && index + 1 < exprValues.length\n && (expr.noSpacing || expr.noSpacing == null)) {\n paren = exprValues[index + 1];\n \n if (paren.type === 'Paren' && paren.noSpacing) {\n exprValues[index]= new Expression([expr, paren]);\n exprValues.splice(index + 1, 1);\n exprValues[index].noSpacing = true;\n }\n }\n }\n },\n\n evalTop(context) {\n this.evalFunction();\n\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n },\n\n evalNested(context) {\n this.evalFunction();\n\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n if (path[i].type !== this.type) {\n const blockIndex = context.mediaBlocks.indexOf(this);\n if (blockIndex > -1) {\n context.mediaBlocks.splice(blockIndex, 1);\n }\n return this;\n }\n \n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n },\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n },\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n};\n\nexport default NestableAtRulePrototype;\n","import Node from './node.js';\nimport Selector from './selector.js';\nimport Ruleset from './ruleset.js';\nimport Anonymous from './anonymous.js';\nimport NestableAtRulePrototype from './nested-at-rule.js';\nimport mergeRules from './merge-rules.js';\n\nconst AtRule = function(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n) {\n let i;\n var selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n const allDeclarations = this.declarationsBlock(rules);\n \n let allRulesetDeclarations = true;\n rules.forEach(rule => {\n if (rule.type === 'Ruleset' && rule.rules) allRulesetDeclarations = allRulesetDeclarations && this.declarationsBlock(rule.rules, true);\n });\n\n if (allDeclarations && !isRooted) {\n this.simpleBlock = true;\n this.declarations = rules;\n } else if (allRulesetDeclarations && rules.length === 1 && !isRooted && !value) {\n this.simpleBlock = true;\n this.declarations = rules[0].rules ? rules[0].rules : rules;\n } else {\n this.rules = rules;\n }\n } else {\n const allDeclarations = this.declarationsBlock(rules.rules);\n \n if (allDeclarations && !isRooted && !value) {\n this.simpleBlock = true;\n this.declarations = rules.rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n }\n if (!this.simpleBlock) {\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n }\n this.setParent(selectors, this);\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nAtRule.prototype = Object.assign(new Node(), {\n type: 'AtRule',\n\n ...NestableAtRulePrototype,\n\n declarationsBlock(rules, mergeable = false) {\n if (!mergeable) {\n return rules.filter(function (node) { return (node.type === 'Declaration' || node.type === 'Comment') && !node.merge}).length === rules.length;\n } else {\n return rules.filter(function (node) { return (node.type === 'Declaration' || node.type === 'Comment'); }).length === rules.length;\n }\n },\n\n keywordList(rules) {\n if (!Array.isArray(rules)) {\n return false;\n } else { \n return rules.filter(function (node) { return (node.type === 'Keyword' || node.type === 'Comment'); }).length === rules.length;\n }\n },\n\n accept(visitor) {\n const value = this.value, rules = this.rules, declarations = this.declarations;\n\n if (rules) {\n this.rules = visitor.visitArray(rules);\n } else if (declarations) {\n this.declarations = visitor.visitArray(declarations); \n }\n if (value) {\n this.value = visitor.visit(value);\n }\n },\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n },\n\n isCharset() {\n return '@charset' === this.name;\n },\n\n genCSS(context, output) {\n const value = this.value, rules = this.rules || this.declarations;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (this.simpleBlock) {\n this.outputRuleset(context, output, this.declarations);\n } else if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n },\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules || this.declarations;\n \n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n\n if (rules) {\n rules = this.evalRoot(context, rules);\n }\n if (Array.isArray(rules) && rules[0].rules && Array.isArray(rules[0].rules) && rules[0].rules.length) {\n const allMergeableDeclarations = this.declarationsBlock(rules[0].rules, true);\n if (allMergeableDeclarations && !this.isRooted && !value) {\n mergeRules(rules[0].rules);\n rules = rules[0].rules;\n rules.forEach(rule => rule.merge = false);\n }\n }\n if (this.simpleBlock && rules) {\n rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n rules = rules.map(function (rule) { return rule.eval(context); });\n }\n\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n return new AtRule(this.name, value, rules, this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n },\n\n evalRoot(context, rules) {\n let ampersandCount = 0;\n let noAmpersandCount = 0;\n let noAmpersands = true;\n\n if (!this.simpleBlock) {\n rules = [rules[0].eval(context)];\n }\n\n let precedingSelectors = [];\n if (context.frames.length > 0) {\n for (let index = 0; index < context.frames.length; index++) {\n const frame = context.frames[index];\n if (\n frame.type === 'Ruleset' &&\n frame.rules &&\n frame.rules.length > 0\n ) {\n if (frame && !frame.root && frame.selectors && frame.selectors.length > 0) {\n precedingSelectors = precedingSelectors.concat(frame.selectors);\n }\n }\n if (precedingSelectors.length > 0) {\n const allAmpersandElements = precedingSelectors.every(\n sel => sel.elements && sel.elements.length > 0 && sel.elements.every(\n el => el.value === '&'\n )\n );\n if (allAmpersandElements) {\n noAmpersands = false;\n noAmpersandCount++;\n } else {\n ampersandCount++;\n }\n }\n }\n }\n\n const mixedAmpersands = ampersandCount > 0 && noAmpersandCount > 0 && !noAmpersands;\n if (\n (this.isRooted && ampersandCount > 0 && noAmpersandCount === 0 && noAmpersands)\n || !mixedAmpersands\n ) {\n rules[0].root = true;\n }\n return rules;\n },\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n },\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\n },\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n },\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n});\n\nexport default AtRule;\n","import Node from './node.js';\nimport contexts from '../contexts.js';\nimport * as utils from '../utils.js';\n\nconst DetachedRuleset = function(ruleset, frames) {\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n};\n\nDetachedRuleset.prototype = Object.assign(new Node(), {\n type: 'DetachedRuleset',\n evalFirst: true,\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n },\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n },\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n});\n\nexport default DetachedRuleset;\n","import Node from './node.js';\nimport Color from './color.js';\nimport Dimension from './dimension.js';\nimport * as Constants from '../constants.js';\nconst MATH = Constants.Math;\n\n\nconst Operation = function(op, operands, isSpaced) {\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n};\n\nOperation.prototype = Object.assign(new Node(), {\n type: 'Operation',\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n },\n\n eval(context) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate || !b.operate) {\n if (\n (a instanceof Operation || b instanceof Operation)\n && a.op === '/' && context.math === MATH.PARENS_DIVISION\n ) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n },\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n});\n\nexport default Operation;\n","import Expression from '../tree/expression.js';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n // https://github.com/less/less.js/issues/3616\n if (item.parens && subNodes[0].op === '/') {\n return item;\n }\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","import Node from './node.js';\nimport Anonymous from './anonymous.js';\nimport FunctionCaller from '../functions/function-caller.js';\n\n//\n// A function call node.\n//\nconst Call = function(name, args, index, currentFileInfo) {\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nCall.prototype = Object.assign(new Node(), {\n type: 'Call',\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n },\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n // eslint-disable-next-line no-prototype-builtins\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n },\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n});\n\nexport default Call;\n","import Node from './node.js';\nimport Call from './call.js';\n\nconst Variable = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nVariable.prototype = Object.assign(new Node(), {\n type: 'Variable',\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Variable;\n","import Node from './node.js';\nimport Declaration from './declaration.js';\n\nconst Property = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nProperty.prototype = Object.assign(new Node(), {\n type: 'Property',\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Property;\n","import Node from './node.js';\n\nconst Attribute = function(key, op, value, cif) {\n this.key = key;\n this.op = op;\n this.value = value;\n this.cif = cif;\n}\n\nAttribute.prototype = Object.assign(new Node(), {\n type: 'Attribute',\n\n eval(context) {\n return new Attribute(\n this.key.eval ? this.key.eval(context) : this.key,\n this.op,\n (this.value && this.value.eval) ? this.value.eval(context) : this.value,\n this.cif\n );\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n if (this.cif) {\n value = value + ' ' + this.cif;\n }\n\n return `[${value}]`;\n }\n});\n\nexport default Attribute;\n","import Node from './node.js';\nimport Variable from './variable.js';\nimport Property from './property.js';\n\nconst Quoted = function(str, content, escaped, index, currentFileInfo) {\n this.escaped = (escaped === undefined) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n};\n\nQuoted.prototype = Object.assign(new Node(), {\n type: 'Quoted',\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n },\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n },\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = function (_, name1, name2) {\n const v = new Variable(`@${name1 ?? name2}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name1, name2) {\n const v = new Property(`$${name1 ?? name2}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n },\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n});\n\nexport default Quoted;\n","import Node from './node.js';\n\nfunction escapePath(path) {\n return path.replace(/[()'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nconst URL = function(val, index, currentFileInfo, isEvald) {\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n};\n\nURL.prototype = Object.assign(new Node(), {\n type: 'Url',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n});\n\nexport default URL;\n","import Ruleset from './ruleset.js';\nimport Value from './value.js';\nimport Selector from './selector.js';\nimport AtRule from './atrule.js';\nimport NestableAtRulePrototype from './nested-at-rule.js';\n\nconst Media = function(value, features, index, currentFileInfo, visibilityInfo) {\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n};\n\nMedia.prototype = Object.assign(new AtRule(), {\n type: 'Media',\n\n ...NestableAtRulePrototype,\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n },\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n }\n});\n\nexport default Media;\n","import Node from './node.js';\nimport Media from './media.js';\nimport URL from './url.js';\nimport Quoted from './quoted.js';\nimport Ruleset from './ruleset.js';\nimport Anonymous from './anonymous.js';\nimport * as utils from '../utils.js';\nimport LessError from '../less-error.js';\nimport Expression from './expression.js';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nconst Import = function(path, features, options, index, currentFileInfo, visibilityInfo) {\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#.&?]css([?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n};\n\nImport.prototype = Object.assign(new Node(), {\n type: 'Import',\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n },\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n },\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n },\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n },\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n },\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n },\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n },\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.features) {\n let featureValue = this.features.value;\n if (Array.isArray(featureValue) && featureValue.length >= 1) {\n const expr = featureValue[0];\n if (expr.type === 'Expression' && Array.isArray(expr.value) && expr.value.length >= 2) {\n featureValue = expr.value;\n const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'\n && featureValue[1].type === 'Paren';\n if (isLayer) {\n this.css = false;\n }\n }\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css || this.layerCss) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (this.layerCss) {\n newImport.css = this.layerCss;\n newImport.path._fileInfo = this._fileInfo;\n }\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n if (this.features) {\n let featureValue = this.features.value;\n if (Array.isArray(featureValue) && featureValue.length === 1) {\n const expr = featureValue[0];\n if (expr.type === 'Expression' && Array.isArray(expr.value) && expr.value.length >= 2) {\n featureValue = expr.value;\n const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'\n && featureValue[1].type === 'Paren';\n if (isLayer) {\n this.layerCss = true;\n featureValue[0] = new Expression(featureValue.slice(0, 2));\n featureValue.splice(1, 1);\n featureValue[0].noSpacing = true;\n return this;\n }\n }\n }\n }\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n if (this.features) {\n let featureValue = this.features.value;\n if (Array.isArray(featureValue) && featureValue.length >= 1) {\n featureValue = featureValue[0].value;\n if (Array.isArray(featureValue) && featureValue.length >= 2) {\n const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'\n && featureValue[1].type === 'Paren';\n if (isLayer) {\n this.css = true;\n featureValue[0] = new Expression(featureValue.slice(0, 2));\n featureValue.splice(1, 1);\n featureValue[0].noSpacing = true;\n return this;\n }\n }\n }\n }\n return [];\n }\n }\n});\n\nexport default Import;\n","import Node from './node.js';\nimport Variable from './variable.js';\n\nconst JsEvalNode = function() {};\n\nJsEvalNode.prototype = Object.assign(new Node(), {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n // eslint-disable-next-line no-prototype-builtins\n if (variables.hasOwnProperty(k)) {\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n },\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n});\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node.js';\nimport Dimension from './dimension.js';\nimport Quoted from './quoted.js';\nimport Anonymous from './anonymous.js';\n\nconst JavaScript = function(string, escaped, index, currentFileInfo) {\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nJavaScript.prototype = Object.assign(new JsEvalNode(), {\n type: 'JavaScript',\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n});\n\nexport default JavaScript;\n","import Node from './node.js';\n\nconst Assignment = function(key, val) {\n this.key = key;\n this.value = val;\n}\n\nAssignment.prototype = Object.assign(new Node(), {\n type: 'Assignment',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n },\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n});\n\nexport default Assignment;\n","import Node from './node.js';\n\nconst Condition = function(op, l, r, i, negate) {\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n};\n\nCondition.prototype = Object.assign(new Node(), {\n type: 'Condition',\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n },\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n});\n\nexport default Condition;\n","import Node from './node.js';\n\nconst QueryInParens = function (op, l, m, op2, r, i) {\n this.op = op.trim();\n this.lvalue = l;\n this.mvalue = m;\n this.op2 = op2 ? op2.trim() : null;\n this.rvalue = r;\n this._index = i;\n};\n\nQueryInParens.prototype = Object.assign(new Node(), {\n type: 'QueryInParens',\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.mvalue = visitor.visit(this.mvalue);\n if (this.rvalue) {\n this.rvalue = visitor.visit(this.rvalue);\n }\n },\n\n eval(context) {\n const node = new QueryInParens(\n this.op,\n this.lvalue.eval(context),\n this.mvalue.eval(context),\n this.op2,\n this.rvalue ? this.rvalue.eval(context) : null,\n this._index\n );\n return node;\n },\n\n genCSS(context, output) {\n this.lvalue.genCSS(context, output);\n output.add(' ' + this.op + ' ');\n this.mvalue.genCSS(context, output);\n if (this.rvalue) {\n output.add(' ' + this.op2 + ' ');\n this.rvalue.genCSS(context, output);\n }\n },\n});\n\nexport default QueryInParens;\n","import Ruleset from './ruleset.js';\nimport Value from './value.js';\nimport Selector from './selector.js';\nimport AtRule from './atrule.js';\nimport NestableAtRulePrototype from './nested-at-rule.js';\n\nconst Container = function(value, features, index, currentFileInfo, visibilityInfo) {\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n};\n\nContainer.prototype = Object.assign(new AtRule(), {\n type: 'Container',\n\n ...NestableAtRulePrototype,\n\n genCSS(context, output) {\n output.add('@container ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n },\n\n eval(context) {\n if (this._evaluated) {\n return this;\n }\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Container(null, [], this._index, this._fileInfo, this.visibilityInfo());\n media._evaluated = true;\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n\n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n }\n});\n\nexport default Container;\n","import Node from './node.js';\n\nconst UnicodeDescriptor = function(value) {\n this.value = value;\n}\n\nUnicodeDescriptor.prototype = Object.assign(new Node(), {\n type: 'UnicodeDescriptor'\n})\n\nexport default UnicodeDescriptor;\n","import Node from './node.js';\nimport Operation from './operation.js';\nimport Dimension from './dimension.js';\n\nconst Negative = function(node) {\n this.value = node;\n};\n\nNegative.prototype = Object.assign(new Node(), {\n type: 'Negative',\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n },\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n});\n\nexport default Negative;\n","import Node from './node.js';\nimport Selector from './selector.js';\n\nconst Extend = function(selector, option, index, currentFileInfo, visibilityInfo) {\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case '!all':\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n};\n\nExtend.prototype = Object.assign(new Node(), {\n type: 'Extend',\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n },\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n // remove when Nodes have JSDoc types\n // eslint-disable-next-line no-unused-vars\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n});\n\nExtend.next_id = 0;\nexport default Extend;\n","import Node from './node.js';\nimport Variable from './variable.js';\nimport Ruleset from './ruleset.js';\nimport DetachedRuleset from './detached-ruleset.js';\nimport LessError from '../less-error.js';\n\nconst VariableCall = function(variable, index, currentFileInfo) {\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n};\n\nVariableCall.prototype = Object.assign(new Node(), {\n type: 'VariableCall',\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n});\n\nexport default VariableCall;\n","import Node from './node.js';\nimport Variable from './variable.js';\nimport Ruleset from './ruleset.js';\nimport Selector from './selector.js';\n\nconst NamespaceValue = function(ruleCall, lookups, index, fileInfo) {\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n};\n\nNamespaceValue.prototype = Object.assign(new Node(), {\n type: 'NamespaceValue',\n\n eval(context) {\n let i, name, rules = this.value.eval(context);\n\n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.slice(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n\n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.slice(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n\n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.slice(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n});\n\nexport default NamespaceValue;\n","import Selector from './selector.js';\nimport Element from './element.js';\nimport Ruleset from './ruleset.js';\nimport Declaration from './declaration.js';\nimport DetachedRuleset from './detached-ruleset.js';\nimport Expression from './expression.js';\nimport contexts from '../contexts.js';\nimport * as utils from '../utils.js';\n\nconst Definition = function(name, params, rules, condition, variadic, frames, visibilityInfo) {\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nDefinition.prototype = Object.assign(new Ruleset(), {\n type: 'MixinDefinition',\n evalFirst: true,\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n },\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n },\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n },\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n },\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n },\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n});\n\nexport default Definition;\n","import Node from './node.js';\nimport Selector from './selector.js';\nimport MixinDefinition from './mixin-definition.js';\nimport defaultFunc from '../functions/default.js';\n\nconst MixinCall = function(elements, args, index, currentFileInfo, important) {\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n};\n\nMixinCall.prototype = Object.assign(new Node(), {\n type: 'MixinCall',\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n },\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n },\n\n _setVisibilityToReplacement(replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n },\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n});\n\nexport default MixinCall;\n","import Node from './node.js';\nimport Color from './color.js';\nimport AtRule from './atrule.js';\nimport DetachedRuleset from './detached-ruleset.js';\nimport Operation from './operation.js';\nimport Dimension from './dimension.js';\nimport Unit from './unit.js';\nimport Keyword from './keyword.js';\nimport Variable from './variable.js';\nimport Property from './property.js';\nimport Ruleset from './ruleset.js';\nimport Element from './element.js';\nimport Attribute from './attribute.js';\nimport Combinator from './combinator.js';\nimport Selector from './selector.js';\nimport Quoted from './quoted.js';\nimport Expression from './expression.js';\nimport Declaration from './declaration.js';\nimport Call from './call.js';\nimport URL from './url.js';\nimport Import from './import.js';\nimport Comment from './comment.js';\nimport Anonymous from './anonymous.js';\nimport Value from './value.js';\nimport JavaScript from './javascript.js';\nimport Assignment from './assignment.js';\nimport Condition from './condition.js';\nimport QueryInParens from './query-in-parens.js';\nimport Paren from './paren.js';\nimport Media from './media.js';\nimport Container from './container.js';\nimport UnicodeDescriptor from './unicode-descriptor.js';\nimport Negative from './negative.js';\nimport Extend from './extend.js';\nimport VariableCall from './variable-call.js';\nimport NamespaceValue from './namespace-value.js';\n\n// mixins\nimport MixinCall from './mixin-call.js';\nimport MixinDefinition from './mixin-definition.js';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, Container, QueryInParens, \n UnicodeDescriptor, Negative, Extend, VariableCall, \n NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlParts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n /**\n * Helper function, not part of API.\n * This should be replaceable by newer Node / Browser APIs\n * \n * @param {string} url \n * @param {string} baseUrl\n */\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^/?#]*\\/)|([/\\\\]))?((?:[^/\\\\?#]*[/\\\\])*)([^/\\\\?#]*)([#?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager;\n","import functionRegistry from '../functions/function-registry.js';\nimport LessError from '../less-error.js';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = function() {\n return null;\n }\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import Anonymous from '../tree/anonymous.js';\nimport Keyword from '../tree/keyword.js';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false;\n\nfunction isdefined(context, variable) {\n try {\n variable.eval(context);\n return Keyword.True;\n } catch (e) {\n return Keyword.False;\n }\n}\n\nisdefined.evalArgs = false;\n\nexport default { isdefined, boolean, 'if': If };\n","import Dimension from '../tree/dimension.js';\nimport Color from '../tree/color.js';\nimport Quoted from '../tree/quoted.js';\nimport Anonymous from '../tree/anonymous.js';\nimport Expression from '../tree/expression.js';\nimport Operation from '../tree/operation.js';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 128 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Expression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color.js';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n // eslint-disable-next-line no-prototype-builtins\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Quoted from '../tree/quoted.js';\nimport URL from '../tree/url.js';\nimport * as utils from '../utils.js';\nimport logger from '../logger.js';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Comment from '../tree/comment.js';\nimport Node from '../tree/node.js';\nimport Dimension from '../tree/dimension.js';\nimport Declaration from '../tree/declaration.js';\nimport Expression from '../tree/expression.js';\nimport Ruleset from '../tree/ruleset.js';\nimport Selector from '../tree/selector.js';\nimport Element from '../tree/element.js';\nimport Quote from '../tree/quoted.js';\nimport Value from '../tree/value.js';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...expr) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n const tryEval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset).rules;\n } else if (list.rules) {\n iterator = list.rules.map(tryEval);\n } else if (Array.isArray(list)) {\n iterator = list.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element('', '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element('', '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension.js';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit === null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n // eslint-disable-next-line no-prototype-builtins\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension.js';\nimport Anonymous from '../tree/anonymous.js';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n continue;\n } else {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(a => { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n try {\n return minMax.call(this, true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax.call(this, false, args);\n } catch (e) {}\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted.js';\nimport Anonymous from '../tree/anonymous.js';\nimport JavaScript from '../tree/javascript.js';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Dimension from '../tree/dimension.js';\nimport Color from '../tree/color.js';\nimport Expression from '../tree/expression.js';\nimport Quoted from '../tree/quoted.js';\nimport URL from '../tree/url.js';\n\nexport default () => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += `${gradientType}Gradient>`;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Keyword from '../tree/keyword.js';\nimport DetachedRuleset from '../tree/detached-ruleset.js';\nimport Dimension from '../tree/dimension.js';\nimport Color from '../tree/color.js';\nimport Quoted from '../tree/quoted.js';\nimport Anonymous from '../tree/anonymous.js';\nimport URL from '../tree/url.js';\nimport Operation from '../tree/operation.js';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import Variable from '../tree/variable.js';\nimport Anonymous from '../tree/anonymous.js';\n\nconst styleExpression = function (args) {\n args = Array.prototype.slice.call(args);\n if (args.length === 0) {\n throw { type: 'Argument', message: 'one or more arguments required' };\n }\n\n const entityList = [new Variable(args[0].value, this.index, this.currentFileInfo).eval(this.context)];\n\n args = entityList.map(a => { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n\n return new Anonymous(`style(${args})`);\n};\n\nexport default {\n style: function(...args) {\n try {\n return styleExpression.call(this, args);\n } catch (e) {\n // When style() is used as a CSS function (e.g. @container style(--responsive: true)),\n // arguments won't be valid Less variables. Return undefined to let the\n // parser fall through and treat it as plain CSS.\n }\n },\n};\n","import functionRegistry from './function-registry.js';\nimport functionCaller from './function-caller.js';\n\nimport boolean from './boolean.js';\nimport defaultFunc from './default.js';\nimport color from './color.js';\nimport colorBlending from './color-blending.js';\nimport dataUri from './data-uri.js';\nimport list from './list.js';\nimport math from './math.js';\nimport number from './number.js';\nimport string from './string.js';\nimport svg from './svg.js';\nimport types from './types.js';\nimport style from './style.js';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n functionRegistry.addMultiple(style);\n\n return functions;\n};\n","import contexts from './contexts.js';\nimport visitor from './visitors/index.js';\nimport tree from './tree/index.js';\n\nexport default function(root, options) {\n options = options || {};\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(function (k) {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (let i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (let i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n}\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","'use strict';\n\nfunction parseNodeVersion(version) {\n var match = version.match(/^v(\\d{1,2})\\.(\\d{1,2})\\.(\\d{1,2})(?:-([0-9A-Za-z-.]+))?(?:\\+([0-9A-Za-z-.]+))?$/); // eslint-disable-line max-len\n if (!match) {\n throw new Error('Unable to parse: ' + version);\n }\n\n var res = {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n patch: parseInt(match[3], 10),\n pre: match[4] || '',\n build: match[5] || '',\n };\n\n return res;\n}\n\nmodule.exports = parseNodeVersion;\n","import Environment from './environment/environment.js';\nimport data from './data/index.js';\nimport tree from './tree/index.js';\nimport AbstractFileManager from './environment/abstract-file-manager.js';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader.js';\nimport visitors from './visitors/index.js';\nimport Parser from './parser/parser.js';\nimport functions from './functions/index.js';\nimport contexts from './contexts.js';\nimport LessError from './less-error.js';\nimport transformTree from './transform-tree.js';\nimport * as utils from './utils.js';\nimport PluginManager from './plugin-manager.js';\nimport logger from './logger.js';\nimport SourceMapOutput from './source-map-output.js';\nimport SourceMapBuilder from './source-map-builder.js';\nimport ParseTree from './parse-tree.js';\nimport ImportManager from './import-manager.js';\nimport Parse from './parse.js';\nimport Render from './render.js';\nimport parseVersion from 'parse-node-version';\n\nexport default function(environment, fileManagers, version = '0.0.0') {\n let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n environment = new Environment(environment, fileManagers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(sourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse(environment, parseTree, importManager);\n\n const v = parseVersion(`v${version}`);\n const initial = {\n version: [v.major, v.minor, v.patch],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n\n const ctor = function(t) {\n return function() {\n const obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.slice.call(arguments, 0));\n return obj;\n };\n };\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n}\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename ? options.outputFilename.replace(/\\\\/g, '/') : options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n /** \n * ignore empty content, or failsafe\n * if contents map is incorrect\n */\n if (inputSource === undefined) {\n this._css.push(chunk);\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n // eslint-disable-next-line no-prototype-builtins\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n}\n","export default function (SourceMapOutput, environment) {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n}\n","import LessError from './less-error.js';\nimport transformTree from './transform-tree.js';\nimport logger from './logger.js';\n\nexport default function(SourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n // @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead. All modes will be removed in a future version.\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n // Normalize sourceMap option: if it's just true, convert to object\n if (options.sourceMap === true) {\n options.sourceMap = {};\n }\n const sourceMapOpts = options.sourceMap;\n \n // Set sourceMapInputFilename if not set and filename is available\n if (!sourceMapOpts.sourceMapInputFilename && options.filename) {\n sourceMapOpts.sourceMapInputFilename = options.filename;\n }\n \n // Default sourceMapBasepath to the input file's directory if not set\n // This matches the behavior documented and implemented in bin/lessc\n if (sourceMapOpts.sourceMapBasepath === undefined && options.filename) {\n // Get directory from filename using string manipulation (works cross-platform)\n const lastSlash = Math.max(options.filename.lastIndexOf('/'), options.filename.lastIndexOf('\\\\'));\n if (lastSlash >= 0) {\n sourceMapOpts.sourceMapBasepath = options.filename.substring(0, lastSlash);\n } else {\n // No directory separator found, use current directory\n sourceMapOpts.sourceMapBasepath = '.';\n }\n }\n \n // Handle sourceMapFullFilename (CLI-specific: --source-map=filename)\n // This is converted to sourceMapFilename and sourceMapOutputFilename\n if (sourceMapOpts.sourceMapFullFilename && !sourceMapOpts.sourceMapFileInline) {\n // This case is handled by lessc before calling render\n // We just need to ensure sourceMapFilename is set if sourceMapFullFilename is provided\n if (!sourceMapOpts.sourceMapFilename && !sourceMapOpts.sourceMapURL) {\n // Extract just the basename for the sourceMappingURL comment\n const mapBase = sourceMapOpts.sourceMapFullFilename.split(/[/\\\\]/).pop();\n sourceMapOpts.sourceMapFilename = mapBase;\n }\n } else if (!sourceMapOpts.sourceMapFilename && !sourceMapOpts.sourceMapURL) {\n // If sourceMapFilename is not set and sourceMapURL is not set,\n // derive it from the output filename (if available) or input filename\n if (sourceMapOpts.sourceMapOutputFilename) {\n // Use output filename + .map\n sourceMapOpts.sourceMapFilename = sourceMapOpts.sourceMapOutputFilename + '.map';\n } else if (options.filename) {\n // Fallback to input filename + .css.map (basename only)\n const inputBasename = options.filename.split(/[/\\\\]/).pop().replace(/\\.[^/.]+$/, '');\n sourceMapOpts.sourceMapFilename = inputBasename + '.css.map';\n }\n }\n \n // Default sourceMapOutputFilename if not set\n if (!sourceMapOpts.sourceMapOutputFilename) {\n if (options.filename) {\n const inputBasename = options.filename.split(/[/\\\\]/).pop().replace(/\\.[^/.]+$/, '');\n sourceMapOpts.sourceMapOutputFilename = inputBasename + '.css';\n } else {\n sourceMapOpts.sourceMapOutputFilename = 'output.css';\n }\n }\n \n sourceMapBuilder = new SourceMapBuilder(sourceMapOpts);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n result.imports = [];\n for (const file in this.imports.files) {\n if (Object.prototype.hasOwnProperty.call(this.imports.files, file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n return result;\n }\n }\n\n return ParseTree;\n}\n","import contexts from './contexts.js';\nimport Parser from './parser/parser.js';\nimport LessError from './less-error.js';\nimport * as utils from './utils.js';\nimport logger from './logger.js';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n // same name as they used to do before this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n // import (multiple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[resolvedFilename]\n && !importManager.files[resolvedFilename].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n}\n","import * as utils from './utils.js';\n\nexport default function(environment, ParseTree) {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n render.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, function(err, root, imports, options) {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n}\n","import contexts from './contexts.js';\nimport Parser from './parser/parser.js';\nimport PluginManager from './plugin-manager.js';\nimport LessError from './less-error.js';\nimport * as utils from './utils.js';\n\nexport default function(environment, ParseTree, ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, function (e, root) {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n}\n","import AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nconst FileManager = function() {}\nFileManager.prototype = Object.assign(new AbstractFileManager(), {\n alwaysMakePathsAbsolute() {\n return true;\n },\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n },\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n },\n\n supports() {\n return true;\n },\n\n clearFileCache() {\n fileCache = {};\n },\n\n loadFile(filename, currentDirectory, options) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n});\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","/**\n * @todo Add tests for browser `@plugin`\n */\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nconst PluginLoader = function(less) {\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n};\n\nPluginLoader.prototype = Object.assign(new AbstractPluginLoader(), {\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n});\n\nexport default PluginLoader;\n\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","import * as utils from './utils.js';\nimport browser from './browser.js';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '{content}';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `
in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:
`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
Stack Trace${e.stack.split('\\n').slice(1).join('
')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole() {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\nimport defaultOptions from '../less/default-options.js';\nimport addDefaultOptions from './add-default-options.js';\nimport root from './index.js';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (Object.prototype.hasOwnProperty.call(window.less, key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default function() {\n return {\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /**\n * @deprecated This option has confusing behavior and may be removed in a future version.\n * \n * When true, prevents @import statements for .less files from being evaluated inside\n * selector blocks (rulesets). The imports are silently ignored and not output.\n * \n * Behavior:\n * - @import at root level: Always processed\n * - @import inside @-rules (@media, @supports, etc.): Processed (these are not selector blocks)\n * - @import inside selector blocks (.class, #id, etc.): NOT processed (silently ignored)\n * \n * When false (default): All @import statements are processed regardless of context.\n * \n * Note: Despite the name \"strict\", this option does NOT throw an error when imports\n * are used in selector blocks - it silently ignores them. This is confusing\n * behavior that may catch users off guard.\n * \n * Note: Only affects .less file imports. CSS imports (url(...) or .css files) are\n * always output as CSS @import statements regardless of this setting.\n * \n * @see https://github.com/less/less.js/issues/656\n */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n}","import {addDataAttr} from './utils.js';\nimport browser from './browser.js';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils.js';\nimport lessRoot from '../less/index.js';\nimport browser from './browser.js';\nimport FM from './file-manager.js';\nimport PluginLoader from './plugin-loader.js';\nimport LogListener from './log-listener.js';\nimport ErrorReporting from './error-reporting.js';\nimport Cache from './cache.js';\nimport ImageSize from './image-size.js';\nimport pkg from '../../package.json';\n\n/**\n * @param {Window} window\n * @param {Object} options\n */\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot(undefined, undefined, pkg.version);\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n\n for (let style of styles) {\n if (style.type.match(typePattern)) {\n const instanceOptions = {\n ...clone(options),\n modifyVars,\n filename: document.location.href.replace(/#.*$/, '')\n }\n\n const lessText = style.innerHTML || '';\n\n /* jshint loopfunc:true */\n less.render(lessText, instanceOptions, (err, result) => {\n if (err) {\n errors.add(err, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n });\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n /**\n * @todo remove when this is typed with JSDoc\n */\n // eslint-disable-next-line no-unused-vars\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || '{}'; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry.js';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","Object","prototype","hasOwnProperty","call","JSON","parse","_","browser$1","document","styles","sheet","id","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","currentScript","scripts","logger$1","error","msg","this","_fireEvent","warn","info","debug","addListener","listener","_listeners","push","removeListener","i","splice","type","logFunction","Environment","[object Object]","externalEnvironment","fileManagers","requiredFunctions","functions","concat","propName","environmentFunc","bind","filename","currentDirectory","environment","isSync","logger","undefined","pluginManager","getFileManagers","fileManager","colors","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","unitConversions","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math","PI","deg","grad","turn","data","Node","parent","visibilityBlocks","nodeVisible","rootNode","parsed","currentFileInfo","fileInfo","index","getIndex","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","context","strs","genCSS","add","chunk","isEmpty","join","output","value","visitor","visit","op","a","b","precision","numPrecision","Number","toFixed","compare","Color","rgb","originalForm","self","match","map","c","parseInt","alpha","split","clamp","v","max","min","toHex","round","toString","assign","r","g","pow","toCSS","doNotCompress","compress","color","colorFunction","args","fround","indexOf","toHSL","h","l","toRGB","splitcolor","other","_operate","d","x","fromKeyword","keyword","key","toLowerCase","slice","Paren","paren","eval","noSpacing","_noSpaceCombinators"," ","|","Combinator","emptyOrWhitespace","trim","spaceOrEmpty","Element","combinator","isVariable","visibilityInfo","copyVisibilityInfo","setParent","firstSelector","charAt","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getType","payload","copy","target","item","constructor","getPrototypeOf","getOwnPropertyNames","getOwnPropertySymbols","reduce","carry","props","includes","newVal","originalObject","includeNonenumerable","propType","propertyIsEnumerable","defineProperty","enumerable","writable","configurable","assignProp","nonenumerable","getLocation","inputStream","n","line","column","copyArray","arr","clone","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","isNullOrUndefined","val","anonymousFunc","LessError","fileContentMap","currentFilename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","create","F","isWarning","stylize","str","errorTxt","_visitArgs","visitDeeper","_hasIndexed","_noop","Visitor","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","tree","nodeTypeIndex","impl","funcOut","visitArgs","fnName","newNode","isReplacing","cnt","accept","nonReplacing","out","evald","flatten","nestedCnt","j","nestedItem","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","test","isPathLocalRelative","Eval","frames","importantScope","enterCalc","calcStack","inCalc","exitCalc","pop","inParenthesis","parensStack","outOfParenthesis","mathOn","isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePath","segments","reverse","segment","ImportSequencer","onSequencerEmpty","imports","variableImports","_onSequencerEmpty","_currentDepth","callback","importSequencer","importItem","isReady","arguments","tryRun","apply","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","root","isFinished","visitImport","importNode","inlineCSS","inline","css","utils.copyArray","importParent","isVariableImport","addVariableImport","processImportNode","evaldImportNode","evalForImport","multiple","importMultiple","tryAppendLessExtension","rules","onImported","sequencedOnImported","addImport","getPath","importedAtRoot","fullPath","importVisitor","isPlugin","isOptional","optional","duplicateImport","skip","importedFilename","oldContext","visitDeclaration","declNode","unshift","visitDeclarationOut","shift","visitAtRule","atRuleNode","declarations","isRooted","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","ExtendFinderVisitor","allExtendsStack","allExtends","extend","allSelectorsExtendList","extendList","ruleCnt","Extend","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","findSelfSelectors","ruleset","firstExtendOnThisSelectorPath","selectors","asComment","ctx","debugInfo","lineNumber","fileName","asMediaQuery","filenameWithProtocol","lineSeparator","dumpLineNumbers","Comment","isLineComment","allowRoot","getDebugInfo","isCompressed","Unit","numerator","denominator","backupUnit","sort","strictUnits","returnStr","is","unitString","toUpperCase","RegExp","group","mapUnit","groupName","atomicUnit","counter","count","Dimension","unit","parseFloat","isNaN","isSingular","strValue","String","isLength","convertTo","usedUnits","cancel","unify","numericCompare","conversions","targetUnit","applyUnit","derivedConversions","Anonymous","mapLines","rulesetLike","Boolean","Expression","visitArray","returnValue","parens","doubleParen","parensInOp","filter","Value","mergeRules","groups","groupsArr","rule","merge","name","space","comma","important","CSSVisitorUtils","_context","bodyRules","isSilent","blocksVisibility","owner","thing","isVisible","compiledRulesBody","keepOnlyVisibleChilds","ensureVisibility","removeVisibilityBlock","firstRoot","hasVisibleSelector","ToCSSVisitor","utils","variable","mixinNode","visitExtend","extendNode","visitComment","commentNode","originalRules","resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","_mergeRules","charset","comment","checkValidNodes","isRoot","ruleNode","Declaration","Call","rulesets","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","isVisibleRuleset","p","elements","getIsOutput","ruleCache","ruleList","prevRuleCSS","ruleCSS","visitors","MarkVisibleSelectorsVisitor","visible","ensureInvisibility","ExtendVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","hasFoundMatches","parent_ids","selector","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","extendsToAdd","newSelector","extendVisitor","targetExtend","newExtend","object_id","selfSelectors","findMatch","selfSelector","extendSelector","option","extendChainCount","selectorOne","selectorTwo","selectorNode","selectorsToAdd","pathCount","pathIndex","si","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","needleElements","potentialMatches","potentialMatch","allowBefore","matched","initialCombinator","isElementValuesEqual","finished","allowAfter","endPathIndex","endPathElementIndex","elementValue1","elementValue2","Attribute","Selector","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","createDerived","newAllExtends","lastIndex","JoinSelectorVisitor","joinSelectors","multiMedia","functionRegistry","makeRegistry","base","_data","addMultiple","keys","get","getLocalFunctions","inherit","MediaSyntaxOptions","queryInParens","ContainerSyntaxOptions","DeprecationHandler","_counts","deprecationId","omitted","Parser","currentIndex","parsers","parserInput","saveStack","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","skipWhitespace","oldi","oldj","curr","endIndex","mem","inp","nextChar","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$peekChar","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","quote","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","testChar","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","end","furthestReachedEnd","furthestChar","getParserInput","deprecationHandler","quiet","quietDeprecations","shouldWarn","expect","arg","expectChar","parseNode","parseList","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","err","preText","disablePluginRule","plugin","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","Ruleset","primary","endInfo","processImports","mixin","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","k","customFuncCall","stop","declarationCall","validCall","substring","ruleProperty","f","ieAlpha","boolean","condition","if","prevArgs","argsComma","argsSemiColon","isSemiColonSeparated","detachedRuleset","assignment","expression","literal","dimension","unicodeDescriptor","entity","url","property","Variable","Property","ch","variableCurly","curly","colorKeyword","ud","javascript","js","escape","parsedName","lookups","inValue","ruleLookups","VariableCall","NamespaceValue","isRule","first","element","getLookup","hasParens","parensIndex","parensWS","elem","elemIndex","re","isCall","returner","variadic","expressions","expressionContainsNamed","nameLoop","expand","hasSep","throwAwayComments","cond","params","argInfo","conditions","block","lookupValue","Quoted","attribute","slashedCombinator","isLess","when","ele","cif","content","blockRuleset","Definition","DetachedRuleset","strictImports","hasDR","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","propRegex","variableRegex","import","features","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","syntaxOptions","rangeP","spacing","atomicCondition","rvalue","lvalue","prepareAndGetNestableAtRule","treeType","atRule","nestableAtRule","Media","Container","pluginArgs","atruleUnknown","hasBlock","atruleBlock","isKeywordList","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","unknownPackage","blockPackage","sub","addition","colorOperand","Keyword","multiplication","operation","isSpaced","operand","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","insideCondition","negate","body","me","tryConditionFollowedByParenthesis","preparsedCond","delim","simpleProperty","vars","evaldCondition","getElements","mixinElements_","utils.isNullOrUndefined","mediaEmpty","els","importManager","el","sels","len","olen","mixinElements","evaldElements","evaldExtends","True","False","MATH","lastRule","prevMath","evaldValue","mathBypass","evalName","importantResult","defaultFunc","value_","error_","reset","_lookups","_variables","_properties","isRuleset","isRulesetLike","selCnt","hasVariable","hasOnePassingSelector","toParseSelectors","startingIndex","selectorFileInfo","utils.flattenArray","subRule","originalRuleset","allowImports","ctxFrames","foundRegistry","fi","fn","globalFunctionRegistry","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","resetCache","isJustParentSelector","bubbleSelectors","importRules","makeImportant","matchArgs","lastSelector","_rulesets","hash","variables","decl","parseValue","properties","toParse","transformDeclaration","ti","filtRules","foundMixins","find","ruleNodes","tabLevel","tabRuleStr","tabSetStr","sep","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","hadParentSelector","replaceParentSelector","inSelector","currentElements","newSelectors","selectorsMultiplied","findNestedSelector","maybeSelector","nestedSelector","nestedPaths","replaced","replacedNewSelectors","some","resolvedElements","subEl","subPaths","subReplaced","concatenated","NestableAtRulePrototype","evalFunction","exprValues","expr","createEmptySelectors","mediaPath","blockIndex","permute","fragment","rest","AtRule","allDeclarations","declarationsBlock","allRulesetDeclarations","simpleBlock","mergeable","keywordList","outputRuleset","mediaPathBackup","mediaBlocksBackup","evalRoot","ampersandCount","noAmpersandCount","noAmpersands","precedingSelectors","frame","every","mixedAmpersands","Operation","operands","toColor","operate","functionCaller","evalArgs","commentFilter","subNodes","calc","currentMathContext","funcCaller","FunctionCaller","isValid","columnNumber","evaluating","fun","less","vArr","escaped","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","name1","name2","URL","isEvald","urlArgs","evalTop","evalNested","Import","pathValue","reference","containsVariables","doEval","addVisibilityBlock","registry","featureValue","layerCss","newImport","evalPath","JsEvalNode","evalContext","javascriptEnabled","jsify","toJS","JavaScript","string","evaluateJavaScript","Assignment","Condition","QueryInParens","op2","mvalue","_evaluated","UnicodeDescriptor","Negative","next_id","selectorElements","selfElements","callEval","ruleCall","lastDeclaration","arity","optionalParameters","required","mixinEnv","evaldArguments","varargs","isNamedFound","argIndex","argsLength","prependRule","_arguments","mixinFrames","evalParams","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixinPath","argValue","isRecursive","isOneFound","candidates","candidate","conditionResult","defaultResult","noArgumentsFilter","calcDefGroup","namespace","matchCondition","MixinDefinition","format","newRules","evalCall","_setVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","ext","tryAppendExtension","basePath","laterPath","baseUrl","urlParts","extractUrlParts","baseUrlParts","urlDirectories","baseUrlDirectories","diff","hostPart","directories","urlPartsRegex","rawDirectories","rawPath","fileUrl","AbstractPluginLoader","require","pluginOptions","loader","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","registerPlugin","validatePlugin","minVersion","compareVersion","addPlugin","setOptions","version","versionToString","aVersion","bVersion","versionString","plugins","printUsage","If","trueValue","falseValue","isdefined","boolean$1","colorFunctions","hsla","origColor","hsl","toHSV","number","rgba","scaled","size","m1","m2","hue","hsv","hsva","floor","vs","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luma","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","t","argb","toARGB","tint","shade","colorBlend","mode","ab","cb","as","cs","ar","cr","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","dataUri","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","getFileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","encodeURIComponent","uri","getItemsFromNode","list","_SELF","~","values","range","step","from","to","stepValue","each","rs","iterator","tryEval","Quote","valueName","keyName","indexName","MathHelper","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","svg","svg-gradient","direction","stops","gradientDirectionSvg","gradientType","rectangleDimension","renderEnv","directionValue","position","positionValue","throwArgumentDescriptor","isa","Type","isunit","types","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","styleExpression","style$1","style","colorBlending","transformTree","evaldRoot","evalEnv","preEvalVisitors","visitorIterator","isPreEvalVisitor","isPreVisitor","PluginManager","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","install","preProcessor","priority","indexToInsertAt","postProcessor","manager","pm","PluginManagerFactory","newFactory","parseNodeVersion_1","major","minor","patch","pre","build","lessRoot","sourceMapOutput","sourceMapBuilder","parseTree","_css","_rootNode","_contentsMap","contentsMap","_contentsIgnoredCharsMap","contentsIgnoredCharsMap","sourceMapFilename","_sourceMapFilename","_outputFilename","outputFilename","sourceMapURL","sourceMapBasepath","_sourceMapBasepath","sourceMapRootpath","_sourceMapRootpath","_outputSourceFiles","outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","removeBasepath","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","normalizeFilename","file","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","sourceMap","SourceMapOutput","sourceMapOutputFilename","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","getCSSAppendage","SourceMapBuilder","toCSSOptions","sourceMapOpts","lastSlash","sourceMapFullFilename","mapBase","inputBasename","getPostProcessors","getExternalSourceMap","files","rootFilename","ParseTree","rootFileInfo","mime","queue","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadFileCallback","loadedFile","resolvedFilename","pathDiff","isPathAbsolute","alwaysMakePathsAbsolute","newEnv","evalPlugin","promise","syncImport","loadPluginSync","loadPlugin","loadFile","then","ImportManager","render","utils.copyOptions","Promise","resolve","reject","Render","reUsePluginManager","evalResult","fileContent","parseVersion","initial","ctor","api","fileCache","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","supports","location","useFileCache","lessText","webInfo","lastModified","Date","doXHR","FM","log","fulfill","catch","ErrorReporting","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","browser","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","pkg","addFileManager","loggers","console","LogListener","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","clearFileCache","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/less/src/less-browser/add-default-options.js b/packages/less/lib/less-browser/add-default-options.js
similarity index 95%
rename from packages/less/src/less-browser/add-default-options.js
rename to packages/less/lib/less-browser/add-default-options.js
index d839595f9..0fbbaab86 100644
--- a/packages/less/src/less-browser/add-default-options.js
+++ b/packages/less/lib/less-browser/add-default-options.js
@@ -1,5 +1,5 @@
-import {addDataAttr} from './utils';
-import browser from './browser';
+import {addDataAttr} from './utils.js';
+import browser from './browser.js';
export default (window, options) => {
diff --git a/packages/less/src/less-browser/bootstrap.js b/packages/less/lib/less-browser/bootstrap.js
similarity index 91%
rename from packages/less/src/less-browser/bootstrap.js
rename to packages/less/lib/less-browser/bootstrap.js
index 2a73fe3c3..bf21073a3 100644
--- a/packages/less/src/less-browser/bootstrap.js
+++ b/packages/less/lib/less-browser/bootstrap.js
@@ -3,9 +3,9 @@
* used in the browser distributed version of less
* to kick-start less using the browser api
*/
-import defaultOptions from '../less/default-options';
-import addDefaultOptions from './add-default-options';
-import root from './index';
+import defaultOptions from '../less/default-options.js';
+import addDefaultOptions from './add-default-options.js';
+import root from './index.js';
const options = defaultOptions();
diff --git a/packages/less/src/less-browser/browser.js b/packages/less/lib/less-browser/browser.js
similarity index 98%
rename from packages/less/src/less-browser/browser.js
rename to packages/less/lib/less-browser/browser.js
index 58f339ccf..8f071ad45 100644
--- a/packages/less/src/less-browser/browser.js
+++ b/packages/less/lib/less-browser/browser.js
@@ -1,4 +1,4 @@
-import * as utils from './utils';
+import * as utils from './utils.js';
export default {
createCSS: function (document, styles, sheet) {
diff --git a/packages/less/src/less-browser/cache.js b/packages/less/lib/less-browser/cache.js
similarity index 100%
rename from packages/less/src/less-browser/cache.js
rename to packages/less/lib/less-browser/cache.js
diff --git a/packages/less/src/less-browser/error-reporting.js b/packages/less/lib/less-browser/error-reporting.js
similarity index 98%
rename from packages/less/src/less-browser/error-reporting.js
rename to packages/less/lib/less-browser/error-reporting.js
index e1ef840ac..947b58b1e 100644
--- a/packages/less/src/less-browser/error-reporting.js
+++ b/packages/less/lib/less-browser/error-reporting.js
@@ -1,5 +1,5 @@
-import * as utils from './utils';
-import browser from './browser';
+import * as utils from './utils.js';
+import browser from './browser.js';
export default (window, less, options) => {
diff --git a/packages/less/src/less-browser/file-manager.js b/packages/less/lib/less-browser/file-manager.js
similarity index 100%
rename from packages/less/src/less-browser/file-manager.js
rename to packages/less/lib/less-browser/file-manager.js
diff --git a/packages/less/src/less-browser/image-size.js b/packages/less/lib/less-browser/image-size.js
similarity index 98%
rename from packages/less/src/less-browser/image-size.js
rename to packages/less/lib/less-browser/image-size.js
index 8e3caccdf..6c69adb52 100644
--- a/packages/less/src/less-browser/image-size.js
+++ b/packages/less/lib/less-browser/image-size.js
@@ -1,5 +1,5 @@
-import functionRegistry from './../less/functions/function-registry';
+import functionRegistry from './../less/functions/function-registry.js';
export default () => {
function imageSize() {
diff --git a/packages/less/src/less-browser/index.js b/packages/less/lib/less-browser/index.js
similarity index 95%
rename from packages/less/src/less-browser/index.js
rename to packages/less/lib/less-browser/index.js
index 8529273eb..b10a2bf31 100644
--- a/packages/less/src/less-browser/index.js
+++ b/packages/less/lib/less-browser/index.js
@@ -2,15 +2,16 @@
// index.js
// Should expose the additional browser functions on to the less object
//
-import {addDataAttr} from './utils';
-import lessRoot from '../less';
-import browser from './browser';
-import FM from './file-manager';
-import PluginLoader from './plugin-loader';
-import LogListener from './log-listener';
-import ErrorReporting from './error-reporting';
-import Cache from './cache';
-import ImageSize from './image-size';
+import {addDataAttr} from './utils.js';
+import lessRoot from '../less/index.js';
+import browser from './browser.js';
+import FM from './file-manager.js';
+import PluginLoader from './plugin-loader.js';
+import LogListener from './log-listener.js';
+import ErrorReporting from './error-reporting.js';
+import Cache from './cache.js';
+import ImageSize from './image-size.js';
+import pkg from '../../package.json';
/**
* @param {Window} window
@@ -18,7 +19,7 @@ import ImageSize from './image-size';
*/
export default (window, options) => {
const document = window.document;
- const less = lessRoot();
+ const less = lessRoot(undefined, undefined, pkg.version);
less.options = options;
const environment = less.environment;
diff --git a/packages/less/src/less-browser/log-listener.js b/packages/less/lib/less-browser/log-listener.js
similarity index 100%
rename from packages/less/src/less-browser/log-listener.js
rename to packages/less/lib/less-browser/log-listener.js
diff --git a/packages/less/src/less-browser/plugin-loader.js b/packages/less/lib/less-browser/plugin-loader.js
similarity index 100%
rename from packages/less/src/less-browser/plugin-loader.js
rename to packages/less/lib/less-browser/plugin-loader.js
diff --git a/packages/less/src/less-browser/utils.js b/packages/less/lib/less-browser/utils.js
similarity index 100%
rename from packages/less/src/less-browser/utils.js
rename to packages/less/lib/less-browser/utils.js
diff --git a/packages/less/lib/less-node/environment.js b/packages/less/lib/less-node/environment.js
new file mode 100644
index 000000000..f210f8f3a
--- /dev/null
+++ b/packages/less/lib/less-node/environment.js
@@ -0,0 +1,43 @@
+import { createRequire } from 'module';
+
+const require = createRequire(import.meta.url);
+
+class SourceMapGeneratorFallback {
+ addMapping(){}
+ setSourceContent(){}
+ toJSON(){
+ return null;
+ }
+};
+
+export default {
+ encodeBase64: function encodeBase64(str) {
+ // Avoid Buffer constructor on newer versions of Node.js.
+ const buffer = (Buffer.from ? Buffer.from(str) : (new Buffer(str)));
+ return buffer.toString('base64');
+ },
+ mimeLookup: function (filename) {
+ try {
+ const mimeModule = require('mime');
+ return mimeModule ? mimeModule.lookup(filename) : "application/octet-stream";
+ } catch (e) {
+ return "application/octet-stream";
+ }
+ },
+ charsetLookup: function (mime) {
+ try {
+ const mimeModule = require('mime');
+ return mimeModule ? mimeModule.charsets.lookup(mime) : undefined;
+ } catch (e) {
+ return undefined;
+ }
+ },
+ getSourceMapGenerator: function getSourceMapGenerator() {
+ try {
+ const sourceMapModule = require('source-map');
+ return sourceMapModule ? sourceMapModule.SourceMapGenerator : SourceMapGeneratorFallback;
+ } catch (e) {
+ return SourceMapGeneratorFallback;
+ }
+ }
+};
diff --git a/packages/less/src/less-node/file-manager.js b/packages/less/lib/less-node/file-manager.js
similarity index 98%
rename from packages/less/src/less-node/file-manager.js
rename to packages/less/lib/less-node/file-manager.js
index 9f8f3f476..65d2c99bc 100644
--- a/packages/less/src/less-node/file-manager.js
+++ b/packages/less/lib/less-node/file-manager.js
@@ -1,7 +1,10 @@
import path from 'path';
-import fs from './fs';
+import { createRequire } from 'module';
+import fs from './fs.js';
import AbstractFileManager from '../less/environment/abstract-file-manager.js';
+const require = createRequire(import.meta.url);
+
const FileManager = function() {}
FileManager.prototype = Object.assign(new AbstractFileManager(), {
supports() {
diff --git a/packages/less/lib/less-node/fs.js b/packages/less/lib/less-node/fs.js
new file mode 100644
index 000000000..05acdcb61
--- /dev/null
+++ b/packages/less/lib/less-node/fs.js
@@ -0,0 +1,12 @@
+import nodeFs from 'fs';
+import { createRequire } from 'module';
+
+const require = createRequire(import.meta.url);
+
+let fs;
+try {
+ fs = require('graceful-fs');
+} catch (e) {
+ fs = nodeFs;
+}
+export default fs;
diff --git a/packages/less/src/less-node/image-size.js b/packages/less/lib/less-node/image-size.js
similarity index 90%
rename from packages/less/src/less-node/image-size.js
rename to packages/less/lib/less-node/image-size.js
index c53edd62e..582393632 100644
--- a/packages/less/src/less-node/image-size.js
+++ b/packages/less/lib/less-node/image-size.js
@@ -1,6 +1,9 @@
-import Dimension from '../less/tree/dimension';
-import Expression from '../less/tree/expression';
-import functionRegistry from './../less/functions/function-registry';
+import { createRequire } from 'module';
+import Dimension from '../less/tree/dimension.js';
+import Expression from '../less/tree/expression.js';
+import functionRegistry from './../less/functions/function-registry.js';
+
+const require = createRequire(import.meta.url);
export default environment => {
diff --git a/packages/less/lib/less-node/index.js b/packages/less/lib/less-node/index.js
new file mode 100644
index 000000000..5d91921d0
--- /dev/null
+++ b/packages/less/lib/less-node/index.js
@@ -0,0 +1,31 @@
+import { createRequire } from 'module';
+import environment from './environment.js';
+import FileManager from './file-manager.js';
+import UrlFileManager from './url-file-manager.js';
+import createFromEnvironment from '../less/index.js';
+import lesscHelper from './lessc-helper.js';
+import PluginLoader from './plugin-loader.js';
+import fs from './fs.js';
+import defaultOptions from '../less/default-options.js';
+import imageSize from './image-size.js';
+
+const require = createRequire(import.meta.url);
+const { version } = require('../../package.json');
+
+const less = createFromEnvironment(environment, [new FileManager(), new UrlFileManager()], version);
+
+// allow people to create less with their own environment
+less.createFromEnvironment = createFromEnvironment;
+less.lesscHelper = lesscHelper;
+less.PluginLoader = PluginLoader;
+less.fs = fs;
+less.FileManager = FileManager;
+less.UrlFileManager = UrlFileManager;
+
+// Set up options
+less.options = defaultOptions();
+
+// provide image-size functionality
+imageSize(less.environment);
+
+export default less;
diff --git a/packages/less/src/less-node/lessc-helper.js b/packages/less/lib/less-node/lessc-helper.js
similarity index 97%
rename from packages/less/src/less-node/lessc-helper.js
rename to packages/less/lib/less-node/lessc-helper.js
index 6103caa8d..137991ad6 100644
--- a/packages/less/src/less-node/lessc-helper.js
+++ b/packages/less/lib/less-node/lessc-helper.js
@@ -91,6 +91,5 @@ const lessc_helper = {
}
};
-// Exports helper functions
-// eslint-disable-next-line no-prototype-builtins
-for (const h in lessc_helper) { if (lessc_helper.hasOwnProperty(h)) { exports[h] = lessc_helper[h]; }}
+export const { stylize, printUsage } = lessc_helper;
+export default lessc_helper;
diff --git a/packages/less/src/less-node/plugin-loader.js b/packages/less/lib/less-node/plugin-loader.js
similarity index 95%
rename from packages/less/src/less-node/plugin-loader.js
rename to packages/less/lib/less-node/plugin-loader.js
index d4a0b1d0e..cb11ca09c 100644
--- a/packages/less/src/less-node/plugin-loader.js
+++ b/packages/less/lib/less-node/plugin-loader.js
@@ -1,6 +1,9 @@
import path from 'path';
+import { createRequire } from 'module';
import AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';
+const require = createRequire(import.meta.url);
+
/**
* Node Plugin Loader
*/
diff --git a/packages/less/src/less-node/url-file-manager.js b/packages/less/lib/less-node/url-file-manager.js
similarity index 94%
rename from packages/less/src/less-node/url-file-manager.js
rename to packages/less/lib/less-node/url-file-manager.js
index 7a9092e22..ecc6a1893 100644
--- a/packages/less/src/less-node/url-file-manager.js
+++ b/packages/less/lib/less-node/url-file-manager.js
@@ -3,11 +3,15 @@
* @todo - remove top eslint rule when FileManagers have JSDoc type
* and are TS-type-checked
*/
+import { createRequire } from 'module';
+
+const require = createRequire(import.meta.url);
+
const isUrlRe = /^(?:https?:)?\/\//i;
import url from 'url';
let request;
import AbstractFileManager from '../less/environment/abstract-file-manager.js';
-import logger from '../less/logger';
+import logger from '../less/logger.js';
const UrlFileManager = function() {}
UrlFileManager.prototype = Object.assign(new AbstractFileManager(), {
diff --git a/packages/less/src/less/constants.js b/packages/less/lib/less/constants.js
similarity index 100%
rename from packages/less/src/less/constants.js
rename to packages/less/lib/less/constants.js
diff --git a/packages/less/src/less/contexts.js b/packages/less/lib/less/contexts.js
similarity index 99%
rename from packages/less/src/less/contexts.js
rename to packages/less/lib/less/contexts.js
index 6f38fa2f5..c3c848bbd 100644
--- a/packages/less/src/less/contexts.js
+++ b/packages/less/lib/less/contexts.js
@@ -1,6 +1,6 @@
const contexts = {};
export default contexts;
-import * as Constants from './constants';
+import * as Constants from './constants.js';
const copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {
if (!original) { return; }
diff --git a/packages/less/src/less/data/colors.js b/packages/less/lib/less/data/colors.js
similarity index 100%
rename from packages/less/src/less/data/colors.js
rename to packages/less/lib/less/data/colors.js
diff --git a/packages/less/lib/less/data/index.js b/packages/less/lib/less/data/index.js
new file mode 100644
index 000000000..f3abd084a
--- /dev/null
+++ b/packages/less/lib/less/data/index.js
@@ -0,0 +1,4 @@
+import colors from './colors.js';
+import unitConversions from './unit-conversions.js';
+
+export default { colors, unitConversions };
diff --git a/packages/less/src/less/data/unit-conversions.js b/packages/less/lib/less/data/unit-conversions.js
similarity index 100%
rename from packages/less/src/less/data/unit-conversions.js
rename to packages/less/lib/less/data/unit-conversions.js
diff --git a/packages/less/src/less/default-options.js b/packages/less/lib/less/default-options.js
similarity index 100%
rename from packages/less/src/less/default-options.js
rename to packages/less/lib/less/default-options.js
diff --git a/packages/less/src/less/deprecation.js b/packages/less/lib/less/deprecation.js
similarity index 100%
rename from packages/less/src/less/deprecation.js
rename to packages/less/lib/less/deprecation.js
diff --git a/packages/less/src/less/environment/abstract-file-manager.js b/packages/less/lib/less/environment/abstract-file-manager.js
similarity index 100%
rename from packages/less/src/less/environment/abstract-file-manager.js
rename to packages/less/lib/less/environment/abstract-file-manager.js
diff --git a/packages/less/src/less/environment/abstract-plugin-loader.js b/packages/less/lib/less/environment/abstract-plugin-loader.js
similarity index 98%
rename from packages/less/src/less/environment/abstract-plugin-loader.js
rename to packages/less/lib/less/environment/abstract-plugin-loader.js
index 917c24baa..ce2aafb3f 100644
--- a/packages/less/src/less/environment/abstract-plugin-loader.js
+++ b/packages/less/lib/less/environment/abstract-plugin-loader.js
@@ -1,5 +1,5 @@
-import functionRegistry from '../functions/function-registry';
-import LessError from '../less-error';
+import functionRegistry from '../functions/function-registry.js';
+import LessError from '../less-error.js';
class AbstractPluginLoader {
constructor() {
diff --git a/packages/less/src/less/environment/environment-api.ts b/packages/less/lib/less/environment/environment-api.ts
similarity index 100%
rename from packages/less/src/less/environment/environment-api.ts
rename to packages/less/lib/less/environment/environment-api.ts
diff --git a/packages/less/src/less/environment/environment.js b/packages/less/lib/less/environment/environment.js
similarity index 98%
rename from packages/less/src/less/environment/environment.js
rename to packages/less/lib/less/environment/environment.js
index f7d65c6a1..3940929f3 100644
--- a/packages/less/src/less/environment/environment.js
+++ b/packages/less/lib/less/environment/environment.js
@@ -3,7 +3,7 @@
* environment, file managers, and plugin manager
*/
-import logger from '../logger';
+import logger from '../logger.js';
class Environment {
constructor(externalEnvironment, fileManagers) {
diff --git a/packages/less/src/less/environment/file-manager-api.ts b/packages/less/lib/less/environment/file-manager-api.ts
similarity index 100%
rename from packages/less/src/less/environment/file-manager-api.ts
rename to packages/less/lib/less/environment/file-manager-api.ts
diff --git a/packages/less/src/less/functions/boolean.js b/packages/less/lib/less/functions/boolean.js
similarity index 87%
rename from packages/less/src/less/functions/boolean.js
rename to packages/less/lib/less/functions/boolean.js
index e483bbb23..e6a57a3b3 100644
--- a/packages/less/src/less/functions/boolean.js
+++ b/packages/less/lib/less/functions/boolean.js
@@ -1,5 +1,5 @@
-import Anonymous from '../tree/anonymous';
-import Keyword from '../tree/keyword';
+import Anonymous from '../tree/anonymous.js';
+import Keyword from '../tree/keyword.js';
function boolean(condition) {
return condition ? Keyword.True : Keyword.False;
diff --git a/packages/less/src/less/functions/color-blending.js b/packages/less/lib/less/functions/color-blending.js
similarity index 98%
rename from packages/less/src/less/functions/color-blending.js
rename to packages/less/lib/less/functions/color-blending.js
index c38a5e426..4e7873701 100644
--- a/packages/less/src/less/functions/color-blending.js
+++ b/packages/less/lib/less/functions/color-blending.js
@@ -1,4 +1,4 @@
-import Color from '../tree/color';
+import Color from '../tree/color.js';
// Color Blending
// ref: http://www.w3.org/TR/compositing-1
diff --git a/packages/less/src/less/functions/color.js b/packages/less/lib/less/functions/color.js
similarity index 98%
rename from packages/less/src/less/functions/color.js
rename to packages/less/lib/less/functions/color.js
index c49d233ce..6f5ee5b34 100644
--- a/packages/less/src/less/functions/color.js
+++ b/packages/less/lib/less/functions/color.js
@@ -1,9 +1,9 @@
-import Dimension from '../tree/dimension';
-import Color from '../tree/color';
-import Quoted from '../tree/quoted';
-import Anonymous from '../tree/anonymous';
-import Expression from '../tree/expression';
-import Operation from '../tree/operation';
+import Dimension from '../tree/dimension.js';
+import Color from '../tree/color.js';
+import Quoted from '../tree/quoted.js';
+import Anonymous from '../tree/anonymous.js';
+import Expression from '../tree/expression.js';
+import Operation from '../tree/operation.js';
let colorFunctions;
function clamp(val) {
diff --git a/packages/less/src/less/functions/data-uri.js b/packages/less/lib/less/functions/data-uri.js
similarity index 94%
rename from packages/less/src/less/functions/data-uri.js
rename to packages/less/lib/less/functions/data-uri.js
index 3c09c507f..a2ac67f53 100644
--- a/packages/less/src/less/functions/data-uri.js
+++ b/packages/less/lib/less/functions/data-uri.js
@@ -1,7 +1,7 @@
-import Quoted from '../tree/quoted';
-import URL from '../tree/url';
-import * as utils from '../utils';
-import logger from '../logger';
+import Quoted from '../tree/quoted.js';
+import URL from '../tree/url.js';
+import * as utils from '../utils.js';
+import logger from '../logger.js';
export default environment => {
diff --git a/packages/less/src/less/functions/default.js b/packages/less/lib/less/functions/default.js
similarity index 85%
rename from packages/less/src/less/functions/default.js
rename to packages/less/lib/less/functions/default.js
index 61c14b9ac..8c59a4cb4 100644
--- a/packages/less/src/less/functions/default.js
+++ b/packages/less/lib/less/functions/default.js
@@ -1,5 +1,5 @@
-import Keyword from '../tree/keyword';
-import * as utils from '../utils';
+import Keyword from '../tree/keyword.js';
+import * as utils from '../utils.js';
const defaultFunc = {
eval: function () {
diff --git a/packages/less/src/less/functions/function-caller.js b/packages/less/lib/less/functions/function-caller.js
similarity index 97%
rename from packages/less/src/less/functions/function-caller.js
rename to packages/less/lib/less/functions/function-caller.js
index 4a46ec74b..19e6cf6b3 100644
--- a/packages/less/src/less/functions/function-caller.js
+++ b/packages/less/lib/less/functions/function-caller.js
@@ -1,4 +1,4 @@
-import Expression from '../tree/expression';
+import Expression from '../tree/expression.js';
class functionCaller {
constructor(name, context, index, currentFileInfo) {
diff --git a/packages/less/src/less/functions/function-registry.js b/packages/less/lib/less/functions/function-registry.js
similarity index 100%
rename from packages/less/src/less/functions/function-registry.js
rename to packages/less/lib/less/functions/function-registry.js
diff --git a/packages/less/src/less/functions/index.js b/packages/less/lib/less/functions/index.js
similarity index 57%
rename from packages/less/src/less/functions/index.js
rename to packages/less/lib/less/functions/index.js
index 160ac7523..9ceda8da4 100644
--- a/packages/less/src/less/functions/index.js
+++ b/packages/less/lib/less/functions/index.js
@@ -1,18 +1,18 @@
-import functionRegistry from './function-registry';
-import functionCaller from './function-caller';
+import functionRegistry from './function-registry.js';
+import functionCaller from './function-caller.js';
-import boolean from './boolean';
-import defaultFunc from './default';
-import color from './color';
-import colorBlending from './color-blending';
-import dataUri from './data-uri';
-import list from './list';
-import math from './math';
-import number from './number';
-import string from './string';
-import svg from './svg';
-import types from './types';
-import style from './style';
+import boolean from './boolean.js';
+import defaultFunc from './default.js';
+import color from './color.js';
+import colorBlending from './color-blending.js';
+import dataUri from './data-uri.js';
+import list from './list.js';
+import math from './math.js';
+import number from './number.js';
+import string from './string.js';
+import svg from './svg.js';
+import types from './types.js';
+import style from './style.js';
export default environment => {
const functions = { functionRegistry, functionCaller };
diff --git a/packages/less/src/less/functions/list.js b/packages/less/lib/less/functions/list.js
similarity index 90%
rename from packages/less/src/less/functions/list.js
rename to packages/less/lib/less/functions/list.js
index 6ba33a305..14be82f29 100644
--- a/packages/less/src/less/functions/list.js
+++ b/packages/less/lib/less/functions/list.js
@@ -1,13 +1,13 @@
-import Comment from '../tree/comment';
-import Node from '../tree/node';
-import Dimension from '../tree/dimension';
-import Declaration from '../tree/declaration';
-import Expression from '../tree/expression';
-import Ruleset from '../tree/ruleset';
-import Selector from '../tree/selector';
-import Element from '../tree/element';
-import Quote from '../tree/quoted';
-import Value from '../tree/value';
+import Comment from '../tree/comment.js';
+import Node from '../tree/node.js';
+import Dimension from '../tree/dimension.js';
+import Declaration from '../tree/declaration.js';
+import Expression from '../tree/expression.js';
+import Ruleset from '../tree/ruleset.js';
+import Selector from '../tree/selector.js';
+import Element from '../tree/element.js';
+import Quote from '../tree/quoted.js';
+import Value from '../tree/value.js';
const getItemsFromNode = node => {
// handle non-array values as an array of length 1
diff --git a/packages/less/src/less/functions/math-helper.js b/packages/less/lib/less/functions/math-helper.js
similarity index 87%
rename from packages/less/src/less/functions/math-helper.js
rename to packages/less/lib/less/functions/math-helper.js
index b557875c5..9803710e3 100644
--- a/packages/less/src/less/functions/math-helper.js
+++ b/packages/less/lib/less/functions/math-helper.js
@@ -1,4 +1,4 @@
-import Dimension from '../tree/dimension';
+import Dimension from '../tree/dimension.js';
const MathHelper = (fn, unit, n) => {
if (!(n instanceof Dimension)) {
diff --git a/packages/less/src/less/functions/math.js b/packages/less/lib/less/functions/math.js
similarity index 100%
rename from packages/less/src/less/functions/math.js
rename to packages/less/lib/less/functions/math.js
diff --git a/packages/less/src/less/functions/number.js b/packages/less/lib/less/functions/number.js
similarity index 97%
rename from packages/less/src/less/functions/number.js
rename to packages/less/lib/less/functions/number.js
index ccb97afef..8fa932aeb 100644
--- a/packages/less/src/less/functions/number.js
+++ b/packages/less/lib/less/functions/number.js
@@ -1,5 +1,5 @@
-import Dimension from '../tree/dimension';
-import Anonymous from '../tree/anonymous';
+import Dimension from '../tree/dimension.js';
+import Anonymous from '../tree/anonymous.js';
import mathHelper from './math-helper.js';
const minMax = function (isMin, args) {
diff --git a/packages/less/src/less/functions/string.js b/packages/less/lib/less/functions/string.js
similarity index 91%
rename from packages/less/src/less/functions/string.js
rename to packages/less/lib/less/functions/string.js
index 2ded20551..b4de36356 100644
--- a/packages/less/src/less/functions/string.js
+++ b/packages/less/lib/less/functions/string.js
@@ -1,6 +1,6 @@
-import Quoted from '../tree/quoted';
-import Anonymous from '../tree/anonymous';
-import JavaScript from '../tree/javascript';
+import Quoted from '../tree/quoted.js';
+import Anonymous from '../tree/anonymous.js';
+import JavaScript from '../tree/javascript.js';
export default {
e: function (str) {
diff --git a/packages/less/src/less/functions/style.js b/packages/less/lib/less/functions/style.js
similarity index 90%
rename from packages/less/src/less/functions/style.js
rename to packages/less/lib/less/functions/style.js
index cb090ae8d..cbb10a363 100644
--- a/packages/less/src/less/functions/style.js
+++ b/packages/less/lib/less/functions/style.js
@@ -1,5 +1,5 @@
-import Variable from '../tree/variable';
-import Anonymous from '../tree/anonymous';
+import Variable from '../tree/variable.js';
+import Anonymous from '../tree/anonymous.js';
const styleExpression = function (args) {
args = Array.prototype.slice.call(args);
diff --git a/packages/less/src/less/functions/svg.js b/packages/less/lib/less/functions/svg.js
similarity index 94%
rename from packages/less/src/less/functions/svg.js
rename to packages/less/lib/less/functions/svg.js
index a1d06314c..2c2fd30a9 100644
--- a/packages/less/src/less/functions/svg.js
+++ b/packages/less/lib/less/functions/svg.js
@@ -1,8 +1,8 @@
-import Dimension from '../tree/dimension';
-import Color from '../tree/color';
-import Expression from '../tree/expression';
-import Quoted from '../tree/quoted';
-import URL from '../tree/url';
+import Dimension from '../tree/dimension.js';
+import Color from '../tree/color.js';
+import Expression from '../tree/expression.js';
+import Quoted from '../tree/quoted.js';
+import URL from '../tree/url.js';
export default () => {
return { 'svg-gradient': function(direction) {
diff --git a/packages/less/src/less/functions/types.js b/packages/less/lib/less/functions/types.js
similarity index 83%
rename from packages/less/src/less/functions/types.js
rename to packages/less/lib/less/functions/types.js
index 6f1aff30f..1f065f680 100644
--- a/packages/less/src/less/functions/types.js
+++ b/packages/less/lib/less/functions/types.js
@@ -1,11 +1,11 @@
-import Keyword from '../tree/keyword';
-import DetachedRuleset from '../tree/detached-ruleset';
-import Dimension from '../tree/dimension';
-import Color from '../tree/color';
-import Quoted from '../tree/quoted';
-import Anonymous from '../tree/anonymous';
-import URL from '../tree/url';
-import Operation from '../tree/operation';
+import Keyword from '../tree/keyword.js';
+import DetachedRuleset from '../tree/detached-ruleset.js';
+import Dimension from '../tree/dimension.js';
+import Color from '../tree/color.js';
+import Quoted from '../tree/quoted.js';
+import Anonymous from '../tree/anonymous.js';
+import URL from '../tree/url.js';
+import Operation from '../tree/operation.js';
const isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;
const isunit = (n, unit) => {
diff --git a/packages/less/src/less/import-manager.js b/packages/less/lib/less/import-manager.js
similarity index 97%
rename from packages/less/src/less/import-manager.js
rename to packages/less/lib/less/import-manager.js
index 350f242db..886d30678 100644
--- a/packages/less/src/less/import-manager.js
+++ b/packages/less/lib/less/import-manager.js
@@ -1,8 +1,8 @@
-import contexts from './contexts';
-import Parser from './parser/parser';
-import LessError from './less-error';
-import * as utils from './utils';
-import logger from './logger';
+import contexts from './contexts.js';
+import Parser from './parser/parser.js';
+import LessError from './less-error.js';
+import * as utils from './utils.js';
+import logger from './logger.js';
export default function(environment) {
// FileInfo = {
diff --git a/packages/less/src/less/index.js b/packages/less/lib/less/index.js
similarity index 72%
rename from packages/less/src/less/index.js
rename to packages/less/lib/less/index.js
index e10d0a12c..21a53834c 100644
--- a/packages/less/src/less/index.js
+++ b/packages/less/lib/less/index.js
@@ -1,27 +1,26 @@
-import Environment from './environment/environment';
-import data from './data';
-import tree from './tree';
-import AbstractFileManager from './environment/abstract-file-manager';
-import AbstractPluginLoader from './environment/abstract-plugin-loader';
-import visitors from './visitors';
-import Parser from './parser/parser';
-import functions from './functions';
-import contexts from './contexts';
-import LessError from './less-error';
-import transformTree from './transform-tree';
-import * as utils from './utils';
-import PluginManager from './plugin-manager';
-import logger from './logger';
-import SourceMapOutput from './source-map-output';
-import SourceMapBuilder from './source-map-builder';
-import ParseTree from './parse-tree';
-import ImportManager from './import-manager';
-import Parse from './parse';
-import Render from './render';
-import { version } from '../../package.json';
+import Environment from './environment/environment.js';
+import data from './data/index.js';
+import tree from './tree/index.js';
+import AbstractFileManager from './environment/abstract-file-manager.js';
+import AbstractPluginLoader from './environment/abstract-plugin-loader.js';
+import visitors from './visitors/index.js';
+import Parser from './parser/parser.js';
+import functions from './functions/index.js';
+import contexts from './contexts.js';
+import LessError from './less-error.js';
+import transformTree from './transform-tree.js';
+import * as utils from './utils.js';
+import PluginManager from './plugin-manager.js';
+import logger from './logger.js';
+import SourceMapOutput from './source-map-output.js';
+import SourceMapBuilder from './source-map-builder.js';
+import ParseTree from './parse-tree.js';
+import ImportManager from './import-manager.js';
+import Parse from './parse.js';
+import Render from './render.js';
import parseVersion from 'parse-node-version';
-export default function(environment, fileManagers) {
+export default function(environment, fileManagers, version = '0.0.0') {
let sourceMapOutput, sourceMapBuilder, parseTree, importManager;
environment = new Environment(environment, fileManagers);
diff --git a/packages/less/src/less/less-error.js b/packages/less/lib/less/less-error.js
similarity index 99%
rename from packages/less/src/less/less-error.js
rename to packages/less/lib/less/less-error.js
index ee08b3e31..659cdb0a4 100644
--- a/packages/less/src/less/less-error.js
+++ b/packages/less/lib/less/less-error.js
@@ -1,4 +1,4 @@
-import * as utils from './utils';
+import * as utils from './utils.js';
const anonymousFunc = /(|Function):(\d+):(\d+)/;
diff --git a/packages/less/src/less/logger.js b/packages/less/lib/less/logger.js
similarity index 100%
rename from packages/less/src/less/logger.js
rename to packages/less/lib/less/logger.js
diff --git a/packages/less/src/less/parse-tree.js b/packages/less/lib/less/parse-tree.js
similarity index 93%
rename from packages/less/src/less/parse-tree.js
rename to packages/less/lib/less/parse-tree.js
index f4e578ea7..939ab1dfb 100644
--- a/packages/less/src/less/parse-tree.js
+++ b/packages/less/lib/less/parse-tree.js
@@ -1,6 +1,6 @@
-import LessError from './less-error';
-import transformTree from './transform-tree';
-import logger from './logger';
+import LessError from './less-error.js';
+import transformTree from './transform-tree.js';
+import logger from './logger.js';
export default function(SourceMapBuilder) {
class ParseTree {
@@ -75,17 +75,17 @@ export default function(SourceMapBuilder) {
// Use output filename + .map
sourceMapOpts.sourceMapFilename = sourceMapOpts.sourceMapOutputFilename + '.map';
} else if (options.filename) {
- // Fallback to input filename + .css.map
- const inputBase = options.filename.replace(/\.[^/.]+$/, '');
- sourceMapOpts.sourceMapFilename = inputBase + '.css.map';
+ // Fallback to input filename + .css.map (basename only)
+ const inputBasename = options.filename.split(/[/\\]/).pop().replace(/\.[^/.]+$/, '');
+ sourceMapOpts.sourceMapFilename = inputBasename + '.css.map';
}
}
// Default sourceMapOutputFilename if not set
if (!sourceMapOpts.sourceMapOutputFilename) {
if (options.filename) {
- const inputBase = options.filename.replace(/\.[^/.]+$/, '');
- sourceMapOpts.sourceMapOutputFilename = inputBase + '.css';
+ const inputBasename = options.filename.split(/[/\\]/).pop().replace(/\.[^/.]+$/, '');
+ sourceMapOpts.sourceMapOutputFilename = inputBasename + '.css';
} else {
sourceMapOpts.sourceMapOutputFilename = 'output.css';
}
diff --git a/packages/less/src/less/parse.js b/packages/less/lib/less/parse.js
similarity index 93%
rename from packages/less/src/less/parse.js
rename to packages/less/lib/less/parse.js
index 9a27e6155..a552fcd17 100644
--- a/packages/less/src/less/parse.js
+++ b/packages/less/lib/less/parse.js
@@ -1,8 +1,8 @@
-import contexts from './contexts';
-import Parser from './parser/parser';
-import PluginManager from './plugin-manager';
-import LessError from './less-error';
-import * as utils from './utils';
+import contexts from './contexts.js';
+import Parser from './parser/parser.js';
+import PluginManager from './plugin-manager.js';
+import LessError from './less-error.js';
+import * as utils from './utils.js';
export default function(environment, ParseTree, ImportManager) {
const parse = function (input, options, callback) {
diff --git a/packages/less/src/less/parser/parser-input.js b/packages/less/lib/less/parser/parser-input.js
similarity index 100%
rename from packages/less/src/less/parser/parser-input.js
rename to packages/less/lib/less/parser/parser-input.js
diff --git a/packages/less/src/less/parser/parser.js b/packages/less/lib/less/parser/parser.js
similarity index 99%
rename from packages/less/src/less/parser/parser.js
rename to packages/less/lib/less/parser/parser.js
index 6cdfeafef..91b23a093 100644
--- a/packages/less/src/less/parser/parser.js
+++ b/packages/less/lib/less/parser/parser.js
@@ -1,14 +1,14 @@
-import LessError from '../less-error';
-import tree from '../tree';
-import visitors from '../visitors';
-import getParserInput from './parser-input';
-import * as utils from '../utils';
-import functionRegistry from '../functions/function-registry';
-import { ContainerSyntaxOptions, MediaSyntaxOptions } from '../tree/atrule-syntax';
-import logger from '../logger';
-import { DeprecationHandler } from '../deprecation';
-import Selector from '../tree/selector';
-import Anonymous from '../tree/anonymous';
+import LessError from '../less-error.js';
+import tree from '../tree/index.js';
+import visitors from '../visitors/index.js';
+import getParserInput from './parser-input.js';
+import * as utils from '../utils.js';
+import functionRegistry from '../functions/function-registry.js';
+import { ContainerSyntaxOptions, MediaSyntaxOptions } from '../tree/atrule-syntax.js';
+import logger from '../logger.js';
+import { DeprecationHandler } from '../deprecation.js';
+import Selector from '../tree/selector.js';
+import Anonymous from '../tree/anonymous.js';
//
// less.js - parser
diff --git a/packages/less/src/less/plugin-manager.js b/packages/less/lib/less/plugin-manager.js
similarity index 100%
rename from packages/less/src/less/plugin-manager.js
rename to packages/less/lib/less/plugin-manager.js
diff --git a/packages/less/src/less/render.js b/packages/less/lib/less/render.js
similarity index 97%
rename from packages/less/src/less/render.js
rename to packages/less/lib/less/render.js
index 8d25b1701..909a9663e 100644
--- a/packages/less/src/less/render.js
+++ b/packages/less/lib/less/render.js
@@ -1,4 +1,4 @@
-import * as utils from './utils';
+import * as utils from './utils.js';
export default function(environment, ParseTree) {
const render = function (input, options, callback) {
diff --git a/packages/less/src/less/source-map-builder.js b/packages/less/lib/less/source-map-builder.js
similarity index 100%
rename from packages/less/src/less/source-map-builder.js
rename to packages/less/lib/less/source-map-builder.js
diff --git a/packages/less/src/less/source-map-output.js b/packages/less/lib/less/source-map-output.js
similarity index 100%
rename from packages/less/src/less/source-map-output.js
rename to packages/less/lib/less/source-map-output.js
diff --git a/packages/less/src/less/transform-tree.js b/packages/less/lib/less/transform-tree.js
similarity index 96%
rename from packages/less/src/less/transform-tree.js
rename to packages/less/lib/less/transform-tree.js
index 8426f3201..f8402764c 100644
--- a/packages/less/src/less/transform-tree.js
+++ b/packages/less/lib/less/transform-tree.js
@@ -1,6 +1,6 @@
-import contexts from './contexts';
-import visitor from './visitors';
-import tree from './tree';
+import contexts from './contexts.js';
+import visitor from './visitors/index.js';
+import tree from './tree/index.js';
export default function(root, options) {
options = options || {};
diff --git a/packages/less/src/less/tree/anonymous.js b/packages/less/lib/less/tree/anonymous.js
similarity index 97%
rename from packages/less/src/less/tree/anonymous.js
rename to packages/less/lib/less/tree/anonymous.js
index 9c40a9526..b5764c5e5 100644
--- a/packages/less/src/less/tree/anonymous.js
+++ b/packages/less/lib/less/tree/anonymous.js
@@ -1,4 +1,4 @@
-import Node from './node';
+import Node from './node.js';
const Anonymous = function(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {
this.value = value;
diff --git a/packages/less/src/less/tree/assignment.js b/packages/less/lib/less/tree/assignment.js
similarity index 95%
rename from packages/less/src/less/tree/assignment.js
rename to packages/less/lib/less/tree/assignment.js
index 564d9220d..fa137d09b 100644
--- a/packages/less/src/less/tree/assignment.js
+++ b/packages/less/lib/less/tree/assignment.js
@@ -1,4 +1,4 @@
-import Node from './node';
+import Node from './node.js';
const Assignment = function(key, val) {
this.key = key;
diff --git a/packages/less/src/less/tree/atrule-syntax.js b/packages/less/lib/less/tree/atrule-syntax.js
similarity index 100%
rename from packages/less/src/less/tree/atrule-syntax.js
rename to packages/less/lib/less/tree/atrule-syntax.js
diff --git a/packages/less/src/less/tree/atrule.js b/packages/less/lib/less/tree/atrule.js
similarity index 97%
rename from packages/less/src/less/tree/atrule.js
rename to packages/less/lib/less/tree/atrule.js
index d1cf3513f..ba5378340 100644
--- a/packages/less/src/less/tree/atrule.js
+++ b/packages/less/lib/less/tree/atrule.js
@@ -1,9 +1,9 @@
-import Node from './node';
-import Selector from './selector';
-import Ruleset from './ruleset';
-import Anonymous from './anonymous';
-import NestableAtRulePrototype from './nested-at-rule';
-import mergeRules from './merge-rules';
+import Node from './node.js';
+import Selector from './selector.js';
+import Ruleset from './ruleset.js';
+import Anonymous from './anonymous.js';
+import NestableAtRulePrototype from './nested-at-rule.js';
+import mergeRules from './merge-rules.js';
const AtRule = function(
name,
diff --git a/packages/less/src/less/tree/attribute.js b/packages/less/lib/less/tree/attribute.js
similarity index 96%
rename from packages/less/src/less/tree/attribute.js
rename to packages/less/lib/less/tree/attribute.js
index e716d13d8..8cf15ce5b 100644
--- a/packages/less/src/less/tree/attribute.js
+++ b/packages/less/lib/less/tree/attribute.js
@@ -1,4 +1,4 @@
-import Node from './node';
+import Node from './node.js';
const Attribute = function(key, op, value, cif) {
this.key = key;
diff --git a/packages/less/src/less/tree/call.js b/packages/less/lib/less/tree/call.js
similarity index 96%
rename from packages/less/src/less/tree/call.js
rename to packages/less/lib/less/tree/call.js
index 15e98eb80..1653d5c9f 100644
--- a/packages/less/src/less/tree/call.js
+++ b/packages/less/lib/less/tree/call.js
@@ -1,6 +1,6 @@
-import Node from './node';
-import Anonymous from './anonymous';
-import FunctionCaller from '../functions/function-caller';
+import Node from './node.js';
+import Anonymous from './anonymous.js';
+import FunctionCaller from '../functions/function-caller.js';
//
// A function call node.
diff --git a/packages/less/src/less/tree/color.js b/packages/less/lib/less/tree/color.js
similarity index 99%
rename from packages/less/src/less/tree/color.js
rename to packages/less/lib/less/tree/color.js
index 906e69167..8d0315a93 100644
--- a/packages/less/src/less/tree/color.js
+++ b/packages/less/lib/less/tree/color.js
@@ -1,5 +1,5 @@
-import Node from './node';
-import colors from '../data/colors';
+import Node from './node.js';
+import colors from '../data/colors.js';
//
// RGB Colors - #ff0014, #eee
diff --git a/packages/less/src/less/tree/combinator.js b/packages/less/lib/less/tree/combinator.js
similarity index 95%
rename from packages/less/src/less/tree/combinator.js
rename to packages/less/lib/less/tree/combinator.js
index a98347699..4d6958d94 100644
--- a/packages/less/src/less/tree/combinator.js
+++ b/packages/less/lib/less/tree/combinator.js
@@ -1,4 +1,4 @@
-import Node from './node';
+import Node from './node.js';
const _noSpaceCombinators = {
'': true,
' ': true,
diff --git a/packages/less/src/less/tree/comment.js b/packages/less/lib/less/tree/comment.js
similarity index 90%
rename from packages/less/src/less/tree/comment.js
rename to packages/less/lib/less/tree/comment.js
index ce18c4e58..38ba40733 100644
--- a/packages/less/src/less/tree/comment.js
+++ b/packages/less/lib/less/tree/comment.js
@@ -1,5 +1,5 @@
-import Node from './node';
-import getDebugInfo from './debug-info';
+import Node from './node.js';
+import getDebugInfo from './debug-info.js';
const Comment = function(value, isLineComment, index, currentFileInfo) {
this.value = value;
diff --git a/packages/less/src/less/tree/condition.js b/packages/less/lib/less/tree/condition.js
similarity index 97%
rename from packages/less/src/less/tree/condition.js
rename to packages/less/lib/less/tree/condition.js
index 4ae3beb43..64e99933e 100644
--- a/packages/less/src/less/tree/condition.js
+++ b/packages/less/lib/less/tree/condition.js
@@ -1,4 +1,4 @@
-import Node from './node';
+import Node from './node.js';
const Condition = function(op, l, r, i, negate) {
this.op = op.trim();
diff --git a/packages/less/src/less/tree/container.js b/packages/less/lib/less/tree/container.js
similarity index 90%
rename from packages/less/src/less/tree/container.js
rename to packages/less/lib/less/tree/container.js
index 2b84b7926..c955f43e8 100644
--- a/packages/less/src/less/tree/container.js
+++ b/packages/less/lib/less/tree/container.js
@@ -1,8 +1,8 @@
-import Ruleset from './ruleset';
-import Value from './value';
-import Selector from './selector';
-import AtRule from './atrule';
-import NestableAtRulePrototype from './nested-at-rule';
+import Ruleset from './ruleset.js';
+import Value from './value.js';
+import Selector from './selector.js';
+import AtRule from './atrule.js';
+import NestableAtRulePrototype from './nested-at-rule.js';
const Container = function(value, features, index, currentFileInfo, visibilityInfo) {
this._index = index;
diff --git a/packages/less/src/less/tree/debug-info.js b/packages/less/lib/less/tree/debug-info.js
similarity index 100%
rename from packages/less/src/less/tree/debug-info.js
rename to packages/less/lib/less/tree/debug-info.js
diff --git a/packages/less/src/less/tree/declaration.js b/packages/less/lib/less/tree/declaration.js
similarity index 95%
rename from packages/less/src/less/tree/declaration.js
rename to packages/less/lib/less/tree/declaration.js
index 9291f495e..ca75d848d 100644
--- a/packages/less/src/less/tree/declaration.js
+++ b/packages/less/lib/less/tree/declaration.js
@@ -1,8 +1,8 @@
-import Node from './node';
-import Value from './value';
-import Keyword from './keyword';
-import Anonymous from './anonymous';
-import * as Constants from '../constants';
+import Node from './node.js';
+import Value from './value.js';
+import Keyword from './keyword.js';
+import Anonymous from './anonymous.js';
+import * as Constants from '../constants.js';
const MATH = Constants.Math;
function evalName(context, name) {
diff --git a/packages/less/src/less/tree/detached-ruleset.js b/packages/less/lib/less/tree/detached-ruleset.js
similarity index 86%
rename from packages/less/src/less/tree/detached-ruleset.js
rename to packages/less/lib/less/tree/detached-ruleset.js
index de5d91535..224ec918b 100644
--- a/packages/less/src/less/tree/detached-ruleset.js
+++ b/packages/less/lib/less/tree/detached-ruleset.js
@@ -1,6 +1,6 @@
-import Node from './node';
-import contexts from '../contexts';
-import * as utils from '../utils';
+import Node from './node.js';
+import contexts from '../contexts.js';
+import * as utils from '../utils.js';
const DetachedRuleset = function(ruleset, frames) {
this.ruleset = ruleset;
diff --git a/packages/less/src/less/tree/dimension.js b/packages/less/lib/less/tree/dimension.js
similarity index 97%
rename from packages/less/src/less/tree/dimension.js
rename to packages/less/lib/less/tree/dimension.js
index 2a8e61b82..1dad80ac8 100644
--- a/packages/less/src/less/tree/dimension.js
+++ b/packages/less/lib/less/tree/dimension.js
@@ -1,8 +1,8 @@
/* eslint-disable no-prototype-builtins */
-import Node from './node';
-import unitConversions from '../data/unit-conversions';
-import Unit from './unit';
-import Color from './color';
+import Node from './node.js';
+import unitConversions from '../data/unit-conversions.js';
+import Unit from './unit.js';
+import Color from './color.js';
//
// A number with a unit
diff --git a/packages/less/src/less/tree/element.js b/packages/less/lib/less/tree/element.js
similarity index 95%
rename from packages/less/src/less/tree/element.js
rename to packages/less/lib/less/tree/element.js
index 4331fbc44..30fb81c48 100644
--- a/packages/less/src/less/tree/element.js
+++ b/packages/less/lib/less/tree/element.js
@@ -1,6 +1,6 @@
-import Node from './node';
-import Paren from './paren';
-import Combinator from './combinator';
+import Node from './node.js';
+import Paren from './paren.js';
+import Combinator from './combinator.js';
const Element = function(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {
this.combinator = combinator instanceof Combinator ?
diff --git a/packages/less/src/less/tree/expression.js b/packages/less/lib/less/tree/expression.js
similarity index 92%
rename from packages/less/src/less/tree/expression.js
rename to packages/less/lib/less/tree/expression.js
index e4d370555..3bcd606fc 100644
--- a/packages/less/src/less/tree/expression.js
+++ b/packages/less/lib/less/tree/expression.js
@@ -1,8 +1,8 @@
-import Node from './node';
-import Paren from './paren';
-import Comment from './comment';
-import Dimension from './dimension';
-import Anonymous from './anonymous';
+import Node from './node.js';
+import Paren from './paren.js';
+import Comment from './comment.js';
+import Dimension from './dimension.js';
+import Anonymous from './anonymous.js';
const Expression = function(value, noSpacing) {
this.value = value;
diff --git a/packages/less/src/less/tree/extend.js b/packages/less/lib/less/tree/extend.js
similarity index 96%
rename from packages/less/src/less/tree/extend.js
rename to packages/less/lib/less/tree/extend.js
index 19ca6afe5..78e402a33 100644
--- a/packages/less/src/less/tree/extend.js
+++ b/packages/less/lib/less/tree/extend.js
@@ -1,5 +1,5 @@
-import Node from './node';
-import Selector from './selector';
+import Node from './node.js';
+import Selector from './selector.js';
const Extend = function(selector, option, index, currentFileInfo, visibilityInfo) {
this.selector = selector;
diff --git a/packages/less/src/less/tree/import.js b/packages/less/lib/less/tree/import.js
similarity index 96%
rename from packages/less/src/less/tree/import.js
rename to packages/less/lib/less/tree/import.js
index 0ba9e3038..599321b9b 100644
--- a/packages/less/src/less/tree/import.js
+++ b/packages/less/lib/less/tree/import.js
@@ -1,12 +1,12 @@
-import Node from './node';
-import Media from './media';
-import URL from './url';
-import Quoted from './quoted';
-import Ruleset from './ruleset';
-import Anonymous from './anonymous';
-import * as utils from '../utils';
-import LessError from '../less-error';
-import Expression from './expression';
+import Node from './node.js';
+import Media from './media.js';
+import URL from './url.js';
+import Quoted from './quoted.js';
+import Ruleset from './ruleset.js';
+import Anonymous from './anonymous.js';
+import * as utils from '../utils.js';
+import LessError from '../less-error.js';
+import Expression from './expression.js';
//
// CSS @import node
diff --git a/packages/less/lib/less/tree/index.js b/packages/less/lib/less/tree/index.js
new file mode 100644
index 000000000..a6460b709
--- /dev/null
+++ b/packages/less/lib/less/tree/index.js
@@ -0,0 +1,55 @@
+import Node from './node.js';
+import Color from './color.js';
+import AtRule from './atrule.js';
+import DetachedRuleset from './detached-ruleset.js';
+import Operation from './operation.js';
+import Dimension from './dimension.js';
+import Unit from './unit.js';
+import Keyword from './keyword.js';
+import Variable from './variable.js';
+import Property from './property.js';
+import Ruleset from './ruleset.js';
+import Element from './element.js';
+import Attribute from './attribute.js';
+import Combinator from './combinator.js';
+import Selector from './selector.js';
+import Quoted from './quoted.js';
+import Expression from './expression.js';
+import Declaration from './declaration.js';
+import Call from './call.js';
+import URL from './url.js';
+import Import from './import.js';
+import Comment from './comment.js';
+import Anonymous from './anonymous.js';
+import Value from './value.js';
+import JavaScript from './javascript.js';
+import Assignment from './assignment.js';
+import Condition from './condition.js';
+import QueryInParens from './query-in-parens.js';
+import Paren from './paren.js';
+import Media from './media.js';
+import Container from './container.js';
+import UnicodeDescriptor from './unicode-descriptor.js';
+import Negative from './negative.js';
+import Extend from './extend.js';
+import VariableCall from './variable-call.js';
+import NamespaceValue from './namespace-value.js';
+
+// mixins
+import MixinCall from './mixin-call.js';
+import MixinDefinition from './mixin-definition.js';
+
+export default {
+ Node, Color, AtRule, DetachedRuleset, Operation,
+ Dimension, Unit, Keyword, Variable, Property,
+ Ruleset, Element, Attribute, Combinator, Selector,
+ Quoted, Expression, Declaration, Call, URL, Import,
+ Comment, Anonymous, Value, JavaScript, Assignment,
+ Condition, Paren, Media, Container, QueryInParens,
+ UnicodeDescriptor, Negative, Extend, VariableCall,
+ NamespaceValue,
+ mixin: {
+ Call: MixinCall,
+ Definition: MixinDefinition
+ }
+};
\ No newline at end of file
diff --git a/packages/less/src/less/tree/javascript.js b/packages/less/lib/less/tree/javascript.js
similarity index 83%
rename from packages/less/src/less/tree/javascript.js
rename to packages/less/lib/less/tree/javascript.js
index ebdeeed88..9cdd3f1ee 100644
--- a/packages/less/src/less/tree/javascript.js
+++ b/packages/less/lib/less/tree/javascript.js
@@ -1,7 +1,7 @@
-import JsEvalNode from './js-eval-node';
-import Dimension from './dimension';
-import Quoted from './quoted';
-import Anonymous from './anonymous';
+import JsEvalNode from './js-eval-node.js';
+import Dimension from './dimension.js';
+import Quoted from './quoted.js';
+import Anonymous from './anonymous.js';
const JavaScript = function(string, escaped, index, currentFileInfo) {
this.escaped = escaped;
diff --git a/packages/less/src/less/tree/js-eval-node.js b/packages/less/lib/less/tree/js-eval-node.js
similarity index 96%
rename from packages/less/src/less/tree/js-eval-node.js
rename to packages/less/lib/less/tree/js-eval-node.js
index e57a22140..574496467 100644
--- a/packages/less/src/less/tree/js-eval-node.js
+++ b/packages/less/lib/less/tree/js-eval-node.js
@@ -1,5 +1,5 @@
-import Node from './node';
-import Variable from './variable';
+import Node from './node.js';
+import Variable from './variable.js';
const JsEvalNode = function() {};
diff --git a/packages/less/src/less/tree/keyword.js b/packages/less/lib/less/tree/keyword.js
similarity index 93%
rename from packages/less/src/less/tree/keyword.js
rename to packages/less/lib/less/tree/keyword.js
index d3b3704e8..bf7ab8807 100644
--- a/packages/less/src/less/tree/keyword.js
+++ b/packages/less/lib/less/tree/keyword.js
@@ -1,4 +1,4 @@
-import Node from './node';
+import Node from './node.js';
const Keyword = function(value) {
this.value = value;
diff --git a/packages/less/src/less/tree/media.js b/packages/less/lib/less/tree/media.js
similarity index 90%
rename from packages/less/src/less/tree/media.js
rename to packages/less/lib/less/tree/media.js
index 7ecd66936..5e01eeb49 100644
--- a/packages/less/src/less/tree/media.js
+++ b/packages/less/lib/less/tree/media.js
@@ -1,8 +1,8 @@
-import Ruleset from './ruleset';
-import Value from './value';
-import Selector from './selector';
-import AtRule from './atrule';
-import NestableAtRulePrototype from './nested-at-rule';
+import Ruleset from './ruleset.js';
+import Value from './value.js';
+import Selector from './selector.js';
+import AtRule from './atrule.js';
+import NestableAtRulePrototype from './nested-at-rule.js';
const Media = function(value, features, index, currentFileInfo, visibilityInfo) {
this._index = index;
diff --git a/packages/less/src/less/tree/merge-rules.js b/packages/less/lib/less/tree/merge-rules.js
similarity index 93%
rename from packages/less/src/less/tree/merge-rules.js
rename to packages/less/lib/less/tree/merge-rules.js
index 9adb08d16..10f48e105 100644
--- a/packages/less/src/less/tree/merge-rules.js
+++ b/packages/less/lib/less/tree/merge-rules.js
@@ -1,5 +1,5 @@
-import Expression from './expression';
-import Value from './value';
+import Expression from './expression.js';
+import Value from './value.js';
/**
* Merges declarations with merge flags (+ or ,) into combined values.
diff --git a/packages/less/src/less/tree/mixin-call.js b/packages/less/lib/less/tree/mixin-call.js
similarity index 97%
rename from packages/less/src/less/tree/mixin-call.js
rename to packages/less/lib/less/tree/mixin-call.js
index 36e6b41ff..3b4219811 100644
--- a/packages/less/src/less/tree/mixin-call.js
+++ b/packages/less/lib/less/tree/mixin-call.js
@@ -1,7 +1,7 @@
-import Node from './node';
-import Selector from './selector';
-import MixinDefinition from './mixin-definition';
-import defaultFunc from '../functions/default';
+import Node from './node.js';
+import Selector from './selector.js';
+import MixinDefinition from './mixin-definition.js';
+import defaultFunc from '../functions/default.js';
const MixinCall = function(elements, args, index, currentFileInfo, important) {
this.selector = new Selector(elements);
diff --git a/packages/less/src/less/tree/mixin-definition.js b/packages/less/lib/less/tree/mixin-definition.js
similarity index 95%
rename from packages/less/src/less/tree/mixin-definition.js
rename to packages/less/lib/less/tree/mixin-definition.js
index eb22c44b0..ff6b393a4 100644
--- a/packages/less/src/less/tree/mixin-definition.js
+++ b/packages/less/lib/less/tree/mixin-definition.js
@@ -1,11 +1,11 @@
-import Selector from './selector';
-import Element from './element';
-import Ruleset from './ruleset';
-import Declaration from './declaration';
-import DetachedRuleset from './detached-ruleset';
-import Expression from './expression';
-import contexts from '../contexts';
-import * as utils from '../utils';
+import Selector from './selector.js';
+import Element from './element.js';
+import Ruleset from './ruleset.js';
+import Declaration from './declaration.js';
+import DetachedRuleset from './detached-ruleset.js';
+import Expression from './expression.js';
+import contexts from '../contexts.js';
+import * as utils from '../utils.js';
const Definition = function(name, params, rules, condition, variadic, frames, visibilityInfo) {
this.name = name || 'anonymous mixin';
diff --git a/packages/less/src/less/tree/namespace-value.js b/packages/less/lib/less/tree/namespace-value.js
similarity index 94%
rename from packages/less/src/less/tree/namespace-value.js
rename to packages/less/lib/less/tree/namespace-value.js
index 6a6fa46f0..0a18fc96c 100644
--- a/packages/less/src/less/tree/namespace-value.js
+++ b/packages/less/lib/less/tree/namespace-value.js
@@ -1,7 +1,7 @@
-import Node from './node';
-import Variable from './variable';
-import Ruleset from './ruleset';
-import Selector from './selector';
+import Node from './node.js';
+import Variable from './variable.js';
+import Ruleset from './ruleset.js';
+import Selector from './selector.js';
const NamespaceValue = function(ruleCall, lookups, index, fileInfo) {
this.value = ruleCall;
diff --git a/packages/less/src/less/tree/negative.js b/packages/less/lib/less/tree/negative.js
similarity index 81%
rename from packages/less/src/less/tree/negative.js
rename to packages/less/lib/less/tree/negative.js
index 7e1bcf1b2..0bedb65fc 100644
--- a/packages/less/src/less/tree/negative.js
+++ b/packages/less/lib/less/tree/negative.js
@@ -1,6 +1,6 @@
-import Node from './node';
-import Operation from './operation';
-import Dimension from './dimension';
+import Node from './node.js';
+import Operation from './operation.js';
+import Dimension from './dimension.js';
const Negative = function(node) {
this.value = node;
diff --git a/packages/less/src/less/tree/nested-at-rule.js b/packages/less/lib/less/tree/nested-at-rule.js
similarity index 94%
rename from packages/less/src/less/tree/nested-at-rule.js
rename to packages/less/lib/less/tree/nested-at-rule.js
index b0cde0876..2358f3cc1 100644
--- a/packages/less/src/less/tree/nested-at-rule.js
+++ b/packages/less/lib/less/tree/nested-at-rule.js
@@ -1,9 +1,9 @@
-import Ruleset from './ruleset';
-import Value from './value';
-import Selector from './selector';
-import Anonymous from './anonymous';
-import Expression from './expression';
-import * as utils from '../utils';
+import Ruleset from './ruleset.js';
+import Value from './value.js';
+import Selector from './selector.js';
+import Anonymous from './anonymous.js';
+import Expression from './expression.js';
+import * as utils from '../utils.js';
const NestableAtRulePrototype = {
diff --git a/packages/less/src/less/tree/node.js b/packages/less/lib/less/tree/node.js
similarity index 100%
rename from packages/less/src/less/tree/node.js
rename to packages/less/lib/less/tree/node.js
diff --git a/packages/less/src/less/tree/operation.js b/packages/less/lib/less/tree/operation.js
similarity index 91%
rename from packages/less/src/less/tree/operation.js
rename to packages/less/lib/less/tree/operation.js
index 2805326be..f220749cb 100644
--- a/packages/less/src/less/tree/operation.js
+++ b/packages/less/lib/less/tree/operation.js
@@ -1,7 +1,7 @@
-import Node from './node';
-import Color from './color';
-import Dimension from './dimension';
-import * as Constants from '../constants';
+import Node from './node.js';
+import Color from './color.js';
+import Dimension from './dimension.js';
+import * as Constants from '../constants.js';
const MATH = Constants.Math;
diff --git a/packages/less/src/less/tree/paren.js b/packages/less/lib/less/tree/paren.js
similarity index 94%
rename from packages/less/src/less/tree/paren.js
rename to packages/less/lib/less/tree/paren.js
index 248bfde6c..a9940e392 100644
--- a/packages/less/src/less/tree/paren.js
+++ b/packages/less/lib/less/tree/paren.js
@@ -1,4 +1,4 @@
-import Node from './node';
+import Node from './node.js';
const Paren = function(node) {
this.value = node;
diff --git a/packages/less/src/less/tree/property.js b/packages/less/lib/less/tree/property.js
similarity index 96%
rename from packages/less/src/less/tree/property.js
rename to packages/less/lib/less/tree/property.js
index d3b34fce7..183ad9bec 100644
--- a/packages/less/src/less/tree/property.js
+++ b/packages/less/lib/less/tree/property.js
@@ -1,5 +1,5 @@
-import Node from './node';
-import Declaration from './declaration';
+import Node from './node.js';
+import Declaration from './declaration.js';
const Property = function(name, index, currentFileInfo) {
this.name = name;
diff --git a/packages/less/src/less/tree/query-in-parens.js b/packages/less/lib/less/tree/query-in-parens.js
similarity index 97%
rename from packages/less/src/less/tree/query-in-parens.js
rename to packages/less/lib/less/tree/query-in-parens.js
index c4ef8c1a0..0135eb743 100644
--- a/packages/less/src/less/tree/query-in-parens.js
+++ b/packages/less/lib/less/tree/query-in-parens.js
@@ -1,4 +1,4 @@
-import Node from './node';
+import Node from './node.js';
const QueryInParens = function (op, l, m, op2, r, i) {
this.op = op.trim();
diff --git a/packages/less/src/less/tree/quoted.js b/packages/less/lib/less/tree/quoted.js
similarity index 95%
rename from packages/less/src/less/tree/quoted.js
rename to packages/less/lib/less/tree/quoted.js
index 811f6001a..e93c547b2 100644
--- a/packages/less/src/less/tree/quoted.js
+++ b/packages/less/lib/less/tree/quoted.js
@@ -1,6 +1,6 @@
-import Node from './node';
-import Variable from './variable';
-import Property from './property';
+import Node from './node.js';
+import Variable from './variable.js';
+import Property from './property.js';
const Quoted = function(str, content, escaped, index, currentFileInfo) {
this.escaped = (escaped === undefined) ? true : escaped;
diff --git a/packages/less/src/less/tree/ruleset.js b/packages/less/lib/less/tree/ruleset.js
similarity index 98%
rename from packages/less/src/less/tree/ruleset.js
rename to packages/less/lib/less/tree/ruleset.js
index 0aa93dddf..0214e8f8f 100644
--- a/packages/less/src/less/tree/ruleset.js
+++ b/packages/less/lib/less/tree/ruleset.js
@@ -1,17 +1,17 @@
-import Node from './node';
-import Declaration from './declaration';
-import Keyword from './keyword';
-import Comment from './comment';
-import Paren from './paren';
-import Selector from './selector';
-import Element from './element';
-import Anonymous from './anonymous';
-import contexts from '../contexts';
-import globalFunctionRegistry from '../functions/function-registry';
-import defaultFunc from '../functions/default';
-import getDebugInfo from './debug-info';
-import * as utils from '../utils';
-import Parser from '../parser/parser';
+import Node from './node.js';
+import Declaration from './declaration.js';
+import Keyword from './keyword.js';
+import Comment from './comment.js';
+import Paren from './paren.js';
+import Selector from './selector.js';
+import Element from './element.js';
+import Anonymous from './anonymous.js';
+import contexts from '../contexts.js';
+import globalFunctionRegistry from '../functions/function-registry.js';
+import defaultFunc from '../functions/default.js';
+import getDebugInfo from './debug-info.js';
+import * as utils from '../utils.js';
+import Parser from '../parser/parser.js';
const Ruleset = function(selectors, rules, strictImports, visibilityInfo) {
this.selectors = selectors;
diff --git a/packages/less/src/less/tree/selector.js b/packages/less/lib/less/tree/selector.js
similarity index 96%
rename from packages/less/src/less/tree/selector.js
rename to packages/less/lib/less/tree/selector.js
index b4acb1c55..a3fe1fc02 100644
--- a/packages/less/src/less/tree/selector.js
+++ b/packages/less/lib/less/tree/selector.js
@@ -1,8 +1,8 @@
-import Node from './node';
-import Element from './element';
-import LessError from '../less-error';
-import * as utils from '../utils';
-import Parser from '../parser/parser';
+import Node from './node.js';
+import Element from './element.js';
+import LessError from '../less-error.js';
+import * as utils from '../utils.js';
+import Parser from '../parser/parser.js';
const Selector = function(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {
this.extendList = extendList;
diff --git a/packages/less/src/less/tree/unicode-descriptor.js b/packages/less/lib/less/tree/unicode-descriptor.js
similarity index 86%
rename from packages/less/src/less/tree/unicode-descriptor.js
rename to packages/less/lib/less/tree/unicode-descriptor.js
index 78a695065..c40e20942 100644
--- a/packages/less/src/less/tree/unicode-descriptor.js
+++ b/packages/less/lib/less/tree/unicode-descriptor.js
@@ -1,4 +1,4 @@
-import Node from './node';
+import Node from './node.js';
const UnicodeDescriptor = function(value) {
this.value = value;
diff --git a/packages/less/src/less/tree/unit.js b/packages/less/lib/less/tree/unit.js
similarity index 96%
rename from packages/less/src/less/tree/unit.js
rename to packages/less/lib/less/tree/unit.js
index 946b098fd..e57aae6c8 100644
--- a/packages/less/src/less/tree/unit.js
+++ b/packages/less/lib/less/tree/unit.js
@@ -1,6 +1,6 @@
-import Node from './node';
-import unitConversions from '../data/unit-conversions';
-import * as utils from '../utils';
+import Node from './node.js';
+import unitConversions from '../data/unit-conversions.js';
+import * as utils from '../utils.js';
const Unit = function(numerator, denominator, backupUnit) {
this.numerator = numerator ? utils.copyArray(numerator).sort() : [];
diff --git a/packages/less/src/less/tree/url.js b/packages/less/lib/less/tree/url.js
similarity index 98%
rename from packages/less/src/less/tree/url.js
rename to packages/less/lib/less/tree/url.js
index 90f73d935..c412b3582 100644
--- a/packages/less/src/less/tree/url.js
+++ b/packages/less/lib/less/tree/url.js
@@ -1,4 +1,4 @@
-import Node from './node';
+import Node from './node.js';
function escapePath(path) {
return path.replace(/[()'"\s]/g, function(match) { return `\\${match}`; });
diff --git a/packages/less/src/less/tree/value.js b/packages/less/lib/less/tree/value.js
similarity index 97%
rename from packages/less/src/less/tree/value.js
rename to packages/less/lib/less/tree/value.js
index b1eb57a89..73573bf5a 100644
--- a/packages/less/src/less/tree/value.js
+++ b/packages/less/lib/less/tree/value.js
@@ -1,4 +1,4 @@
-import Node from './node';
+import Node from './node.js';
const Value = function(value) {
if (!value) {
diff --git a/packages/less/src/less/tree/variable-call.js b/packages/less/lib/less/tree/variable-call.js
similarity index 85%
rename from packages/less/src/less/tree/variable-call.js
rename to packages/less/lib/less/tree/variable-call.js
index 9d1e8b941..0de63aca8 100644
--- a/packages/less/src/less/tree/variable-call.js
+++ b/packages/less/lib/less/tree/variable-call.js
@@ -1,8 +1,8 @@
-import Node from './node';
-import Variable from './variable';
-import Ruleset from './ruleset';
-import DetachedRuleset from './detached-ruleset';
-import LessError from '../less-error';
+import Node from './node.js';
+import Variable from './variable.js';
+import Ruleset from './ruleset.js';
+import DetachedRuleset from './detached-ruleset.js';
+import LessError from '../less-error.js';
const VariableCall = function(variable, index, currentFileInfo) {
this.variable = variable;
diff --git a/packages/less/src/less/tree/variable.js b/packages/less/lib/less/tree/variable.js
similarity index 96%
rename from packages/less/src/less/tree/variable.js
rename to packages/less/lib/less/tree/variable.js
index a81e3ecef..1a04b0d6d 100644
--- a/packages/less/src/less/tree/variable.js
+++ b/packages/less/lib/less/tree/variable.js
@@ -1,5 +1,5 @@
-import Node from './node';
-import Call from './call';
+import Node from './node.js';
+import Call from './call.js';
const Variable = function(name, index, currentFileInfo) {
this.name = name;
diff --git a/packages/less/src/less/utils.js b/packages/less/lib/less/utils.js
similarity index 98%
rename from packages/less/src/less/utils.js
rename to packages/less/lib/less/utils.js
index f78d611a6..b79a3cc66 100644
--- a/packages/less/src/less/utils.js
+++ b/packages/less/lib/less/utils.js
@@ -1,5 +1,5 @@
/* jshint proto: true */
-import * as Constants from './constants';
+import * as Constants from './constants.js';
import { copy } from 'copy-anything';
export function getLocation(index, inputStream) {
diff --git a/packages/less/src/less/visitors/extend-visitor.js b/packages/less/lib/less/visitors/extend-visitor.js
similarity index 99%
rename from packages/less/src/less/visitors/extend-visitor.js
rename to packages/less/lib/less/visitors/extend-visitor.js
index fd70ece77..138bdb356 100644
--- a/packages/less/src/less/visitors/extend-visitor.js
+++ b/packages/less/lib/less/visitors/extend-visitor.js
@@ -2,10 +2,10 @@
/**
* @todo - Remove unused when JSDoc types are added for visitor methods
*/
-import tree from '../tree';
-import Visitor from './visitor';
-import logger from '../logger';
-import * as utils from '../utils';
+import tree from '../tree/index.js';
+import Visitor from './visitor.js';
+import logger from '../logger.js';
+import * as utils from '../utils.js';
/* jshint loopfunc:true */
diff --git a/packages/less/src/less/visitors/import-sequencer.js b/packages/less/lib/less/visitors/import-sequencer.js
similarity index 100%
rename from packages/less/src/less/visitors/import-sequencer.js
rename to packages/less/lib/less/visitors/import-sequencer.js
diff --git a/packages/less/src/less/visitors/import-visitor.js b/packages/less/lib/less/visitors/import-visitor.js
similarity index 97%
rename from packages/less/src/less/visitors/import-visitor.js
rename to packages/less/lib/less/visitors/import-visitor.js
index aaffe0d3e..899d73071 100644
--- a/packages/less/src/less/visitors/import-visitor.js
+++ b/packages/less/lib/less/visitors/import-visitor.js
@@ -2,10 +2,10 @@
/**
* @todo - Remove unused when JSDoc types are added for visitor methods
*/
-import contexts from '../contexts';
-import Visitor from './visitor';
-import ImportSequencer from './import-sequencer';
-import * as utils from '../utils';
+import contexts from '../contexts.js';
+import Visitor from './visitor.js';
+import ImportSequencer from './import-sequencer.js';
+import * as utils from '../utils.js';
const ImportVisitor = function(importer, finish) {
diff --git a/packages/less/lib/less/visitors/index.js b/packages/less/lib/less/visitors/index.js
new file mode 100644
index 000000000..49f2ffd25
--- /dev/null
+++ b/packages/less/lib/less/visitors/index.js
@@ -0,0 +1,15 @@
+import Visitor from './visitor.js';
+import ImportVisitor from './import-visitor.js';
+import MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor.js';
+import ExtendVisitor from './extend-visitor.js';
+import JoinSelectorVisitor from './join-selector-visitor.js';
+import ToCSSVisitor from './to-css-visitor.js';
+
+export default {
+ Visitor,
+ ImportVisitor,
+ MarkVisibleSelectorsVisitor,
+ ExtendVisitor,
+ JoinSelectorVisitor,
+ ToCSSVisitor
+};
diff --git a/packages/less/src/less/visitors/join-selector-visitor.js b/packages/less/lib/less/visitors/join-selector-visitor.js
similarity index 98%
rename from packages/less/src/less/visitors/join-selector-visitor.js
rename to packages/less/lib/less/visitors/join-selector-visitor.js
index b55b292c7..2e421806e 100644
--- a/packages/less/src/less/visitors/join-selector-visitor.js
+++ b/packages/less/lib/less/visitors/join-selector-visitor.js
@@ -2,7 +2,7 @@
/**
* @todo - Remove unused when JSDoc types are added for visitor methods
*/
-import Visitor from './visitor';
+import Visitor from './visitor.js';
class JoinSelectorVisitor {
constructor() {
diff --git a/packages/less/src/less/visitors/set-tree-visibility-visitor.js b/packages/less/lib/less/visitors/set-tree-visibility-visitor.js
similarity index 100%
rename from packages/less/src/less/visitors/set-tree-visibility-visitor.js
rename to packages/less/lib/less/visitors/set-tree-visibility-visitor.js
diff --git a/packages/less/src/less/visitors/to-css-visitor.js b/packages/less/lib/less/visitors/to-css-visitor.js
similarity index 98%
rename from packages/less/src/less/visitors/to-css-visitor.js
rename to packages/less/lib/less/visitors/to-css-visitor.js
index ce1038efb..82eb49c5c 100644
--- a/packages/less/src/less/visitors/to-css-visitor.js
+++ b/packages/less/lib/less/visitors/to-css-visitor.js
@@ -2,9 +2,9 @@
/**
* @todo - Remove unused when JSDoc types are added for visitor methods
*/
-import tree from '../tree';
-import Visitor from './visitor';
-import mergeRules from '../tree/merge-rules';
+import tree from '../tree/index.js';
+import Visitor from './visitor.js';
+import mergeRules from '../tree/merge-rules.js';
class CSSVisitorUtils {
constructor(context) {
diff --git a/packages/less/src/less/visitors/visitor.js b/packages/less/lib/less/visitors/visitor.js
similarity index 99%
rename from packages/less/src/less/visitors/visitor.js
rename to packages/less/lib/less/visitors/visitor.js
index 9db634f4f..4392066e2 100644
--- a/packages/less/src/less/visitors/visitor.js
+++ b/packages/less/lib/less/visitors/visitor.js
@@ -1,4 +1,4 @@
-import tree from '../tree';
+import tree from '../tree/index.js';
const _visitArgs = { visitDeeper: true };
let _hasIndexed = false;
diff --git a/packages/less/package.json b/packages/less/package.json
index ee81c2568..2c07eec68 100644
--- a/packages/less/package.json
+++ b/packages/less/package.json
@@ -22,17 +22,21 @@
"raw": "https://raw.githubusercontent.com/less/less.js/master/"
},
"license": "Apache-2.0",
+ "type": "module",
"bin": {
"lessc": "./bin/lessc"
},
- "main": "index",
- "module": "./lib/less-node/index",
+ "main": "./lib/less-node/index.js",
+ "exports": {
+ ".": "./lib/less-node/index.js",
+ "./lib/*": "./lib/*"
+ },
"directories": {
"test": "./test"
},
"browser": "./dist/less.js",
"engines": {
- "node": ">=14"
+ "node": ">=18"
},
"scripts": {
"quicktest": "grunt quicktest",
@@ -41,10 +45,8 @@
"grunt": "grunt",
"lint": "eslint '**/*.{ts,js}'",
"lint:fix": "eslint '**/*.{ts,js}' --fix",
- "build": "npm-run-all clean compile",
- "clean": "shx rm -rf ./lib tsconfig.tsbuildinfo",
- "compile": "tsc -p tsconfig.build.json",
- "dev": "tsc -p tsconfig.build.json -w",
+ "typecheck": "tsc",
+ "build": "node build/rollup.js --dist",
"prepublishOnly": "grunt dist",
"postinstall": "node scripts/postinstall.js"
},
@@ -77,7 +79,7 @@
"git-rev": "^0.2.1",
"glob": "~11.0.3",
"globby": "^10.0.1",
- "grunt": "^1.0.4",
+ "grunt": "^1.5.0",
"grunt-cli": "^1.3.2",
"grunt-contrib-clean": "^1.0.0",
"grunt-contrib-connect": "^1.0.2",
@@ -101,12 +103,10 @@
"resolve": "^1.17.0",
"rollup": "^2.52.2",
"rollup-plugin-terser": "^5.1.1",
- "rollup-plugin-typescript2": "^0.29.0",
"semver": "^6.3.0",
"shx": "^0.3.2",
"time-grunt": "^1.3.0",
- "ts-node": "^10.9.1",
- "typescript": "^4.3.4",
+ "typescript": "^5.7.0",
"uikit": "2.27.4"
},
"keywords": [
@@ -138,8 +138,7 @@
"sourcearchive": "https://github.com/less/less.js/archive/v",
"dependencies": {
"copy-anything": "^2.0.1",
- "parse-node-version": "^1.0.1",
- "tslib": "^2.3.0"
+ "parse-node-version": "^1.0.1"
},
"gitHead": "1df9072ee9ebdadc791bf35dfb1dbc3ef9f1948f"
}
diff --git a/packages/less/scripts/coverage-lines.js b/packages/less/scripts/coverage-lines.js
index f912e9636..5adcca63d 100644
--- a/packages/less/scripts/coverage-lines.js
+++ b/packages/less/scripts/coverage-lines.js
@@ -6,8 +6,11 @@
* Also outputs JSON file with uncovered lines for programmatic access
*/
-const fs = require('fs');
-const path = require('path');
+import fs from 'fs';
+import path from 'path';
+import { fileURLToPath } from 'url';
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url));
const lcovPath = path.join(__dirname, '..', 'coverage', 'lcov.info');
const jsonOutputPath = path.join(__dirname, '..', 'coverage', 'uncovered-lines.json');
@@ -26,28 +29,28 @@ let currentFile = null;
const lines = lcovContent.split('\n');
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
-
+
// SF: source file
if (line.startsWith('SF:')) {
if (currentFile) {
files.push(currentFile);
}
const filePath = line.substring(3);
- // Only include src/ files (not less-browser) and bin/
+ // Only include lib/ files (not less-browser) and bin/
// Exclude abstract base classes (they're meant to be overridden)
const normalized = filePath.replace(/\\/g, '/');
const abstractClasses = ['abstract-file-manager', 'abstract-plugin-loader'];
const isAbstract = abstractClasses.some(abstract => normalized.includes(abstract));
-
- if (!isAbstract &&
- ((normalized.includes('src/less/') && !normalized.includes('src/less-browser/')) ||
- normalized.includes('src/less-node/') ||
+
+ if (!isAbstract &&
+ ((normalized.includes('lib/less/') && !normalized.includes('lib/less-browser/')) ||
+ normalized.includes('lib/less-node/') ||
normalized.includes('bin/'))) {
- // Extract relative path - match src/less/... or src/less-node/... or bin/...
- // Path format: src/less/tree/debug-info.js or src/less-node/file-manager.js
- // Match from src/ or bin/ to end of path
- const match = normalized.match(/(src\/[^/]+\/.+|bin\/.+)$/);
- const relativePath = match ? match[1] : (normalized.includes('/src/') || normalized.includes('/bin/') ? normalized.split('/').slice(-3).join('/') : path.basename(filePath));
+ // Extract relative path - match lib/less/... or lib/less-node/... or bin/...
+ // Path format: lib/less/tree/debug-info.js or lib/less-node/file-manager.js
+ // Match from lib/ or bin/ to end of path
+ const match = normalized.match(/(lib\/[^/]+\/.+|bin\/.+)$/);
+ const relativePath = match ? match[1] : (normalized.includes('/lib/') || normalized.includes('/bin/') ? normalized.split('/').slice(-3).join('/') : path.basename(filePath));
currentFile = {
path: relativePath,
fullPath: filePath,
@@ -60,7 +63,7 @@ for (let i = 0; i < lines.length; i++) {
currentFile = null;
}
}
-
+
// DA: line data (line number, execution count)
if (currentFile && line.startsWith('DA:')) {
const match = line.match(/^DA:(\d+),(\d+)$/);
@@ -94,7 +97,7 @@ files.forEach(file => {
}
});
} catch (err) {
- // If we can't read the source (e.g., it's in lib/ but we want src/), that's ok
+ // If we can't read the source, that's ok
// We'll just skip the source code
}
}
@@ -114,7 +117,7 @@ if (filesWithGaps.length === 0) {
console.log('\n⚠️ No source files found in coverage data. This may indicate an issue with the coverage report.\n');
} else {
console.log('\n✅ All analyzed files have 100% line coverage!\n');
- console.log(`(Analyzed ${files.length} files from src/less/, src/less-node/, and bin/)\n`);
+ console.log(`(Analyzed ${files.length} files from lib/less/, lib/less-node/, and bin/)\n`);
}
process.exit(0);
}
@@ -124,18 +127,18 @@ console.log('Uncovered Lines Report');
console.log('='.repeat(100) + '\n');
filesWithGaps.forEach(file => {
- const coveragePct = file.totalLines > 0
+ const coveragePct = file.totalLines > 0
? ((file.coveredLines / file.totalLines) * 100).toFixed(1)
: '0.0';
-
+
console.log(`\n${file.path} (${coveragePct}% coverage)`);
console.log('-'.repeat(100));
-
+
// Group consecutive lines into ranges
const ranges = [];
let start = file.uncoveredLines[0];
let end = file.uncoveredLines[0];
-
+
for (let i = 1; i < file.uncoveredLines.length; i++) {
if (file.uncoveredLines[i] === end + 1) {
end = file.uncoveredLines[i];
@@ -146,14 +149,14 @@ filesWithGaps.forEach(file => {
}
}
ranges.push(start === end ? `${start}` : `${start}..${end}`);
-
+
// Display ranges (max 5 per line for readability)
const linesPerRow = 5;
for (let i = 0; i < ranges.length; i += linesPerRow) {
const row = ranges.slice(i, i + linesPerRow);
console.log(` Lines: ${row.join(', ')}`);
}
-
+
console.log(` Total uncovered: ${file.uncoveredLines.length} of ${file.totalLines} lines`);
});
@@ -173,7 +176,7 @@ const jsonOutput = {
}
return file.fullPath;
})(),
- coveragePercent: file.totalLines > 0
+ coveragePercent: file.totalLines > 0
? parseFloat(((file.coveredLines / file.totalLines) * 100).toFixed(1))
: 0,
totalLines: file.totalLines,
@@ -183,10 +186,10 @@ const jsonOutput = {
uncoveredRanges: (() => {
const ranges = [];
if (file.uncoveredLines.length === 0) return ranges;
-
+
let start = file.uncoveredLines[0];
let end = file.uncoveredLines[0];
-
+
for (let i = 1; i < file.uncoveredLines.length; i++) {
if (file.uncoveredLines[i] === end + 1) {
end = file.uncoveredLines[i];
@@ -204,4 +207,3 @@ const jsonOutput = {
fs.writeFileSync(jsonOutputPath, JSON.stringify(jsonOutput, null, 2), 'utf8');
console.log('\n📄 Uncovered lines data written to: coverage/uncovered-lines.json\n');
-
diff --git a/packages/less/scripts/coverage-report.js b/packages/less/scripts/coverage-report.js
index 866937c33..54b27ce43 100644
--- a/packages/less/scripts/coverage-report.js
+++ b/packages/less/scripts/coverage-report.js
@@ -1,11 +1,14 @@
#!/usr/bin/env node
/**
- * Generates a per-file coverage report table for src/ directories
+ * Generates a per-file coverage report table for lib/ directories
*/
-const fs = require('fs');
-const path = require('path');
+import fs from 'fs';
+import path from 'path';
+import { fileURLToPath } from 'url';
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url));
const coverageSummaryPath = path.join(__dirname, '..', 'coverage', 'coverage-summary.json');
@@ -16,8 +19,8 @@ if (!fs.existsSync(coverageSummaryPath)) {
const coverage = JSON.parse(fs.readFileSync(coverageSummaryPath, 'utf8'));
-// Filter to only src/ files (less, less-node) and bin/ files
-// Note: src/less-browser/ is excluded because browser tests aren't included in coverage
+// Filter to only lib/ files (less, less-node) and bin/ files
+// Note: lib/less-browser/ is excluded because browser tests aren't included in coverage
// Abstract base classes are excluded as they're meant to be overridden by implementations
const abstractClasses = [
'abstract-file-manager',
@@ -31,17 +34,17 @@ const srcFiles = Object.entries(coverage)
if (abstractClasses.some(abstract => normalized.includes(abstract))) {
return false;
}
- return (normalized.includes('/src/less/') && !normalized.includes('/src/less-browser/')) ||
- normalized.includes('/src/less-node/') ||
+ return (normalized.includes('/lib/less/') && !normalized.includes('/lib/less-browser/')) ||
+ normalized.includes('/lib/less-node/') ||
normalized.includes('/bin/');
})
.map(([filePath, data]) => {
// Extract relative path from absolute path
const normalized = filePath.replace(/\\/g, '/');
- // Match src/ paths or bin/ paths
- const match = normalized.match(/((?:src\/[^/]+\/[^/]+\/|bin\/).+)$/);
+ // Match lib/ paths or bin/ paths
+ const match = normalized.match(/((?:lib\/[^/]+\/[^/]+\/|bin\/).+)$/);
const relativePath = match ? match[1] : path.basename(filePath);
-
+
return {
path: relativePath,
statements: data.statements,
@@ -58,22 +61,22 @@ const srcFiles = Object.entries(coverage)
});
if (srcFiles.length === 0) {
- console.log('No src/ files found in coverage report.');
+ console.log('No lib/ files found in coverage report.');
process.exit(0);
}
// Group by directory
const grouped = {
- 'src/less/': [],
- 'src/less-node/': [],
+ 'lib/less/': [],
+ 'lib/less-node/': [],
'bin/': []
};
srcFiles.forEach(file => {
- if (file.path.startsWith('src/less/')) {
- grouped['src/less/'].push(file);
- } else if (file.path.startsWith('src/less-node/')) {
- grouped['src/less-node/'].push(file);
+ if (file.path.startsWith('lib/less/')) {
+ grouped['lib/less/'].push(file);
+ } else if (file.path.startsWith('lib/less-node/')) {
+ grouped['lib/less-node/'].push(file);
} else if (file.path.startsWith('bin/')) {
grouped['bin/'].push(file);
}
@@ -81,29 +84,29 @@ srcFiles.forEach(file => {
// Print table
console.log('\n' + '='.repeat(100));
-console.log('Per-File Coverage Report (src/less/, src/less-node/, and bin/)');
+console.log('Per-File Coverage Report (lib/less/, lib/less-node/, and bin/)');
console.log('='.repeat(100));
console.log('For line-by-line coverage details, open coverage/index.html in your browser.');
console.log('='.repeat(100) + '\n');
Object.entries(grouped).forEach(([dir, files]) => {
if (files.length === 0) return;
-
+
console.log(`\n${dir.toUpperCase()}`);
console.log('-'.repeat(100));
console.log(
- 'File'.padEnd(50) +
- 'Statements'.padStart(12) +
- 'Branches'.padStart(12) +
- 'Functions'.padStart(12) +
+ 'File'.padEnd(50) +
+ 'Statements'.padStart(12) +
+ 'Branches'.padStart(12) +
+ 'Functions'.padStart(12) +
'Lines'.padStart(12)
);
console.log('-'.repeat(100));
-
+
files.forEach(file => {
const filename = file.path.replace(dir, '');
const truncated = filename.length > 48 ? '...' + filename.slice(-45) : filename;
-
+
console.log(
truncated.padEnd(50) +
`${file.statements.pct.toFixed(1)}%`.padStart(12) +
@@ -112,7 +115,7 @@ Object.entries(grouped).forEach(([dir, files]) => {
`${file.lines.pct.toFixed(1)}%`.padStart(12)
);
});
-
+
// Summary for this directory
const totals = files.reduce((acc, file) => {
acc.statements.total += file.statements.total;
@@ -130,8 +133,8 @@ Object.entries(grouped).forEach(([dir, files]) => {
functions: { total: 0, covered: 0 },
lines: { total: 0, covered: 0 }
});
-
- const stmtPct = totals.statements.total > 0
+
+ const stmtPct = totals.statements.total > 0
? (totals.statements.covered / totals.statements.total * 100).toFixed(1)
: '0.0';
const branchPct = totals.branches.total > 0
@@ -143,7 +146,7 @@ Object.entries(grouped).forEach(([dir, files]) => {
const linePct = totals.lines.total > 0
? (totals.lines.covered / totals.lines.total * 100).toFixed(1)
: '0.0';
-
+
console.log('-'.repeat(100));
console.log(
'TOTAL'.padEnd(50) +
@@ -155,4 +158,3 @@ Object.entries(grouped).forEach(([dir, files]) => {
});
console.log('\n' + '='.repeat(100) + '\n');
-
diff --git a/packages/less/scripts/postinstall.js b/packages/less/scripts/postinstall.js
index af5ec9b38..028ee55e1 100644
--- a/packages/less/scripts/postinstall.js
+++ b/packages/less/scripts/postinstall.js
@@ -1,61 +1,44 @@
#!/usr/bin/env node
-/**
- * Post-install script for Less.js package
- *
- * This script installs Playwright browsers only when:
- * 1. This is a development environment (not when installed as a dependency)
- * 2. We're in a monorepo context (parent package.json exists)
- * 3. Not running in CI or other automated environments
- */
+import fs from 'fs';
+import path from 'path';
+import { execSync } from 'child_process';
+import { fileURLToPath } from 'url';
-const fs = require('fs');
-const path = require('path');
-const { execSync } = require('child_process');
+const __dirname = path.dirname(fileURLToPath(import.meta.url));
-// Check if we're in a development environment
function isDevelopmentEnvironment() {
- // Skip if this is a global install or user config
if (process.env.npm_config_user_config || process.env.npm_config_global) {
return false;
}
-
- // Skip in CI environments
if (process.env.CI || process.env.GITHUB_ACTIONS || process.env.TRAVIS) {
return false;
}
-
- // Check if we're in a monorepo (parent package.json exists)
const parentPackageJson = path.join(__dirname, '../../../package.json');
if (!fs.existsSync(parentPackageJson)) {
return false;
}
-
- // Check if this is the root of the monorepo
const currentPackageJson = path.join(__dirname, '../package.json');
if (!fs.existsSync(currentPackageJson)) {
return false;
}
-
return true;
}
-// Install Playwright browsers
function installPlaywrightBrowsers() {
try {
- console.log('🎭 Installing Playwright browsers for development...');
- execSync('pnpm exec playwright install', {
+ console.log('Installing Playwright browsers for development...');
+ execSync('pnpm exec playwright install', {
stdio: 'inherit',
cwd: path.join(__dirname, '..')
});
- console.log('✅ Playwright browsers installed successfully');
+ console.log('Playwright browsers installed successfully');
} catch (error) {
- console.warn('⚠️ Failed to install Playwright browsers:', error.message);
- console.warn(' You can install them manually with: pnpm exec playwright install');
+ console.warn('Failed to install Playwright browsers:', error.message);
+ console.warn('You can install them manually with: pnpm exec playwright install');
}
}
-// Main execution
if (isDevelopmentEnvironment()) {
installPlaywrightBrowsers();
}
diff --git a/packages/less/src/less-node/environment.js b/packages/less/src/less-node/environment.js
deleted file mode 100644
index 630a4c2d0..000000000
--- a/packages/less/src/less-node/environment.js
+++ /dev/null
@@ -1,27 +0,0 @@
-class SourceMapGeneratorFallback {
- addMapping(){}
- setSourceContent(){}
- toJSON(){
- return null;
- }
-};
-
-export default {
- encodeBase64: function encodeBase64(str) {
- // Avoid Buffer constructor on newer versions of Node.js.
- const buffer = (Buffer.from ? Buffer.from(str) : (new Buffer(str)));
- return buffer.toString('base64');
- },
- mimeLookup: function (filename) {
- const mimeModule = require('mime');
- return mimeModule ? mimeModule.lookup(filename) : "application/octet-stream";
- },
- charsetLookup: function (mime) {
- const mimeModule = require('mime');
- return mimeModule ? mimeModule.charsets.lookup(mime) : undefined;
- },
- getSourceMapGenerator: function getSourceMapGenerator() {
- const sourceMapModule = require('source-map');
- return sourceMapModule ? sourceMapModule.SourceMapGenerator : SourceMapGeneratorFallback;
- }
-};
diff --git a/packages/less/src/less-node/fs.js b/packages/less/src/less-node/fs.js
deleted file mode 100644
index be71f8f2e..000000000
--- a/packages/less/src/less-node/fs.js
+++ /dev/null
@@ -1,10 +0,0 @@
-let fs;
-try
-{
- fs = require('graceful-fs');
-}
-catch (e)
-{
- fs = require('fs');
-}
-export default fs;
diff --git a/packages/less/src/less-node/index.js b/packages/less/src/less-node/index.js
deleted file mode 100644
index 43cbe7a49..000000000
--- a/packages/less/src/less-node/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import environment from './environment';
-import FileManager from './file-manager';
-import UrlFileManager from './url-file-manager';
-import createFromEnvironment from '../less';
-const less = createFromEnvironment(environment, [new FileManager(), new UrlFileManager()]);
-import lesscHelper from './lessc-helper';
-
-// allow people to create less with their own environment
-less.createFromEnvironment = createFromEnvironment;
-less.lesscHelper = lesscHelper;
-less.PluginLoader = require('./plugin-loader').default;
-less.fs = require('./fs').default;
-less.FileManager = FileManager;
-less.UrlFileManager = UrlFileManager;
-
-// Set up options
-less.options = require('../less/default-options').default();
-
-// provide image-size functionality
-require('./image-size').default(less.environment);
-
-export default less;
diff --git a/packages/less/src/less/data/index.js b/packages/less/src/less/data/index.js
deleted file mode 100644
index 1a7d75bc4..000000000
--- a/packages/less/src/less/data/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import colors from './colors';
-import unitConversions from './unit-conversions';
-
-export default { colors, unitConversions };
diff --git a/packages/less/src/less/tree/index.js b/packages/less/src/less/tree/index.js
deleted file mode 100644
index 1d4fbfdd7..000000000
--- a/packages/less/src/less/tree/index.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import Node from './node';
-import Color from './color';
-import AtRule from './atrule';
-import DetachedRuleset from './detached-ruleset';
-import Operation from './operation';
-import Dimension from './dimension';
-import Unit from './unit';
-import Keyword from './keyword';
-import Variable from './variable';
-import Property from './property';
-import Ruleset from './ruleset';
-import Element from './element';
-import Attribute from './attribute';
-import Combinator from './combinator';
-import Selector from './selector';
-import Quoted from './quoted';
-import Expression from './expression';
-import Declaration from './declaration';
-import Call from './call';
-import URL from './url';
-import Import from './import';
-import Comment from './comment';
-import Anonymous from './anonymous';
-import Value from './value';
-import JavaScript from './javascript';
-import Assignment from './assignment';
-import Condition from './condition';
-import QueryInParens from './query-in-parens';
-import Paren from './paren';
-import Media from './media';
-import Container from './container';
-import UnicodeDescriptor from './unicode-descriptor';
-import Negative from './negative';
-import Extend from './extend';
-import VariableCall from './variable-call';
-import NamespaceValue from './namespace-value';
-
-// mixins
-import MixinCall from './mixin-call';
-import MixinDefinition from './mixin-definition';
-
-export default {
- Node, Color, AtRule, DetachedRuleset, Operation,
- Dimension, Unit, Keyword, Variable, Property,
- Ruleset, Element, Attribute, Combinator, Selector,
- Quoted, Expression, Declaration, Call, URL, Import,
- Comment, Anonymous, Value, JavaScript, Assignment,
- Condition, Paren, Media, Container, QueryInParens,
- UnicodeDescriptor, Negative, Extend, VariableCall,
- NamespaceValue,
- mixin: {
- Call: MixinCall,
- Definition: MixinDefinition
- }
-};
\ No newline at end of file
diff --git a/packages/less/src/less/visitors/index.js b/packages/less/src/less/visitors/index.js
deleted file mode 100644
index 96deb76c4..000000000
--- a/packages/less/src/less/visitors/index.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import Visitor from './visitor';
-import ImportVisitor from './import-visitor';
-import MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';
-import ExtendVisitor from './extend-visitor';
-import JoinSelectorVisitor from './join-selector-visitor';
-import ToCSSVisitor from './to-css-visitor';
-
-export default {
- Visitor,
- ImportVisitor,
- MarkVisibleSelectorsVisitor,
- ExtendVisitor,
- JoinSelectorVisitor,
- ToCSSVisitor
-};
diff --git a/packages/less/test/browser/generator/benchmark.config.js b/packages/less/test/browser/generator/benchmark.config.cjs
similarity index 100%
rename from packages/less/test/browser/generator/benchmark.config.js
rename to packages/less/test/browser/generator/benchmark.config.cjs
diff --git a/packages/less/test/browser/generator/generate.cjs b/packages/less/test/browser/generator/generate.cjs
new file mode 100644
index 000000000..543e724df
--- /dev/null
+++ b/packages/less/test/browser/generator/generate.cjs
@@ -0,0 +1,78 @@
+const template = require('./template.cjs')
+let config
+const fs = require('fs-extra')
+const path = require('path')
+const globby = require('globby')
+const { runner } = require('../../mocha-playwright/runner')
+
+
+if (process.argv[2]) {
+ config = require(`./${process.argv[2]}.config`)
+} else {
+ config = require('./runner.config.cjs')
+}
+
+/**
+ * Generate templates and run tests
+ */
+const tests = []
+const cwd = process.cwd()
+const tmpDir = path.join(cwd, 'tmp', 'browser')
+fs.ensureDirSync(tmpDir)
+fs.copySync(path.join(cwd, 'test', 'browser', 'common.js'), path.join(tmpDir, 'common.js'))
+
+let numTests = 0
+let passedTests = 0
+let failedTests = 0
+
+/** Will run the runners in a series */
+function runSerial(tasks) {
+ var result = Promise.resolve()
+ start = Date.now()
+ tasks.forEach(task => {
+ result = result.then(result => {
+ if (result && result.result && result.result.stats) {
+ const stats = result.result.stats
+ numTests += stats.tests
+ passedTests += stats.passes
+ failedTests += stats.failures
+ }
+ return task()
+ }, err => {
+ console.log(err)
+ failedTests += 1
+ })
+ })
+ return result
+}
+
+Object.entries(config).forEach(entry => {
+ const test = entry[1]
+ const paths = globby.sync(test.src)
+ const templateString = template(paths, test.options.helpers, test.options.specs)
+ fs.writeFileSync(path.join(cwd, test.options.outfile), templateString)
+ tests.push(() => {
+ const file = 'http://localhost:8081/packages/less/' + test.options.outfile
+ console.log(file)
+ return runner({
+ file,
+ timeout: 3500,
+ args: ['disable-web-security', 'no-sandbox', 'disable-setuid-sandbox'],
+ })
+ })
+})
+
+module.exports = () => runSerial(tests).then(() => {
+ if (failedTests > 0) {
+ process.stderr.write(failedTests + ' Failed, ' + passedTests + ' passed\n');
+ } else {
+ process.stdout.write('All Passed ' + passedTests + ' run\n');
+ }
+ if (failedTests) {
+ process.on('exit', function() { process.reallyExit(1); });
+ }
+ process.exit()
+}, err => {
+ process.stderr.write(err.message);
+ process.exit()
+})
diff --git a/packages/less/test/browser/generator/generate.js b/packages/less/test/browser/generator/generate.js
index 893c7e3ac..004c957f7 100644
--- a/packages/less/test/browser/generator/generate.js
+++ b/packages/less/test/browser/generator/generate.js
@@ -1,68 +1,72 @@
-const template = require('./template')
-let config
-const fs = require('fs-extra')
-const path = require('path')
-const globby = require('globby')
-const { runner } = require('../../mocha-playwright/runner')
+import { createRequire } from 'module';
+import fs from 'fs-extra';
+import path from 'path';
+import globby from 'globby';
+import { runner } from '../../mocha-playwright/runner.js';
+const require = createRequire(import.meta.url);
+
+let config;
+let template;
if (process.argv[2]) {
- config = require(`./${process.argv[2]}.config`)
+ config = require(`./${process.argv[2]}.config.cjs`);
} else {
- config = require('./runner.config')
+ config = require('./runner.config.cjs');
}
+template = require('./template.cjs');
/**
* Generate templates and run tests
*/
-const tests = []
-const cwd = process.cwd()
-const tmpDir = path.join(cwd, 'tmp', 'browser')
-fs.ensureDirSync(tmpDir)
-fs.copySync(path.join(cwd, 'test', 'browser', 'common.js'), path.join(tmpDir, 'common.js'))
+const tests = [];
+const cwd = process.cwd();
+const tmpDir = path.join(cwd, 'tmp', 'browser');
+fs.ensureDirSync(tmpDir);
+fs.copySync(path.join(cwd, 'test', 'browser', 'common.js'), path.join(tmpDir, 'common.js'));
-let numTests = 0
-let passedTests = 0
-let failedTests = 0
+let numTests = 0;
+let passedTests = 0;
+let failedTests = 0;
/** Will run the runners in a series */
function runSerial(tasks) {
- var result = Promise.resolve()
- start = Date.now()
+ var result = Promise.resolve();
+ var start = Date.now();
tasks.forEach(task => {
result = result.then(result => {
if (result && result.result && result.result.stats) {
- const stats = result.result.stats
- numTests += stats.tests
- passedTests += stats.passes
- failedTests += stats.failures
+ const stats = result.result.stats;
+ numTests += stats.tests;
+ passedTests += stats.passes;
+ failedTests += stats.failures;
}
- return task()
+ return task();
}, err => {
- console.log(err)
- failedTests += 1
- })
- })
- return result
+ console.log(err);
+ failedTests += 1;
+ });
+ });
+ return result;
}
Object.entries(config).forEach(entry => {
- const test = entry[1]
- const paths = globby.sync(test.src)
- const templateString = template(paths, test.options.helpers, test.options.specs)
- fs.writeFileSync(path.join(cwd, test.options.outfile), templateString)
+ const test = entry[1];
+ const paths = globby.sync(test.src);
+ const templateString = template(paths, test.options.helpers, test.options.specs);
+ fs.writeFileSync(path.join(cwd, test.options.outfile), templateString);
tests.push(() => {
- const file = 'http://localhost:8081/packages/less/' + test.options.outfile
- console.log(file)
+ const file = 'http://localhost:8081/packages/less/' + test.options.outfile;
+ console.log(file);
return runner({
file,
timeout: 3500,
args: ['disable-web-security', 'no-sandbox', 'disable-setuid-sandbox'],
- })
- })
-})
+ });
+ });
+});
-module.exports = () => runSerial(tests).then(() => {
+export default () => runSerial(tests).then(() => {
if (failedTests > 0) {
process.stderr.write(failedTests + ' Failed, ' + passedTests + ' passed\n');
} else {
@@ -71,8 +75,8 @@ module.exports = () => runSerial(tests).then(() => {
if (failedTests) {
process.on('exit', function() { process.reallyExit(1); });
}
- process.exit()
+ process.exit();
}, err => {
process.stderr.write(err.message);
- process.exit()
-})
+ process.exit();
+});
diff --git a/packages/less/test/browser/generator/runner.cjs b/packages/less/test/browser/generator/runner.cjs
new file mode 100644
index 000000000..4a4b877bb
--- /dev/null
+++ b/packages/less/test/browser/generator/runner.cjs
@@ -0,0 +1,2 @@
+const runner = require('./generate.cjs')
+runner()
\ No newline at end of file
diff --git a/packages/less/test/browser/generator/runner.config.js b/packages/less/test/browser/generator/runner.config.cjs
similarity index 96%
rename from packages/less/test/browser/generator/runner.config.js
rename to packages/less/test/browser/generator/runner.config.cjs
index b1b68b369..996a384cd 100644
--- a/packages/less/test/browser/generator/runner.config.js
+++ b/packages/less/test/browser/generator/runner.config.cjs
@@ -1,6 +1,6 @@
var path = require('path');
var resolve = require('resolve')
-var { forceCovertToBrowserPath } = require('./utils');
+var { forceCovertToBrowserPath } = require('./utils.cjs');
/** Root of repo */
var testFolder = forceCovertToBrowserPath(path.dirname(resolve.sync('@less/test-data')));
@@ -140,7 +140,7 @@ module.exports = {
src: [`${testsConfigFolder}/postProcessorPlugin/*.less`],
options: {
helpers: [
- 'test/plugins/postprocess/index.js',
+ 'test/plugins/postprocess/index.cjs',
'test/browser/runner-postProcessorPlugin-options.js'
],
specs: 'test/browser/runner-postProcessorPlugin.js',
@@ -152,7 +152,7 @@ module.exports = {
src: [`${testsConfigFolder}/preProcessorPlugin/*.less`],
options: {
helpers: [
- 'test/plugins/preprocess/index.js',
+ 'test/plugins/preprocess/index.cjs',
'test/browser/runner-preProcessorPlugin-options.js'
],
specs: 'test/browser/runner-preProcessorPlugin.js',
@@ -163,7 +163,7 @@ module.exports = {
src: [`${testsConfigFolder}/visitorPlugin/*.less`],
options: {
helpers: [
- 'test/plugins/visitor/index.js',
+ 'test/plugins/visitor/index.cjs',
'test/browser/runner-VisitorPlugin-options.js'
],
specs: 'test/browser/runner-VisitorPlugin.js',
@@ -174,7 +174,7 @@ module.exports = {
src: [`${testsConfigFolder}/filemanagerPlugin/*.less`],
options: {
helpers: [
- 'test/plugins/filemanager/index.js',
+ 'test/plugins/filemanager/index.cjs',
'test/browser/runner-filemanagerPlugin-options.js'
],
specs: 'test/browser/runner-filemanagerPlugin.js',
diff --git a/packages/less/test/browser/generator/runner.js b/packages/less/test/browser/generator/runner.js
index 25c846036..9f82233e1 100644
--- a/packages/less/test/browser/generator/runner.js
+++ b/packages/less/test/browser/generator/runner.js
@@ -1,2 +1,2 @@
-const runner = require('./generate')
-runner()
\ No newline at end of file
+import generate from './generate.js';
+generate();
diff --git a/packages/less/test/browser/generator/template.js b/packages/less/test/browser/generator/template.cjs
similarity index 98%
rename from packages/less/test/browser/generator/template.js
rename to packages/less/test/browser/generator/template.cjs
index a8bb9e0ab..a4c0097e5 100644
--- a/packages/less/test/browser/generator/template.js
+++ b/packages/less/test/browser/generator/template.cjs
@@ -1,6 +1,6 @@
const html = require('html-template-tag')
const path = require('path')
-const { forceCovertToBrowserPath } = require('./utils')
+const { forceCovertToBrowserPath } = require('./utils.cjs')
const webRoot = path.resolve(__dirname, '../../../../../');
const mochaDir = forceCovertToBrowserPath(path.relative(webRoot, path.dirname(require.resolve('mocha'))))
diff --git a/packages/less/test/browser/generator/utils.js b/packages/less/test/browser/generator/utils.cjs
similarity index 100%
rename from packages/less/test/browser/generator/utils.js
rename to packages/less/test/browser/generator/utils.cjs
diff --git a/packages/less/test/index.js b/packages/less/test/index.js
index d1e9ef8f9..b4fd85fa7 100644
--- a/packages/less/test/index.js
+++ b/packages/less/test/index.js
@@ -1,11 +1,21 @@
-// Mock needle for HTTP requests BEFORE any other requires
-const Module = require('module');
+import { createRequire } from 'module';
+import Module from 'module';
+import path from 'path';
+import fs from 'fs';
+import { fileURLToPath } from 'url';
+import less from '../lib/less-node/index.js';
+import { stylize } from '../lib/less-node/lessc-helper.js';
+import createLessTester from './less-test.js';
+
+const require = createRequire(import.meta.url);
+const __dirname = path.dirname(fileURLToPath(import.meta.url));
+
+// Mock needle for HTTP requests
const originalRequire = Module.prototype.require;
Module.prototype.require = function(id) {
if (id === 'needle') {
return {
get: function(url, options, callback) {
-
// Handle CDN requests
if (url.includes('cdn.jsdelivr.net')) {
if (url.includes('selectors.less')) {
@@ -27,23 +37,22 @@ Module.prototype.require = function(id) {
return;
}
}
-
- // Handle redirect test - simulate needle's automatic redirect handling
+
+ // Handle redirect test
if (url.includes('example.com/redirect.less')) {
setTimeout(() => {
- // Simulate the final response after needle automatically follows the redirect
callback(null, { statusCode: 200 }, 'h1 { color: blue; }');
}, 10);
return;
}
-
+
if (url.includes('example.com/target.less')) {
setTimeout(() => {
callback(null, { statusCode: 200 }, 'h1 { color: blue; }');
}, 10);
return;
}
-
+
// Default error for unmocked URLs
setTimeout(() => {
callback(new Error('Unmocked URL: ' + url), null, null);
@@ -54,27 +63,17 @@ Module.prototype.require = function(id) {
return originalRequire.apply(this, arguments);
};
-// Now load other modules after mocking is set up
-var path = require('path'),
- fs = require('fs'),
- lessTest = require('./less-test'),
- stylize = require('../lib/less-node/lessc-helper').stylize;
-
// Parse command line arguments for test filtering
var args = process.argv.slice(2);
var testFilter = args.length > 0 ? args[0] : null;
// Create the test runner with the filter
-var lessTester = lessTest(testFilter);
-
-// HTTP mocking is now handled by needle mocking above
+var lessTester = createLessTester(testFilter);
// Test HTTP redirect functionality
function testHttpRedirects() {
- const less = require('../lib/less-node').default;
-
- console.log('🧪 Testing HTTP redirect functionality...');
-
+ console.log('Testing HTTP redirect functionality...');
+
const redirectTest = `
@import "https://example.com/redirect.less";
@@ -84,19 +83,18 @@ h1 { color: red; }
return less.render(redirectTest, {
filename: 'test-redirect.less'
}).then(result => {
- console.log('✅ HTTP redirect test SUCCESS:');
+ console.log('HTTP redirect test SUCCESS:');
console.log(result.css);
-
- // Check if both imported and local content are present
+
if (result.css.includes('color: blue') && result.css.includes('color: red')) {
- console.log('🎉 HTTP redirect test PASSED - both imported and local content found');
+ console.log('HTTP redirect test PASSED - both imported and local content found');
return true;
} else {
- console.log('❌ HTTP redirect test FAILED - missing expected content');
+ console.log('HTTP redirect test FAILED - missing expected content');
return false;
}
}).catch(err => {
- console.log('❌ HTTP redirect test ERROR:');
+ console.log('HTTP redirect test ERROR:');
console.log(err.message);
return false;
});
@@ -104,34 +102,30 @@ h1 { color: red; }
// Test import-remote functionality
function testImportRemote() {
- const less = require('../lib/less-node').default;
- const fs = require('fs');
- const path = require('path');
-
- console.log('🧪 Testing import-remote functionality...');
-
+ console.log('Testing import-remote functionality...');
+
const testFile = path.join(__dirname, '../../test-data/tests-unit/import/import-remote.less');
const expectedFile = path.join(__dirname, '../../test-data/tests-unit/import/import-remote.css');
-
+
const content = fs.readFileSync(testFile, 'utf8');
const expected = fs.readFileSync(expectedFile, 'utf8');
-
+
return less.render(content, {
filename: testFile
}).then(result => {
- console.log('✅ Import-remote test SUCCESS:');
+ console.log('Import-remote test SUCCESS:');
console.log('Expected:', expected.trim());
console.log('Actual:', result.css.trim());
-
+
if (result.css.trim() === expected.trim()) {
- console.log('🎉 Import-remote test PASSED - CDN imports and variable resolution working');
+ console.log('Import-remote test PASSED - CDN imports and variable resolution working');
return true;
} else {
- console.log('❌ Import-remote test FAILED - output mismatch');
+ console.log('Import-remote test FAILED - output mismatch');
return false;
}
}).catch(err => {
- console.log('❌ Import-remote test ERROR:');
+ console.log('Import-remote test ERROR:');
console.log(err.message);
return false;
});
@@ -143,52 +137,27 @@ if (testFilter) {
console.log('Running tests matching: ' + testFilter + '\n');
}
-// Glob patterns for main test runs (excluding problematic tests that will run separately)
var globPatterns = [
'tests-config/*/*.less',
'tests-unit/*/*.less',
- // Debug tests have nested subdirectories (comments/, mediaquery/, all/)
'tests-config/debug/*/linenumbers-*.less',
- '!tests-config/sourcemaps/**/*.less', // Exclude sourcemaps (need special handling)
- '!tests-config/sourcemaps-empty/*', // Exclude sourcemaps-empty (need special handling)
- '!tests-config/sourcemaps-disable-annotation/*', // Exclude sourcemaps-disable-annotation (need special handling)
- '!tests-config/sourcemaps-variable-selector/*', // Exclude sourcemaps-variable-selector (need special handling)
- '!tests-config/globalVars/*', // Exclude globalVars (need JSON config handling)
- '!tests-config/modifyVars/*', // Exclude modifyVars (need JSON config handling)
- '!tests-config/js-type-errors/*', // Exclude js-type-errors (need special test function)
- '!tests-config/no-js-errors/*', // Exclude no-js-errors (need special test function)
- '!tests-unit/import/import-remote.less', // Exclude import-remote (tested separately in isolation)
-
- // HTTP import tests are now included since we have needle mocking
+ '!tests-config/sourcemaps/**/*.less',
+ '!tests-config/sourcemaps-empty/*',
+ '!tests-config/sourcemaps-disable-annotation/*',
+ '!tests-config/sourcemaps-variable-selector/*',
+ '!tests-config/globalVars/*',
+ '!tests-config/modifyVars/*',
+ '!tests-config/js-type-errors/*',
+ '!tests-config/no-js-errors/*',
+ '!tests-unit/import/import-remote.less',
];
var testMap = [
- // Main test runs using glob patterns (cosmiconfig handles configs)
- {
- patterns: globPatterns
- },
-
- // Error tests
- {
- patterns: ['tests-error/eval/*.less'],
- verifyFunction: lessTester.testErrors
- },
- {
- patterns: ['tests-error/parse/*.less'],
- verifyFunction: lessTester.testErrors
- },
-
- // Special test cases with specific handling
- {
- patterns: ['tests-config/js-type-errors/*.less'],
- verifyFunction: lessTester.testTypeErrors
- },
- {
- patterns: ['tests-config/no-js-errors/*.less'],
- verifyFunction: lessTester.testErrors
- },
-
- // Sourcemap tests with special handling
+ { patterns: globPatterns },
+ { patterns: ['tests-error/eval/*.less'], verifyFunction: lessTester.testErrors },
+ { patterns: ['tests-error/parse/*.less'], verifyFunction: lessTester.testErrors },
+ { patterns: ['tests-config/js-type-errors/*.less'], verifyFunction: lessTester.testTypeErrors },
+ { patterns: ['tests-config/no-js-errors/*.less'], verifyFunction: lessTester.testErrors },
{
patterns: [
'tests-config/sourcemaps/**/*.less',
@@ -202,35 +171,17 @@ var testMap = [
if (type === 'vars') {
return path.join(baseFolder, filename) + '.json';
}
- // Extract just the filename (without directory) for the JSON file
var jsonFilename = path.basename(filename);
- // For sourcemap type, return path relative to test directory
- if (type === 'sourcemap') {
- return path.join('test/sourcemaps', jsonFilename) + '.json';
- }
return path.join('test/sourcemaps', jsonFilename) + '.json';
}
},
- {
- patterns: ['tests-config/sourcemaps-empty/*.less'],
- verifyFunction: lessTester.testEmptySourcemap
- },
- {
- patterns: ['tests-config/sourcemaps-disable-annotation/*.less'],
- verifyFunction: lessTester.testSourcemapWithoutUrlAnnotation
- },
- {
- patterns: ['tests-config/sourcemaps-variable-selector/*.less'],
- verifyFunction: lessTester.testSourcemapWithVariableInSelector
- },
-
- // Import tests with JSON configs
+ { patterns: ['tests-config/sourcemaps-empty/*.less'], verifyFunction: lessTester.testEmptySourcemap },
+ { patterns: ['tests-config/sourcemaps-disable-annotation/*.less'], verifyFunction: lessTester.testSourcemapWithoutUrlAnnotation },
+ { patterns: ['tests-config/sourcemaps-variable-selector/*.less'], verifyFunction: lessTester.testSourcemapWithVariableInSelector },
{
patterns: ['tests-config/globalVars/*.less'],
lessOptions: {
globalVars: function(file) {
- const fs = require('fs');
- const path = require('path');
const basename = path.basename(file, '.less');
const jsonPath = path.join(path.dirname(file), basename + '.json');
try {
@@ -245,8 +196,6 @@ var testMap = [
patterns: ['tests-config/modifyVars/*.less'],
lessOptions: {
modifyVars: function(file) {
- const fs = require('fs');
- const path = require('path');
const basename = path.basename(file, '.less');
const jsonPath = path.join(path.dirname(file), basename + '.json');
try {
@@ -259,34 +208,28 @@ var testMap = [
}
];
-// Note: needle mocking is set up globally at the top of the file
-
testMap.forEach(function(testConfig) {
- // For glob patterns, pass lessOptions as the first parameter and patterns as the second
if (testConfig.patterns) {
lessTester.runTestSet(
- testConfig.lessOptions || {}, // First param: options (including lessOptions)
- testConfig.patterns, // Second param: patterns
- testConfig.verifyFunction || null, // Third param: verifyFunction
- testConfig.nameModifier || null, // Fourth param: nameModifier
- testConfig.doReplacements || null, // Fifth param: doReplacements
- testConfig.getFilename || null // Sixth param: getFilename
+ testConfig.lessOptions || {},
+ testConfig.patterns,
+ testConfig.verifyFunction || null,
+ testConfig.nameModifier || null,
+ testConfig.doReplacements || null,
+ testConfig.getFilename || null
);
} else {
- // Legacy format for non-glob tests
- var args = [
- testConfig.options || {}, // First param: options
- testConfig.foldername, // Second param: foldername
- testConfig.verifyFunction || null, // Third param: verifyFunction
- testConfig.nameModifier || null, // Fourth param: nameModifier
- testConfig.doReplacements || null, // Fifth param: doReplacements
- testConfig.getFilename || null // Sixth param: getFilename
- ];
- lessTester.runTestSet.apply(lessTester, args);
+ lessTester.runTestSet.apply(lessTester, [
+ testConfig.options || {},
+ testConfig.foldername,
+ testConfig.verifyFunction || null,
+ testConfig.nameModifier || null,
+ testConfig.doReplacements || null,
+ testConfig.getFilename || null
+ ]);
}
});
-// Special synchronous tests
lessTester.testSyncronous({syncImport: true}, 'tests-unit/import/import');
lessTester.testSyncronous({syncImport: true}, 'tests-config/math-strict/css');
@@ -295,13 +238,10 @@ lessTester.testDisablePluginRule();
lessTester.testJSImport();
lessTester.finished();
-
-// Test HTTP redirect functionality
console.log('\nTesting HTTP redirect functionality...');
testHttpRedirects();
console.log('HTTP redirect test completed');
-// Test import-remote functionality in isolation
console.log('\nTesting import-remote functionality...');
testImportRemote();
console.log('Import-remote test completed');
diff --git a/packages/less/test/less-test.js b/packages/less/test/less-test.js
index ca4c5a35b..1f2bff1b1 100644
--- a/packages/less/test/less-test.js
+++ b/packages/less/test/less-test.js
@@ -1,8 +1,16 @@
/* jshint latedef: nofunc */
-var semver = require('semver');
-var logger = require('../lib/less/logger').default;
-var { cosmiconfigSync } = require('cosmiconfig');
-var glob = require('glob');
+import { createRequire } from 'module';
+import path from 'path';
+import fs from 'fs';
+import semver from 'semver';
+import logger from '../lib/less/logger.js';
+import { cosmiconfigSync } from 'cosmiconfig';
+import { globSync } from 'glob';
+import { copy as clone } from 'copy-anything';
+import less from '../lib/less-node/index.js';
+import { stylize } from '../lib/less-node/lessc-helper.js';
+
+const require = createRequire(import.meta.url);
var isVerbose = process.env.npm_config_loglevel !== 'concise';
logger.addListener({
@@ -20,50 +28,30 @@ logger.addListener({
});
-module.exports = function(testFilter) {
- var path = require('path'),
- fs = require('fs'),
- clone = require('copy-anything').copy;
-
- var less = require('../');
-
- var stylize = require('../lib/less-node/lessc-helper').stylize;
-
+export default function(testFilter) {
var globals = Object.keys(global);
var oneTestOnly = testFilter || process.argv[2],
isFinished = false;
- var testFolder = path.dirname(require.resolve('@less/test-data'));
+ var testFolder = path.relative(process.cwd(), path.dirname(require.resolve('@less/test-data')));
var lessFolder = testFolder;
- // Define String.prototype.endsWith if it doesn't exist (in older versions of node)
- // This is required by the testSourceMap function below
- if (typeof String.prototype.endsWith !== 'function') {
- String.prototype.endsWith = function (str) {
- return this.slice(-str.length) === str;
- }
- }
-
var queueList = [],
queueRunning = false;
function queue(func) {
if (queueRunning) {
- // console.log("adding to queue");
queueList.push(func);
} else {
- // console.log("first in queue - starting");
queueRunning = true;
func();
}
}
function release() {
if (queueList.length) {
- // console.log("running next in queue");
var func = queueList.shift();
setTimeout(func, 0);
} else {
- // console.log("stopping queue");
queueRunning = false;
}
}
@@ -86,84 +74,67 @@ module.exports = function(testFilter) {
});
function validateSourcemapMappings(sourcemap, lessFile, compiledCSS) {
- // Validate sourcemap mappings using SourceMapConsumer
var SourceMapConsumer = require('source-map').SourceMapConsumer;
- // sourcemap can be either a string or already parsed object
var sourceMapObj = typeof sourcemap === 'string' ? JSON.parse(sourcemap) : sourcemap;
var consumer = new SourceMapConsumer(sourceMapObj);
-
- // Read the LESS source file
+
var lessSource = fs.readFileSync(lessFile, 'utf8');
var lessLines = lessSource.split('\n');
-
- // Use the compiled CSS (remove sourcemap annotation for validation)
+
var cssSource = compiledCSS.replace(/\/\*# sourceMappingURL=.*\*\/\s*$/, '').trim();
var cssLines = cssSource.split('\n');
-
+
var errors = [];
var validatedMappings = 0;
-
- // Validate mappings for each line in the CSS
+
for (var cssLine = 1; cssLine <= cssLines.length; cssLine++) {
var cssLineContent = cssLines[cssLine - 1];
- // Skip empty lines
if (!cssLineContent.trim()) {
continue;
}
-
- // Check mapping for the start of this CSS line
+
var mapping = consumer.originalPositionFor({
line: cssLine,
column: 0
});
-
+
if (mapping.source) {
validatedMappings++;
-
- // Verify the source file exists in the sourcemap
+
if (!sourceMapObj.sources || sourceMapObj.sources.indexOf(mapping.source) === -1) {
errors.push('Line ' + cssLine + ': mapped to source "' + mapping.source + '" which is not in sources array');
}
-
- // Verify the line number is valid
+
if (mapping.line && mapping.line > 0) {
- // If we can find the source file, validate the line exists
var sourceIndex = sourceMapObj.sources.indexOf(mapping.source);
if (sourceIndex >= 0 && sourceMapObj.sourcesContent && sourceMapObj.sourcesContent[sourceIndex] !== undefined && sourceMapObj.sourcesContent[sourceIndex] !== null) {
var sourceContent = sourceMapObj.sourcesContent[sourceIndex];
- // Ensure sourceContent is a string (it should be, but be defensive)
if (typeof sourceContent !== 'string') {
sourceContent = String(sourceContent);
}
- // Split by newline - handle both \n and \r\n
var sourceLines = sourceContent.split(/\r?\n/);
if (mapping.line > sourceLines.length) {
errors.push('Line ' + cssLine + ': mapped to line ' + mapping.line + ' in "' + mapping.source + '" but source only has ' + sourceLines.length + ' lines');
}
- } else if (sourceIndex >= 0) {
- // Source content not embedded, try to validate against the actual file if it matches
- // This is a best-effort validation
}
}
}
}
-
- // Validate that all sources in the sourcemap are valid
+
if (sourceMapObj.sources) {
sourceMapObj.sources.forEach(function(source, index) {
if (sourceMapObj.sourcesContent && sourceMapObj.sourcesContent[index]) {
- // Source content is embedded, validate it's not empty
if (!sourceMapObj.sourcesContent[index].trim()) {
errors.push('Source "' + source + '" has empty content');
}
}
});
}
-
+
if (consumer.destroy && typeof consumer.destroy === 'function') {
consumer.destroy();
}
-
+
return {
valid: errors.length === 0,
errors: errors,
@@ -171,13 +142,11 @@ module.exports = function(testFilter) {
};
}
- function testSourcemap(name, err, compiledLess, doReplacements, sourcemap, baseFolder, getFilename) {
+ function testSourcemap(name, err, compiledLess, doReplacements, sourcemap, baseFolder, imports, getFilename) {
if (err) {
fail('ERROR: ' + (err && err.message));
return;
}
- // Check the sourceMappingURL at the bottom of the file
- // Default expected URL is name + '.css.map', but can be overridden by sourceMapURL option
var sourceMappingPrefix = '/*# sourceMappingURL=',
sourceMappingSuffix = ' */';
var indexOfSourceMappingPrefix = compiledLess.indexOf(sourceMappingPrefix);
@@ -185,24 +154,20 @@ module.exports = function(testFilter) {
fail('ERROR: sourceMappingURL was not found in ' + baseFolder + '/' + name + '.css.');
return;
}
-
+
var startOfSourceMappingValue = indexOfSourceMappingPrefix + sourceMappingPrefix.length,
indexOfSuffix = compiledLess.indexOf(sourceMappingSuffix, startOfSourceMappingValue),
actualSourceMapURL = compiledLess.substring(startOfSourceMappingValue, indexOfSuffix === -1 ? compiledLess.length : indexOfSuffix).trim();
-
- // For tests with custom sourceMapURL, we just verify it exists and is non-empty
- // The actual value will be validated by comparing the sourcemap JSON
+
if (!actualSourceMapURL) {
fail('ERROR: sourceMappingURL is empty in ' + baseFolder + '/' + name + '.css.');
return;
}
- // Use getFilename if available (for sourcemap tests with subdirectories)
var jsonPath;
if (getFilename && typeof getFilename === 'function') {
jsonPath = getFilename(name, 'sourcemap', baseFolder);
} else {
- // Fallback: extract just the filename for sourcemap JSON files
var jsonFilename = path.basename(name);
jsonPath = path.join('test/sourcemaps', jsonFilename) + '.json';
}
@@ -212,30 +177,18 @@ module.exports = function(testFilter) {
fail('ERROR: Could not read expected sourcemap file: ' + jsonPath + ' - ' + e.message);
return;
}
-
- // Apply doReplacements to the expected sourcemap to handle {path} placeholders
- // This normalizes absolute paths that differ between environments
- // For sourcemaps, we need to ensure {path} uses forward slashes to avoid breaking JSON
- // (backslashes in JSON strings need escaping, and sourcemaps should use forward slashes anyway)
+
var replacementPath = path.join(path.dirname(path.join(baseFolder, name) + '.less'), '/');
- // Normalize to forward slashes for sourcemap JSON (web-compatible)
replacementPath = replacementPath.replace(/\\/g, '/');
- // Replace {path} with normalized forward-slash path BEFORE calling doReplacements
- // This ensures the JSON is always valid and uses web-compatible paths
expectedSourcemap = expectedSourcemap.replace(/\{path\}/g, replacementPath);
- // Also handle other placeholders that might be in the sourcemap (but {path} is already done)
expectedSourcemap = doReplacements(expectedSourcemap, baseFolder, path.join(baseFolder, name) + '.less');
-
- // Normalize paths in sourcemap JSON to use forward slashes (web-compatible)
- // We need to parse the JSON, normalize the file property, then stringify for comparison
- // This avoids breaking escape sequences like \n in the JSON string
+
function normalizeSourcemapPaths(sm) {
try {
var parsed = typeof sm === 'string' ? JSON.parse(sm) : sm;
if (parsed.file) {
parsed.file = parsed.file.replace(/\\/g, '/');
}
- // Also normalize paths in sources array
if (parsed.sources && Array.isArray(parsed.sources)) {
parsed.sources = parsed.sources.map(function(src) {
return src.replace(/\\/g, '/');
@@ -243,27 +196,21 @@ module.exports = function(testFilter) {
}
return JSON.stringify(parsed, null, 0);
} catch (parseErr) {
- // If parsing fails, return original (shouldn't happen)
return sm;
}
}
-
+
var normalizedSourcemap = normalizeSourcemapPaths(sourcemap);
var normalizedExpected = normalizeSourcemapPaths(expectedSourcemap);
-
+
if (normalizedSourcemap === normalizedExpected) {
- // Validate the sourcemap mappings are correct
- // Find the actual LESS file - it might be in a subdirectory
var nameParts = name.split('/');
var lessFileName = nameParts[nameParts.length - 1];
var lessFileDir = nameParts.length > 1 ? nameParts.slice(0, -1).join('/') : '';
var lessFile = path.join(lessFolder, lessFileDir, lessFileName) + '.less';
-
- // Only validate if the LESS file exists
+
if (fs.existsSync(lessFile)) {
try {
- // Parse the sourcemap once for validation (avoid re-parsing)
- // Use the original sourcemap string, not the normalized one
var sourceMapObjForValidation = typeof sourcemap === 'string' ? JSON.parse(sourcemap) : sourcemap;
var validation = validateSourcemapMappings(sourceMapObjForValidation, lessFile, compiledLess);
if (!validation.valid) {
@@ -277,10 +224,9 @@ module.exports = function(testFilter) {
if (isVerbose) {
process.stdout.write(' (validation error: ' + validationErr.message + ')');
}
- // Don't fail the test if validation has an error, just log it
}
}
-
+
ok('OK');
} else if (err) {
fail('ERROR: ' + (err && err.message));
@@ -299,14 +245,12 @@ module.exports = function(testFilter) {
fail('ERROR: ' + (err && err.message));
return;
}
- // This matches with strings that end($) with source mapping url annotation.
var sourceMapRegExp = /\/\*# sourceMappingURL=.+\.css\.map \*\/$/;
if (sourceMapRegExp.test(compiledLess)) {
fail('ERROR: sourceMappingURL found in ' + baseFolder + '/' + name + '.css.');
return;
}
- // Even if annotation is not necessary, the map file should be there.
fs.readFile(path.join('test/', name) + '.json', 'utf8', function (e, expectedSourcemap) {
process.stdout.write('- ' + path.join(baseFolder, name) + ': ');
if (sourcemap === expectedSourcemap) {
@@ -331,7 +275,6 @@ module.exports = function(testFilter) {
var expectedSourcemap = undefined;
if ( compiledLess !== '' ) {
difference('\nCompiledLess must be empty', '', compiledLess);
-
} else if (sourcemap !== expectedSourcemap) {
fail('Sourcemap must be undefined');
} else {
@@ -346,7 +289,6 @@ module.exports = function(testFilter) {
return;
}
- // Even if annotation is not necessary, the map file should be there.
fs.readFile(path.join('test/', name) + '.json', 'utf8', function (e, expectedSourcemap) {
process.stdout.write('- ' + path.join(baseFolder, name) + ': ');
if (sourcemap === expectedSourcemap) {
@@ -373,7 +315,6 @@ module.exports = function(testFilter) {
return JSON.stringify(imports, null, ' ')
}
- /** Imports are not sorted */
const importsString = stringify(imports.sort())
fs.readFile(path.join(lessFolder, name) + '.json', 'utf8', function (e, expectedImports) {
@@ -420,9 +361,6 @@ module.exports = function(testFilter) {
});
}
- // To fix ci fail about error format change in upstream v8 project
- // https://github.com/v8/v8/commit/c0fd89c3c089e888c4f4e8582e56db7066fa779b
- // Node 16.9.0+ include this change via https://github.com/nodejs/node/pull/39947
function testTypeErrors(name, err, compiledLess, doReplacements, sourcemap, baseFolder) {
const fileSuffix = semver.gte(process.version, 'v16.9.0') ? '-2.txt' : '.txt';
fs.readFile(path.join(baseFolder, name) + fileSuffix, 'utf8', function (e, expectedErr) {
@@ -464,42 +402,33 @@ module.exports = function(testFilter) {
}
function globalReplacements(input, directory, filename) {
- var path = require('path');
var p = filename ? path.join(path.dirname(filename), '/') : directory;
-
- // For debug tests in subdirectories (comments/, mediaquery/, all/),
- // the import/ directory and main linenumbers.less file are at the parent debug/ level, not in the subdirectory
+
var isDebugSubdirectory = false;
var debugParentPath = null;
-
+
if (directory) {
- // Normalize directory path separators for matching
var normalizedDir = directory.replace(/\\/g, '/');
- // Check if we're in a debug subdirectory
if (normalizedDir.includes('/debug/') && (normalizedDir.includes('/comments/') || normalizedDir.includes('/mediaquery/') || normalizedDir.includes('/all/'))) {
isDebugSubdirectory = true;
- // Extract the debug/ directory path (parent of the subdirectory)
- // Match everything up to and including /debug/ (works with both absolute and relative paths)
var debugMatch = normalizedDir.match(/(.+\/debug)\//);
if (debugMatch) {
debugParentPath = debugMatch[1];
}
}
}
-
+
if (isDebugSubdirectory && debugParentPath) {
- // For {path} placeholder, use the parent debug/ directory
- // Convert back to native path format
p = debugParentPath.replace(/\//g, path.sep) + path.sep;
}
-
+
var pathimport;
if (isDebugSubdirectory && debugParentPath) {
pathimport = path.join(debugParentPath.replace(/\//g, path.sep), 'import') + path.sep;
} else {
pathimport = path.join(directory + 'import/');
}
-
+
var pathesc = p.replace(/[.:/\\]/g, function(a) { return '\\' + (a == '\\' ? '\/' : a); }),
pathimportesc = pathimport.replace(/[.:/\\]/g, function(a) { return '\\' + (a == '\\' ? '\/' : a); });
@@ -544,13 +473,10 @@ module.exports = function(testFilter) {
}
function runTestSet(options, foldername, verifyFunction, nameModifier, doReplacements, getFilename) {
- // Handle case where first parameter is glob patterns (no options object)
if (Array.isArray(options)) {
- // First parameter is glob patterns, no options object
foldername = options;
options = {};
} else if (typeof options === 'string') {
- // First parameter is foldername (no options object)
foldername = options;
options = {};
} else {
@@ -577,8 +503,7 @@ module.exports = function(testFilter) {
var patterns = foldername;
var includePatterns = [];
var excludePatterns = [];
-
-
+
patterns.forEach(function(pattern) {
if (pattern.startsWith('!')) {
excludePatterns.push(pattern.substring(1));
@@ -586,11 +511,10 @@ module.exports = function(testFilter) {
includePatterns.push(pattern);
}
});
-
- // Use glob to find all matching files, excluding the excluded patterns
+
var allFiles = [];
includePatterns.forEach(function(pattern) {
- var files = glob.sync(pattern, {
+ var files = globSync(pattern, {
cwd: baseFolder,
absolute: true,
ignore: excludePatterns
@@ -598,21 +522,14 @@ module.exports = function(testFilter) {
allFiles = allFiles.concat(files);
});
-
- // Note: needle mocking is set up globally in index.js
-
- // Process each .less file found
+
allFiles.forEach(function(filePath) {
if (/\.less$/.test(filePath)) {
var file = path.basename(filePath);
- // For glob patterns, we need to construct the relative path differently
- // The filePath is absolute, so we need to get the path relative to the test-data directory
var relativePath = path.relative(baseFolder, path.dirname(filePath)) + '/';
- // Only process files that have corresponding .css files (these are the actual tests)
var cssPath = path.join(path.dirname(filePath), path.basename(file, '.less') + '.css');
if (fs.existsSync(cssPath)) {
- // Process this file using the existing logic
processFileWithInfo({
file: file,
fullPath: filePath,
@@ -621,7 +538,6 @@ module.exports = function(testFilter) {
}
}
});
-
return;
}
@@ -630,40 +546,31 @@ module.exports = function(testFilter) {
var file = fileInfo.file;
var fullPath = fileInfo.fullPath;
var relativePath = fileInfo.relativePath;
-
- // Load config for this specific file using cosmiconfig
+
var configResult = cosmiconfigSync('styles').search(path.dirname(fullPath));
-
- // Deep clone the original options to prevent Less from modifying shared objects
+
var options = JSON.parse(JSON.stringify(originalOptions || {}));
-
+
if (configResult && configResult.config && configResult.config.language && configResult.config.language.less) {
- // Deep clone and merge the language.less settings with the original options
var lessConfig = JSON.parse(JSON.stringify(configResult.config.language.less));
Object.keys(lessConfig).forEach(function(key) {
options[key] = lessConfig[key];
});
}
-
- // Merge any lessOptions from the testMap (for dynamic options like getVars functions)
+
if (originalOptions && originalOptions.lessOptions) {
Object.keys(originalOptions.lessOptions).forEach(function(key) {
var value = originalOptions.lessOptions[key];
if (typeof value === 'function') {
- // For functions, call them with the file path
var result = value(fullPath);
options[key] = result;
} else {
- // For static values, use them directly
options[key] = value;
}
});
}
- // Don't pass stylize to less.render as it's not a valid option
-
var name = getBasename(file, relativePath);
-
if (oneTestOnly && typeof oneTestOnly === 'string' && !name.includes(oneTestOnly)) {
return;
@@ -671,20 +578,14 @@ module.exports = function(testFilter) {
totalTests++;
- if (options.sourceMap && !options.sourceMap.sourceMapFileInline) {
- // Set test infrastructure defaults only if not already set by styles.config.cjs
- // Less.js core (parse-tree.js) will handle normalization of:
- // - sourceMapBasepath (defaults to input file's directory)
- // - sourceMapInputFilename (defaults to options.filename)
- // - sourceMapFilename (derived from sourceMapOutputFilename or input filename)
- // - sourceMapOutputFilename (derived from input filename if not set)
- if (!options.sourceMap.sourceMapOutputFilename) {
- // Needed for sourcemap file name in JSON output
- options.sourceMap.sourceMapOutputFilename = name + '.css';
- }
- if (!options.sourceMap.sourceMapRootpath) {
- // Test-specific default for consistent test output paths
- options.sourceMap.sourceMapRootpath = 'testweb/';
+ if (options.sourceMap && typeof options.sourceMap === 'object') {
+ if (!options.sourceMap.sourceMapFileInline) {
+ if (!options.sourceMap.sourceMapOutputFilename) {
+ options.sourceMap.sourceMapOutputFilename = name + '.css';
+ }
+ if (!options.sourceMap.sourceMapRootpath) {
+ options.sourceMap.sourceMapRootpath = 'testweb/';
+ }
}
}
@@ -710,9 +611,6 @@ module.exports = function(testFilter) {
}
doubleCallCheck = (new Error()).stack;
- /**
- * @todo - refactor so the result object is sent to the verify function
- */
if (verifyFunction) {
var verificationResult = verifyFunction(
name, err, result && result.css, doReplacements, result && result.map, baseFolder, result && result.imports, getFilename
@@ -728,7 +626,6 @@ module.exports = function(testFilter) {
if (err.stack) {
process.stdout.write(err.stack + '\n');
} else {
- // this sometimes happen - show the whole error object
console.log(err);
}
}
@@ -738,23 +635,16 @@ module.exports = function(testFilter) {
var css_name = name;
if (nameModifier) { css_name = nameModifier(name); }
- // Check if we're using the new co-located structure (tests-unit/ or tests-config/) or the old separated structure
var cssPath;
if (relativePath.startsWith('tests-unit/') || relativePath.startsWith('tests-config/')) {
- // New co-located structure: CSS file is in the same directory as LESS file
cssPath = path.join(path.dirname(fullPath), path.basename(file, '.less') + '.css');
} else {
- // Old separated structure: CSS file is in separate css/ folder
- // Windows compatibility: css_name may already contain path separators
- // Use path.join with empty string to let path.join handle normalization
cssPath = path.join(testFolder, css_name) + '.css';
}
- // For the new structure, we need to handle replacements differently
var replacementPath;
if (relativePath.startsWith('tests-unit/') || relativePath.startsWith('tests-config/')) {
replacementPath = path.dirname(fullPath);
- // Ensure replacementPath ends with a path separator for consistent matching
if (!replacementPath.endsWith(path.sep)) {
replacementPath += path.sep;
}
@@ -765,34 +655,29 @@ module.exports = function(testFilter) {
var testName = fullPath.replace(/\.less$/, '');
process.stdout.write('- ' + testName + ': ');
-
var css = fs.readFileSync(cssPath, 'utf8');
css = css && doReplacements(css, replacementPath);
if (result.css === css) { ok('OK'); }
else {
difference('FAIL', css, result.css);
}
-
+
release();
});
});
}
-
+
function getBasename(file, relativePath) {
var basePath = relativePath || foldername;
- // Ensure basePath ends with a slash for proper path construction
if (basePath.charAt(basePath.length - 1) !== '/') {
basePath = basePath + '/';
}
return basePath + path.basename(file, '.less');
}
-
- // This function is only called for non-glob patterns now
- // For glob patterns, we use the glob library in the calling code
var dirPath = path.join(baseFolder, foldername);
var items = fs.readdirSync(dirPath);
-
+
items.forEach(function(item) {
if (/\.less$/.test(item)) {
processFileWithInfo({
@@ -805,11 +690,9 @@ module.exports = function(testFilter) {
}
function diff(left, right) {
- // Configure chalk to always show colors
var chalk = require('chalk');
- chalk.level = 3; // Force colors on
-
- // Use jest-diff for much clearer output like Vitest
+ chalk.level = 3;
+
var diffResult = require('jest-diff').diffStringsUnified(left || '', right || '', {
expand: false,
includeChangeCounts: true,
@@ -819,8 +702,7 @@ module.exports = function(testFilter) {
changeColor: chalk.inverse,
commonColor: chalk.dim
});
-
- // jest-diff returns a string with ANSI colors, so we can output it directly
+
process.stdout.write(diffResult + '\n');
}
@@ -834,9 +716,8 @@ module.exports = function(testFilter) {
process.stdout.write(stylize(msg, 'yellow') + '\n');
failedTests++;
- // Only show the diff, not the full text
process.stdout.write(stylize('Diff:', 'yellow') + '\n');
-
+
diff(left || '', right || '');
endTest();
}
@@ -882,48 +763,35 @@ module.exports = function(testFilter) {
return false;
}
- /**
- *
- * @param {Object} options
- * @param {string} filePath
- * @param {Function} callback
- */
function toCSS(options, filePath, callback) {
- // Deep clone options to prevent modifying the original, but preserve functions
var originalOptions = options || {};
options = JSON.parse(JSON.stringify(originalOptions));
-
- // Restore functions that were lost in JSON serialization
+
if (originalOptions.getVars) {
options.getVars = originalOptions.getVars;
}
var str = fs.readFileSync(filePath, 'utf8'), addPath = path.dirname(filePath);
-
- // Initialize paths array if it doesn't exist
+
if (typeof options.paths !== 'string') {
options.paths = options.paths || [];
} else {
options.paths = [options.paths];
}
-
- // Add the current directory to paths if not already present
+
if (!contains(options.paths, addPath)) {
options.paths.push(addPath);
}
-
- // Resolve all paths relative to the test file's directory
+
options.paths = options.paths.map(searchPath => {
if (path.isAbsolute(searchPath)) {
return searchPath;
}
- // Resolve relative to the test file's directory
return path.resolve(path.dirname(filePath), searchPath);
})
-
+
options.filename = path.resolve(process.cwd(), filePath);
options.optimization = options.optimization || 0;
- // Note: globalVars and modifyVars are now handled via styles.config.cjs or lessOptions
if (options.plugin) {
var Plugin = require(path.resolve(process.cwd(), options.plugin));
options.plugins = [Plugin];
@@ -946,15 +814,11 @@ module.exports = function(testFilter) {
ok(stylize('OK\n', 'green'));
}
- // HTTP redirect testing is now handled directly in test/index.js
-
function testDisablePluginRule() {
less.render(
'@plugin "../../plugin/some_plugin";',
{disablePluginRule: true},
function(err) {
- // TODO: Need a better way of identifing exactly which error is thrown. Checking
- // text like this tends to be rather brittle.
const EXPECTED = '@plugin statements are not allowed when disablePluginRule is set to true';
if (!err || String(err).indexOf(EXPECTED) < 0) {
fail('ERROR: Expected "' + EXPECTED + '" error');
diff --git a/packages/less/test/mocha-playwright/runner.js b/packages/less/test/mocha-playwright/runner.js
index da6ef8fd9..6a1c45558 100644
--- a/packages/less/test/mocha-playwright/runner.js
+++ b/packages/less/test/mocha-playwright/runner.js
@@ -1,8 +1,6 @@
-'use strict';
-
-const path = require('path');
-const util = require('util');
-const { chromium } = require('playwright');
+import path from 'path';
+import util from 'util';
+import { chromium } from 'playwright';
const TIMEOUT_MILLISECONDS = 60000;
function initMocha(reporter) {
@@ -155,7 +153,7 @@ function prepareUrl(filePath) {
return `file://${resolvedPath}`;
}
-exports.runner = function ({ file, reporter, timeout, width, height, args, executablePath, visible, polling }) {
+export function runner({ file, reporter, timeout, width, height, args, executablePath, visible, polling }) {
return new Promise(resolve => {
// validate options
diff --git a/packages/less/test/modify-vars.js b/packages/less/test/modify-vars.js
index a5763d2eb..3d58e4e79 100644
--- a/packages/less/test/modify-vars.js
+++ b/packages/less/test/modify-vars.js
@@ -1,14 +1,5 @@
-var less;
-
-// Dist fallback for NPM-installed Less (for plugins that do testing)
-try {
- less = require('../tmp/less.cjs.js');
-}
-catch (e) {
- less = require('../dist/less.cjs.js');
-}
-
-var fs = require('fs');
+import less from '../lib/less-node/index.js';
+import fs from 'fs';
var input = fs.readFileSync('./test/less/modifyVars/extended.less', 'utf8');
var expectedCss = fs.readFileSync('./test/css/modifyVars/extended.css', 'utf8');
diff --git a/packages/less/test/plugins/filemanager/index.js b/packages/less/test/plugins/filemanager/index.cjs
similarity index 100%
rename from packages/less/test/plugins/filemanager/index.js
rename to packages/less/test/plugins/filemanager/index.cjs
diff --git a/packages/less/test/plugins/postprocess/index.js b/packages/less/test/plugins/postprocess/index.cjs
similarity index 100%
rename from packages/less/test/plugins/postprocess/index.js
rename to packages/less/test/plugins/postprocess/index.cjs
diff --git a/packages/less/test/plugins/preprocess/index.js b/packages/less/test/plugins/preprocess/index.cjs
similarity index 100%
rename from packages/less/test/plugins/preprocess/index.js
rename to packages/less/test/plugins/preprocess/index.cjs
diff --git a/packages/less/test/plugins/visitor/index.js b/packages/less/test/plugins/visitor/index.cjs
similarity index 100%
rename from packages/less/test/plugins/visitor/index.js
rename to packages/less/test/plugins/visitor/index.cjs
diff --git a/packages/less/test/sourcemaps/comprehensive.json b/packages/less/test/sourcemaps/comprehensive.json
index 96215f269..a4a88963b 100644
--- a/packages/less/test/sourcemaps/comprehensive.json
+++ b/packages/less/test/sourcemaps/comprehensive.json
@@ -1 +1 @@
-{"version":3,"sources":["comprehensive.less"],"names":[],"mappings":"AAoBA;EACE,aAAA;EACA,mBAAA;;AAFF,UAIE;EACE,YAAA;EACA,eAAA;;AANJ,UAIE,QAIE;EACE,iBAAA;EACA,mBAAA;;AAVN,UAcE;EACE,mBAAA;EACA,aAAA;;AAhBJ,UAcE,SAIE;EACE,SAAA;EACA,gBAAA;;AAMN;EACE,OAAO,qBAAP;EACA,QAAQ,iBAAR;EACA,YAAA;;AAIF;EACE,cAAA;EACA,mBAAA;EACA,yCAAA;;AAIF;EAlDE,mBAAA;EACA,2BAAA;EACA,wBAAA;EAIA,yCAAA;EA+CA,aAAA;EACA,iBAAA;;AAIF,QAA0B;EACxB;IACE,aAAA;;EADF,UAGE;IACE,eAAA;;;AAKN;EACE;IACE,aAAA;IACA,uBAAuB,cAAvB;IACA,SAAA;;;AAKJ;AAMA;EALE,kBAAA;EACA,YAAA;EACA,eAAA;;AAGF;EAEE,mBAAA;EACA,YAAA;;AAIF,WACE;EACE,gBAAA;;AAFJ,WACE,GAGE;EACE,qBAAA;;AALN,WACE,GAGE,GAGE;EACE,qBAAA;;AAEA,WATN,GAGE,GAGE,EAGG;EACC,cAAA;;AAGF,WAbN,GAGE,GAGE,EAOG;EACC,cAAA;;AAYT;EACC,cAAA;;AAIF,OACE,QACE,QACE;EACE,cAAA","file":"{path}comprehensive.css"}
\ No newline at end of file
+{"version":3,"sources":["comprehensive.less"],"names":[],"mappings":"AAoBA;EACE,aAAA;EACA,mBAAA;;AAFF,UAIE;EACE,YAAA;EACA,eAAA;;AANJ,UAIE,QAIE;EACE,iBAAA;EACA,mBAAA;;AAVN,UAcE;EACE,mBAAA;EACA,aAAA;;AAhBJ,UAcE,SAIE;EACE,SAAA;EACA,gBAAA;;AAMN;EACE,OAAO,qBAAP;EACA,QAAQ,iBAAR;EACA,YAAA;;AAIF;EACE,cAAA;EACA,mBAAA;EACA,yCAAA;;AAIF;EAlDE,mBAAA;EACA,2BAAA;EACA,wBAAA;EAIA,yCAAA;EA+CA,aAAA;EACA,iBAAA;;AAIF,QAA0B;EACxB;IACE,aAAA;;EADF,UAGE;IACE,eAAA;;;AAKN;EACE;IACE,aAAA;IACA,uBAAuB,cAAvB;IACA,SAAA;;;AAKJ;AAMA;EALE,kBAAA;EACA,YAAA;EACA,eAAA;;AAGF;EAEE,mBAAA;EACA,YAAA;;AAIF,WACE;EACE,gBAAA;;AAFJ,WACE,GAGE;EACE,qBAAA;;AALN,WACE,GAGE,GAGE;EACE,qBAAA;;AAEA,WATN,GAGE,GAGE,EAGG;EACC,cAAA;;AAGF,WAbN,GAGE,GAGE,EAOG;EACC,cAAA;;AAYT;EACC,cAAA;;AAIF,OACE,QACE,QACE;EACE,cAAA","file":"comprehensive.css"}
\ No newline at end of file
diff --git a/packages/less/test/test-es6.ts b/packages/less/test/test-es6.js
similarity index 76%
rename from packages/less/test/test-es6.ts
rename to packages/less/test/test-es6.js
index f83b2d0b1..889160660 100644
--- a/packages/less/test/test-es6.ts
+++ b/packages/less/test/test-es6.js
@@ -1,7 +1,7 @@
// https://github.com/less/less.js/issues/3533
console.log('Testing ES6 imports...')
-import less from '..';
+import less from 'less';
const lessRender = less.render;
// then I call lessRender on something
@@ -11,7 +11,7 @@ body {
b: 2;
c: 30;
d: 4;
-}`, {sourceMap: {}}, function(error: any, output: any) {
+}`, {sourceMap: {}}, function(error, output) {
if (error)
console.error(error)
})
\ No newline at end of file
diff --git a/packages/less/tsconfig.build.json b/packages/less/tsconfig.build.json
deleted file mode 100644
index bbb693682..000000000
--- a/packages/less/tsconfig.build.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "extends": "./tsconfig",
- "compilerOptions": {
- "rootDir": "./src",
- },
- "include": ["src/**/*"]
-}
\ No newline at end of file
diff --git a/packages/less/tsconfig.json b/packages/less/tsconfig.json
index 9eb20b6bd..1a2441366 100644
--- a/packages/less/tsconfig.json
+++ b/packages/less/tsconfig.json
@@ -1,21 +1,17 @@
{
"compilerOptions": {
- "outDir": "./lib",
+ "target": "ES2022",
+ "module": "ES2022",
"moduleResolution": "node",
- "rootDir": ".",
"allowJs": true,
- "sourceMap": true,
- "inlineSources": true,
+ "checkJs": false,
+ "noEmit": true,
"esModuleInterop": true,
- "importHelpers": true,
"noImplicitAny": true,
- "target": "ES5"
+ "strict": false,
+ "skipLibCheck": true,
+ "rootDir": "."
},
- "ts-node": {
- "compilerOptions": {
- "rootDir": "."
- }
- },
- "include": ["**/*"],
- "exclude": ["node_modules", "lib/**/*"]
-}
\ No newline at end of file
+ "include": ["lib/**/*"],
+ "exclude": ["node_modules"]
+}
diff --git a/packages/test-data/tests-config/filemanagerPlugin/styles.config.cjs b/packages/test-data/tests-config/filemanagerPlugin/styles.config.cjs
index ee444169f..c7a769851 100644
--- a/packages/test-data/tests-config/filemanagerPlugin/styles.config.cjs
+++ b/packages/test-data/tests-config/filemanagerPlugin/styles.config.cjs
@@ -1,7 +1,7 @@
module.exports = {
language: {
less: {
- "plugin": "test/plugins/filemanager/"
+ "plugin": "test/plugins/filemanager/index.cjs"
}
}
};
diff --git a/packages/test-data/tests-config/postProcessorPlugin/styles.config.cjs b/packages/test-data/tests-config/postProcessorPlugin/styles.config.cjs
index a7364c623..a3ab5faa1 100644
--- a/packages/test-data/tests-config/postProcessorPlugin/styles.config.cjs
+++ b/packages/test-data/tests-config/postProcessorPlugin/styles.config.cjs
@@ -1,7 +1,7 @@
module.exports = {
language: {
less: {
- "plugin": "test/plugins/postprocess/"
+ "plugin": "test/plugins/postprocess/index.cjs"
}
}
};
diff --git a/packages/test-data/tests-config/preProcessorPlugin/styles.config.cjs b/packages/test-data/tests-config/preProcessorPlugin/styles.config.cjs
index fca0da5c9..8439f2fb3 100644
--- a/packages/test-data/tests-config/preProcessorPlugin/styles.config.cjs
+++ b/packages/test-data/tests-config/preProcessorPlugin/styles.config.cjs
@@ -1,7 +1,7 @@
module.exports = {
language: {
less: {
- "plugin": "test/plugins/preprocess/"
+ "plugin": "test/plugins/preprocess/index.cjs"
}
}
};
diff --git a/packages/test-data/tests-config/visitorPlugin/styles.config.cjs b/packages/test-data/tests-config/visitorPlugin/styles.config.cjs
index 72705a894..c5971580a 100644
--- a/packages/test-data/tests-config/visitorPlugin/styles.config.cjs
+++ b/packages/test-data/tests-config/visitorPlugin/styles.config.cjs
@@ -1,7 +1,7 @@
module.exports = {
language: {
less: {
- "plugin": "test/plugins/visitor/"
+ "plugin": "test/plugins/visitor/index.cjs"
}
}
};
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a61878606..98be7646d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -32,9 +32,6 @@ importers:
parse-node-version:
specifier: ^1.0.1
version: 1.0.1
- tslib:
- specifier: ^2.3.0
- version: 2.8.1
optionalDependencies:
errno:
specifier: ^0.1.1
@@ -75,10 +72,10 @@ importers:
version: 11.2.1(rollup@2.79.2)
'@typescript-eslint/eslint-plugin':
specifier: ^4.28.0
- version: 4.33.0(@typescript-eslint/parser@4.33.0)(eslint@7.32.0)(typescript@4.9.5)
+ version: 4.33.0(@typescript-eslint/parser@4.33.0)(eslint@7.32.0)(typescript@5.9.3)
'@typescript-eslint/parser':
specifier: ^4.28.0
- version: 4.33.0(eslint@7.32.0)(typescript@4.9.5)
+ version: 4.33.0(eslint@7.32.0)(typescript@5.9.3)
benny:
specifier: ^3.6.12
version: 3.7.1
@@ -96,7 +93,7 @@ importers:
version: 4.1.2
cosmiconfig:
specifier: ~9.0.0
- version: 9.0.0(typescript@4.9.5)
+ version: 9.0.0(typescript@5.9.3)
cross-env:
specifier: ^7.0.3
version: 7.0.3
@@ -116,7 +113,7 @@ importers:
specifier: ^10.0.1
version: 10.0.2
grunt:
- specifier: ^1.0.4
+ specifier: ^1.5.0
version: 1.6.1
grunt-cli:
specifier: ^1.3.2
@@ -187,9 +184,6 @@ importers:
rollup-plugin-terser:
specifier: ^5.1.1
version: 5.3.1(rollup@2.79.2)
- rollup-plugin-typescript2:
- specifier: ^0.29.0
- version: 0.29.0(rollup@2.79.2)(typescript@4.9.5)
semver:
specifier: ^6.3.0
version: 6.3.1
@@ -199,12 +193,9 @@ importers:
time-grunt:
specifier: ^1.3.0
version: 1.4.0
- ts-node:
- specifier: ^10.9.1
- version: 10.9.2(@types/node@25.0.2)(typescript@4.9.5)
typescript:
- specifier: ^4.3.4
- version: 4.9.5
+ specifier: ^5.7.0
+ version: 5.9.3
uikit:
specifier: 2.27.4
version: 2.27.4
@@ -284,13 +275,6 @@ packages:
engines: {node: '>=18'}
dev: true
- /@cspotcode/source-map-support@0.8.1:
- resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
- engines: {node: '>=12'}
- dependencies:
- '@jridgewell/trace-mapping': 0.3.9
- dev: true
-
/@eslint/eslintrc@0.4.3:
resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==}
engines: {node: ^10.12.0 || >=12.0.0}
@@ -387,13 +371,6 @@ packages:
'@jridgewell/sourcemap-codec': 1.5.5
dev: true
- /@jridgewell/trace-mapping@0.3.9:
- resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
- dependencies:
- '@jridgewell/resolve-uri': 3.1.2
- '@jridgewell/sourcemap-codec': 1.5.5
- dev: true
-
/@nodelib/fs.scandir@2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@@ -478,22 +455,6 @@ packages:
resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==}
dev: true
- /@tsconfig/node10@1.0.12:
- resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==}
- dev: true
-
- /@tsconfig/node12@1.0.11:
- resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
- dev: true
-
- /@tsconfig/node14@1.0.3:
- resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
- dev: true
-
- /@tsconfig/node16@1.0.4:
- resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
- dev: true
-
/@types/estree@0.0.39:
resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==}
dev: true
@@ -536,7 +497,7 @@ packages:
'@types/node': 25.0.2
dev: true
- /@typescript-eslint/eslint-plugin@4.33.0(@typescript-eslint/parser@4.33.0)(eslint@7.32.0)(typescript@4.9.5):
+ /@typescript-eslint/eslint-plugin@4.33.0(@typescript-eslint/parser@4.33.0)(eslint@7.32.0)(typescript@5.9.3):
resolution: {integrity: sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==}
engines: {node: ^10.12.0 || >=12.0.0}
peerDependencies:
@@ -547,8 +508,8 @@ packages:
typescript:
optional: true
dependencies:
- '@typescript-eslint/experimental-utils': 4.33.0(eslint@7.32.0)(typescript@4.9.5)
- '@typescript-eslint/parser': 4.33.0(eslint@7.32.0)(typescript@4.9.5)
+ '@typescript-eslint/experimental-utils': 4.33.0(eslint@7.32.0)(typescript@5.9.3)
+ '@typescript-eslint/parser': 4.33.0(eslint@7.32.0)(typescript@5.9.3)
'@typescript-eslint/scope-manager': 4.33.0
debug: 4.4.3
eslint: 7.32.0
@@ -556,13 +517,13 @@ packages:
ignore: 5.3.2
regexpp: 3.2.0
semver: 7.7.3
- tsutils: 3.21.0(typescript@4.9.5)
- typescript: 4.9.5
+ tsutils: 3.21.0(typescript@5.9.3)
+ typescript: 5.9.3
transitivePeerDependencies:
- supports-color
dev: true
- /@typescript-eslint/experimental-utils@4.33.0(eslint@7.32.0)(typescript@4.9.5):
+ /@typescript-eslint/experimental-utils@4.33.0(eslint@7.32.0)(typescript@5.9.3):
resolution: {integrity: sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==}
engines: {node: ^10.12.0 || >=12.0.0}
peerDependencies:
@@ -571,7 +532,7 @@ packages:
'@types/json-schema': 7.0.15
'@typescript-eslint/scope-manager': 4.33.0
'@typescript-eslint/types': 4.33.0
- '@typescript-eslint/typescript-estree': 4.33.0(typescript@4.9.5)
+ '@typescript-eslint/typescript-estree': 4.33.0(typescript@5.9.3)
eslint: 7.32.0
eslint-scope: 5.1.1
eslint-utils: 3.0.0(eslint@7.32.0)
@@ -580,7 +541,7 @@ packages:
- typescript
dev: true
- /@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@4.9.5):
+ /@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.9.3):
resolution: {integrity: sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==}
engines: {node: ^10.12.0 || >=12.0.0}
peerDependencies:
@@ -592,10 +553,10 @@ packages:
dependencies:
'@typescript-eslint/scope-manager': 4.33.0
'@typescript-eslint/types': 4.33.0
- '@typescript-eslint/typescript-estree': 4.33.0(typescript@4.9.5)
+ '@typescript-eslint/typescript-estree': 4.33.0(typescript@5.9.3)
debug: 4.4.3
eslint: 7.32.0
- typescript: 4.9.5
+ typescript: 5.9.3
transitivePeerDependencies:
- supports-color
dev: true
@@ -613,7 +574,7 @@ packages:
engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1}
dev: true
- /@typescript-eslint/typescript-estree@4.33.0(typescript@4.9.5):
+ /@typescript-eslint/typescript-estree@4.33.0(typescript@5.9.3):
resolution: {integrity: sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==}
engines: {node: ^10.12.0 || >=12.0.0}
peerDependencies:
@@ -628,8 +589,8 @@ packages:
globby: 11.1.0
is-glob: 4.0.3
semver: 7.7.3
- tsutils: 3.21.0(typescript@4.9.5)
- typescript: 4.9.5
+ tsutils: 3.21.0(typescript@5.9.3)
+ typescript: 5.9.3
transitivePeerDependencies:
- supports-color
dev: true
@@ -662,13 +623,6 @@ packages:
acorn: 7.4.1
dev: true
- /acorn-walk@8.3.4:
- resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
- engines: {node: '>=0.4.0'}
- dependencies:
- acorn: 8.15.0
- dev: true
-
/acorn@7.4.1:
resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
engines: {node: '>=0.4.0'}
@@ -813,10 +767,6 @@ packages:
mkdirp: 0.5.6
dev: true
- /arg@4.1.3:
- resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
- dev: true
-
/argparse@1.0.10:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
dependencies:
@@ -1354,7 +1304,7 @@ packages:
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
dev: true
- /cosmiconfig@9.0.0(typescript@4.9.5):
+ /cosmiconfig@9.0.0(typescript@5.9.3):
resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
engines: {node: '>=14'}
peerDependencies:
@@ -1367,11 +1317,7 @@ packages:
import-fresh: 3.3.1
js-yaml: 4.1.1
parse-json: 5.2.0
- typescript: 4.9.5
- dev: true
-
- /create-require@1.1.1:
- resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+ typescript: 5.9.3
dev: true
/cross-env@7.0.3:
@@ -1585,11 +1531,6 @@ packages:
engines: {node: '>=0.3.1'}
dev: true
- /diff@4.0.2:
- resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
- engines: {node: '>=0.3.1'}
- dev: true
-
/dir-glob@3.0.1:
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
engines: {node: '>=8'}
@@ -2081,15 +2022,6 @@ packages:
- supports-color
dev: true
- /find-cache-dir@3.3.2:
- resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==}
- engines: {node: '>=8'}
- dependencies:
- commondir: 1.0.1
- make-dir: 3.1.0
- pkg-dir: 4.2.0
- dev: true
-
/find-up@3.0.0:
resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==}
engines: {node: '>=6'}
@@ -2456,12 +2388,12 @@ packages:
/glob@7.1.7:
resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==}
- deprecated: Glob versions prior to v9 are no longer supported
+ deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
dependencies:
fs.realpath: 1.0.0
inflight: 1.0.6
inherits: 2.0.4
- minimatch: 3.0.8
+ minimatch: 3.1.2
once: 1.4.0
path-is-absolute: 1.0.1
dev: true
@@ -3661,13 +3593,6 @@ packages:
dev: false
optional: true
- /make-dir@3.1.0:
- resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
- engines: {node: '>=8'}
- dependencies:
- semver: 6.3.1
- dev: true
-
/make-dir@4.0.0:
resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
engines: {node: '>=10'}
@@ -3675,10 +3600,6 @@ packages:
semver: 7.7.3
dev: true
- /make-error@1.3.6:
- resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
- dev: true
-
/make-iterator@1.0.1:
resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==}
engines: {node: '>=0.10.0'}
@@ -4428,13 +4349,6 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
- /pkg-dir@4.2.0:
- resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
- engines: {node: '>=8'}
- dependencies:
- find-up: 4.1.0
- dev: true
-
/platform@1.3.6:
resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==}
dev: true
@@ -4753,12 +4667,6 @@ packages:
engines: {node: '>=4'}
dev: true
- /resolve@1.17.0:
- resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==}
- dependencies:
- path-parse: 1.0.7
- dev: true
-
/resolve@1.22.11:
resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==}
engines: {node: '>= 0.4'}
@@ -4812,21 +4720,6 @@ packages:
terser: 4.8.1
dev: true
- /rollup-plugin-typescript2@0.29.0(rollup@2.79.2)(typescript@4.9.5):
- resolution: {integrity: sha512-YytahBSZCIjn/elFugEGQR5qTsVhxhUwGZIsA9TmrSsC88qroGo65O5HZP/TTArH2dm0vUmYWhKchhwi2wL9bw==}
- peerDependencies:
- rollup: '>=1.26.3'
- typescript: '>=2.4.0'
- dependencies:
- '@rollup/pluginutils': 3.1.0(rollup@2.79.2)
- find-cache-dir: 3.3.2
- fs-extra: 8.1.0
- resolve: 1.17.0
- rollup: 2.79.2
- tslib: 2.0.1
- typescript: 4.9.5
- dev: true
-
/rollup-pluginutils@2.8.2:
resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==}
dependencies:
@@ -5518,57 +5411,18 @@ packages:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
dev: true
- /ts-node@10.9.2(@types/node@25.0.2)(typescript@4.9.5):
- resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
- hasBin: true
- peerDependencies:
- '@swc/core': '>=1.2.50'
- '@swc/wasm': '>=1.2.50'
- '@types/node': '*'
- typescript: '>=2.7'
- peerDependenciesMeta:
- '@swc/core':
- optional: true
- '@swc/wasm':
- optional: true
- dependencies:
- '@cspotcode/source-map-support': 0.8.1
- '@tsconfig/node10': 1.0.12
- '@tsconfig/node12': 1.0.11
- '@tsconfig/node14': 1.0.3
- '@tsconfig/node16': 1.0.4
- '@types/node': 25.0.2
- acorn: 8.15.0
- acorn-walk: 8.3.4
- arg: 4.1.3
- create-require: 1.1.1
- diff: 4.0.2
- make-error: 1.3.6
- typescript: 4.9.5
- v8-compile-cache-lib: 3.0.1
- yn: 3.1.1
- dev: true
-
/tslib@1.14.1:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
dev: true
- /tslib@2.0.1:
- resolution: {integrity: sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==}
- dev: true
-
- /tslib@2.8.1:
- resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
- dev: false
-
- /tsutils@3.21.0(typescript@4.9.5):
+ /tsutils@3.21.0(typescript@5.9.3):
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
engines: {node: '>= 6'}
peerDependencies:
typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
dependencies:
tslib: 1.14.1
- typescript: 4.9.5
+ typescript: 5.9.3
dev: true
/tunnel-agent@0.3.0:
@@ -5652,9 +5506,9 @@ packages:
reflect.getprototypeof: 1.0.10
dev: true
- /typescript@4.9.5:
- resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
- engines: {node: '>=4.2.0'}
+ /typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ engines: {node: '>=14.17'}
hasBin: true
dev: true
@@ -5734,10 +5588,6 @@ packages:
hasBin: true
dev: true
- /v8-compile-cache-lib@3.0.1:
- resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
- dev: true
-
/v8-compile-cache@2.4.0:
resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==}
dev: true
@@ -6022,11 +5872,6 @@ packages:
yargs-parser: 21.1.1
dev: true
- /yn@3.1.1:
- resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
- engines: {node: '>=6'}
- dev: true
-
/yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
From a45148202dda76f69b99bce482bec762f76a3a34 Mon Sep 17 00:00:00 2001
From: Matthew Dean
Date: Mon, 9 Mar 2026 16:11:54 -0700
Subject: [PATCH 02/11] chore: fix trailing semicolons from linter
---
packages/less/test/less-test.js | 2 +-
packages/less/test/mocha-playwright/runner.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/packages/less/test/less-test.js b/packages/less/test/less-test.js
index 1f2bff1b1..05958b8f5 100644
--- a/packages/less/test/less-test.js
+++ b/packages/less/test/less-test.js
@@ -845,4 +845,4 @@ export default function(testFilter) {
testJSImport: testJSImport,
finished: finished
};
-};
+}
diff --git a/packages/less/test/mocha-playwright/runner.js b/packages/less/test/mocha-playwright/runner.js
index 6a1c45558..c09338238 100644
--- a/packages/less/test/mocha-playwright/runner.js
+++ b/packages/less/test/mocha-playwright/runner.js
@@ -205,4 +205,4 @@ export function runner({ file, reporter, timeout, width, height, args, executabl
resolve(result);
});
-};
+}
From 4e1a0aee8cb4108dc3ae399e920f55ad71391223 Mon Sep 17 00:00:00 2001
From: Matthew Dean
Date: Mon, 9 Mar 2026 16:12:17 -0700
Subject: [PATCH 03/11] chore: gitignore generated .css.map files in lib/
---
packages/less/.gitignore | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/packages/less/.gitignore b/packages/less/.gitignore
index 28568df4d..f6a0026cf 100644
--- a/packages/less/.gitignore
+++ b/packages/less/.gitignore
@@ -5,4 +5,5 @@ test/browser/less.min.js.map
test/sourcemaps/**/*.map
test/sourcemaps/*.map
test/sourcemaps/*.css
-test/less-bom
\ No newline at end of file
+test/less-bom
+lib/**/*.css.map
\ No newline at end of file
From 954c25a4dc87526b9166ac60e9c7e97aae831efa Mon Sep 17 00:00:00 2001
From: Matthew Dean
Date: Mon, 9 Mar 2026 16:12:58 -0700
Subject: [PATCH 04/11] fix(ci): restore lts/-3 to test matrix
---
.github/workflows/ci.yml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 62436e1ba..8fb80138d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -23,6 +23,8 @@ jobs:
node: 'lts/-1'
- os: ubuntu-latest
node: 'lts/-2'
+ - os: ubuntu-latest
+ node: 'lts/-3'
runs-on: ${{ matrix.os }}
# This has copy/paste steps and should be refactored using DRY
From 64f4cbfc780d29d1b6ff4f73103ab8c8fec26605 Mon Sep 17 00:00:00 2001
From: Matthew Dean
Date: Mon, 9 Mar 2026 16:17:11 -0700
Subject: [PATCH 05/11] chore: stop tracking dist/ build artifacts
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Generated browser bundles don't need to be in source control — they're
built during publish and included in the npm package via the files field.
Removes duplicate copies from both root dist/ and packages/less/dist/.
---
.gitignore | 3 +
dist/less.js | 11964 ------------------------
dist/less.min.js | 11 -
dist/less.min.js.map | 1 -
packages/less/.gitignore | 1 +
packages/less/dist/less.js | 13256 ---------------------------
packages/less/dist/less.min.js | 11 -
packages/less/dist/less.min.js.map | 1 -
8 files changed, 4 insertions(+), 25244 deletions(-)
delete mode 100644 dist/less.js
delete mode 100644 dist/less.min.js
delete mode 100644 dist/less.min.js.map
delete mode 100644 packages/less/dist/less.js
delete mode 100644 packages/less/dist/less.min.js
delete mode 100644 packages/less/dist/less.min.js.map
diff --git a/.gitignore b/.gitignore
index bb333eee6..4bfd00f50 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,3 +17,6 @@ npm-debug.log
.nyc_output
coverage
*.lcov
+
+# Build output
+dist
diff --git a/dist/less.js b/dist/less.js
deleted file mode 100644
index 0883ae41c..000000000
--- a/dist/less.js
+++ /dev/null
@@ -1,11964 +0,0 @@
-/**
- * Less - Leaner CSS v4.4.2
- * http://lesscss.org
- *
- * Copyright (c) 2009-2025, Alexis Sellier
- * Licensed under the Apache-2.0 License.
- *
- * @license Apache-2.0
- */
-
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.less = factory());
-})(this, (function () { 'use strict';
-
- // Export a new default each time
- function defaultOptions () {
- return {
- /* Inline Javascript - @plugin still allowed */
- javascriptEnabled: false,
- /* Outputs a makefile import dependency list to stdout. */
- depends: false,
- /* (DEPRECATED) Compress using less built-in compression.
- * This does an okay job but does not utilise all the tricks of
- * dedicated css compression. */
- compress: false,
- /* Runs the less parser and just reports errors without any output. */
- lint: false,
- /* Sets available include paths.
- * If the file in an @import rule does not exist at that exact location,
- * less will look for it at the location(s) passed to this option.
- * You might use this for instance to specify a path to a library which
- * you want to be referenced simply and relatively in the less files. */
- paths: [],
- /* color output in the terminal */
- color: true,
- /* The strictImports controls whether the compiler will allow an @import inside of either
- * @media blocks or (a later addition) other selector blocks.
- * See: https://github.com/less/less.js/issues/656 */
- strictImports: false,
- /* Allow Imports from Insecure HTTPS Hosts */
- insecure: false,
- /* Allows you to add a path to every generated import and url in your css.
- * This does not affect less import statements that are processed, just ones
- * that are left in the output css. */
- rootpath: '',
- /* By default URLs are kept as-is, so if you import a file in a sub-directory
- * that references an image, exactly the same URL will be output in the css.
- * This option allows you to re-write URL's in imported files so that the
- * URL is always relative to the base imported file */
- rewriteUrls: false,
- /* How to process math
- * 0 always - eagerly try to solve all operations
- * 1 parens-division - require parens for division "/"
- * 2 parens | strict - require parens for all operations
- * 3 strict-legacy - legacy strict behavior (super-strict)
- */
- math: 1,
- /* Without this option, less attempts to guess at the output unit when it does maths. */
- strictUnits: false,
- /* Effectively the declaration is put at the top of your base Less file,
- * meaning it can be used but it also can be overridden if this variable
- * is defined in the file. */
- globalVars: null,
- /* As opposed to the global variable option, this puts the declaration at the
- * end of your base file, meaning it will override anything defined in your Less file. */
- modifyVars: null,
- /* This option allows you to specify a argument to go on to every URL. */
- urlArgs: ''
- };
- }
-
- function extractId(href) {
- return href.replace(/^[a-z-]+:\/+?[^/]+/, '') // Remove protocol & domain
- .replace(/[?&]livereload=\w+/, '') // Remove LiveReload cachebuster
- .replace(/^\//, '') // Remove root /
- .replace(/\.[a-zA-Z]+$/, '') // Remove simple extension
- .replace(/[^.\w-]+/g, '-') // Replace illegal characters
- .replace(/\./g, ':'); // Replace dots with colons(for valid id)
- }
- function addDataAttr(options, tag) {
- if (!tag) {
- return;
- } // in case of tag is null or undefined
- for (var opt in tag.dataset) {
- if (Object.prototype.hasOwnProperty.call(tag.dataset, opt)) {
- if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') {
- options[opt] = tag.dataset[opt];
- }
- else {
- try {
- options[opt] = JSON.parse(tag.dataset[opt]);
- }
- catch (_) { }
- }
- }
- }
- }
-
- var browser = {
- createCSS: function (document, styles, sheet) {
- // Strip the query-string
- var href = sheet.href || '';
- // If there is no title set, use the filename, minus the extension
- var id = "less:".concat(sheet.title || extractId(href));
- // If this has already been inserted into the DOM, we may need to replace it
- var oldStyleNode = document.getElementById(id);
- var keepOldStyleNode = false;
- // Create a new stylesheet node for insertion or (if necessary) replacement
- var styleNode = document.createElement('style');
- styleNode.setAttribute('type', 'text/css');
- if (sheet.media) {
- styleNode.setAttribute('media', sheet.media);
- }
- styleNode.id = id;
- if (!styleNode.styleSheet) {
- styleNode.appendChild(document.createTextNode(styles));
- // If new contents match contents of oldStyleNode, don't replace oldStyleNode
- keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 &&
- oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);
- }
- var head = document.getElementsByTagName('head')[0];
- // If there is no oldStyleNode, just append; otherwise, only append if we need
- // to replace oldStyleNode with an updated stylesheet
- if (oldStyleNode === null || keepOldStyleNode === false) {
- var nextEl = sheet && sheet.nextSibling || null;
- if (nextEl) {
- nextEl.parentNode.insertBefore(styleNode, nextEl);
- }
- else {
- head.appendChild(styleNode);
- }
- }
- if (oldStyleNode && keepOldStyleNode === false) {
- oldStyleNode.parentNode.removeChild(oldStyleNode);
- }
- // For IE.
- // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.
- // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head
- if (styleNode.styleSheet) {
- try {
- styleNode.styleSheet.cssText = styles;
- }
- catch (e) {
- throw new Error('Couldn\'t reassign styleSheet.cssText.');
- }
- }
- },
- currentScript: function (window) {
- var document = window.document;
- return document.currentScript || (function () {
- var scripts = document.getElementsByTagName('script');
- return scripts[scripts.length - 1];
- })();
- }
- };
-
- var addDefaultOptions = (function (window, options) {
- // use options from the current script tag data attribues
- addDataAttr(options, browser.currentScript(window));
- if (options.isFileProtocol === undefined) {
- options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);
- }
- // Load styles asynchronously (default: false)
- //
- // This is set to `false` by default, so that the body
- // doesn't start loading before the stylesheets are parsed.
- // Setting this to `true` can result in flickering.
- //
- options.async = options.async || false;
- options.fileAsync = options.fileAsync || false;
- // Interval between watch polls
- options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);
- options.env = options.env || (window.location.hostname == '127.0.0.1' ||
- window.location.hostname == '0.0.0.0' ||
- window.location.hostname == 'localhost' ||
- (window.location.port &&
- window.location.port.length > 0) ||
- options.isFileProtocol ? 'development'
- : 'production');
- var dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);
- if (dumpLineNumbers) {
- options.dumpLineNumbers = dumpLineNumbers[1];
- }
- if (options.useFileCache === undefined) {
- options.useFileCache = true;
- }
- if (options.onReady === undefined) {
- options.onReady = true;
- }
- if (options.relativeUrls) {
- options.rewriteUrls = 'all';
- }
- });
-
- var logger$1 = {
- error: function (msg) {
- this._fireEvent('error', msg);
- },
- warn: function (msg) {
- this._fireEvent('warn', msg);
- },
- info: function (msg) {
- this._fireEvent('info', msg);
- },
- debug: function (msg) {
- this._fireEvent('debug', msg);
- },
- addListener: function (listener) {
- this._listeners.push(listener);
- },
- removeListener: function (listener) {
- for (var i_1 = 0; i_1 < this._listeners.length; i_1++) {
- if (this._listeners[i_1] === listener) {
- this._listeners.splice(i_1, 1);
- return;
- }
- }
- },
- _fireEvent: function (type, msg) {
- for (var i_2 = 0; i_2 < this._listeners.length; i_2++) {
- var logFunction = this._listeners[i_2][type];
- if (logFunction) {
- logFunction(msg);
- }
- }
- },
- _listeners: []
- };
-
- /**
- * @todo Document why this abstraction exists, and the relationship between
- * environment, file managers, and plugin manager
- */
- var Environment = /** @class */ (function () {
- function Environment(externalEnvironment, fileManagers) {
- this.fileManagers = fileManagers || [];
- externalEnvironment = externalEnvironment || {};
- var optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];
- var requiredFunctions = [];
- var functions = requiredFunctions.concat(optionalFunctions);
- for (var i_1 = 0; i_1 < functions.length; i_1++) {
- var propName = functions[i_1];
- var environmentFunc = externalEnvironment[propName];
- if (environmentFunc) {
- this[propName] = environmentFunc.bind(externalEnvironment);
- }
- else if (i_1 < requiredFunctions.length) {
- this.warn("missing required function in environment - ".concat(propName));
- }
- }
- }
- Environment.prototype.getFileManager = function (filename, currentDirectory, options, environment, isSync) {
- if (!filename) {
- logger$1.warn('getFileManager called with no filename.. Please report this issue. continuing.');
- }
- if (currentDirectory === undefined) {
- logger$1.warn('getFileManager called with null directory.. Please report this issue. continuing.');
- }
- var fileManagers = this.fileManagers;
- if (options.pluginManager) {
- fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());
- }
- for (var i_2 = fileManagers.length - 1; i_2 >= 0; i_2--) {
- var fileManager = fileManagers[i_2];
- if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {
- return fileManager;
- }
- }
- return null;
- };
- Environment.prototype.addFileManager = function (fileManager) {
- this.fileManagers.push(fileManager);
- };
- Environment.prototype.clearFileManagers = function () {
- this.fileManagers = [];
- };
- return Environment;
- }());
-
- var colors = {
- 'aliceblue': '#f0f8ff',
- 'antiquewhite': '#faebd7',
- 'aqua': '#00ffff',
- 'aquamarine': '#7fffd4',
- 'azure': '#f0ffff',
- 'beige': '#f5f5dc',
- 'bisque': '#ffe4c4',
- 'black': '#000000',
- 'blanchedalmond': '#ffebcd',
- 'blue': '#0000ff',
- 'blueviolet': '#8a2be2',
- 'brown': '#a52a2a',
- 'burlywood': '#deb887',
- 'cadetblue': '#5f9ea0',
- 'chartreuse': '#7fff00',
- 'chocolate': '#d2691e',
- 'coral': '#ff7f50',
- 'cornflowerblue': '#6495ed',
- 'cornsilk': '#fff8dc',
- 'crimson': '#dc143c',
- 'cyan': '#00ffff',
- 'darkblue': '#00008b',
- 'darkcyan': '#008b8b',
- 'darkgoldenrod': '#b8860b',
- 'darkgray': '#a9a9a9',
- 'darkgrey': '#a9a9a9',
- 'darkgreen': '#006400',
- 'darkkhaki': '#bdb76b',
- 'darkmagenta': '#8b008b',
- 'darkolivegreen': '#556b2f',
- 'darkorange': '#ff8c00',
- 'darkorchid': '#9932cc',
- 'darkred': '#8b0000',
- 'darksalmon': '#e9967a',
- 'darkseagreen': '#8fbc8f',
- 'darkslateblue': '#483d8b',
- 'darkslategray': '#2f4f4f',
- 'darkslategrey': '#2f4f4f',
- 'darkturquoise': '#00ced1',
- 'darkviolet': '#9400d3',
- 'deeppink': '#ff1493',
- 'deepskyblue': '#00bfff',
- 'dimgray': '#696969',
- 'dimgrey': '#696969',
- 'dodgerblue': '#1e90ff',
- 'firebrick': '#b22222',
- 'floralwhite': '#fffaf0',
- 'forestgreen': '#228b22',
- 'fuchsia': '#ff00ff',
- 'gainsboro': '#dcdcdc',
- 'ghostwhite': '#f8f8ff',
- 'gold': '#ffd700',
- 'goldenrod': '#daa520',
- 'gray': '#808080',
- 'grey': '#808080',
- 'green': '#008000',
- 'greenyellow': '#adff2f',
- 'honeydew': '#f0fff0',
- 'hotpink': '#ff69b4',
- 'indianred': '#cd5c5c',
- 'indigo': '#4b0082',
- 'ivory': '#fffff0',
- 'khaki': '#f0e68c',
- 'lavender': '#e6e6fa',
- 'lavenderblush': '#fff0f5',
- 'lawngreen': '#7cfc00',
- 'lemonchiffon': '#fffacd',
- 'lightblue': '#add8e6',
- 'lightcoral': '#f08080',
- 'lightcyan': '#e0ffff',
- 'lightgoldenrodyellow': '#fafad2',
- 'lightgray': '#d3d3d3',
- 'lightgrey': '#d3d3d3',
- 'lightgreen': '#90ee90',
- 'lightpink': '#ffb6c1',
- 'lightsalmon': '#ffa07a',
- 'lightseagreen': '#20b2aa',
- 'lightskyblue': '#87cefa',
- 'lightslategray': '#778899',
- 'lightslategrey': '#778899',
- 'lightsteelblue': '#b0c4de',
- 'lightyellow': '#ffffe0',
- 'lime': '#00ff00',
- 'limegreen': '#32cd32',
- 'linen': '#faf0e6',
- 'magenta': '#ff00ff',
- 'maroon': '#800000',
- 'mediumaquamarine': '#66cdaa',
- 'mediumblue': '#0000cd',
- 'mediumorchid': '#ba55d3',
- 'mediumpurple': '#9370d8',
- 'mediumseagreen': '#3cb371',
- 'mediumslateblue': '#7b68ee',
- 'mediumspringgreen': '#00fa9a',
- 'mediumturquoise': '#48d1cc',
- 'mediumvioletred': '#c71585',
- 'midnightblue': '#191970',
- 'mintcream': '#f5fffa',
- 'mistyrose': '#ffe4e1',
- 'moccasin': '#ffe4b5',
- 'navajowhite': '#ffdead',
- 'navy': '#000080',
- 'oldlace': '#fdf5e6',
- 'olive': '#808000',
- 'olivedrab': '#6b8e23',
- 'orange': '#ffa500',
- 'orangered': '#ff4500',
- 'orchid': '#da70d6',
- 'palegoldenrod': '#eee8aa',
- 'palegreen': '#98fb98',
- 'paleturquoise': '#afeeee',
- 'palevioletred': '#d87093',
- 'papayawhip': '#ffefd5',
- 'peachpuff': '#ffdab9',
- 'peru': '#cd853f',
- 'pink': '#ffc0cb',
- 'plum': '#dda0dd',
- 'powderblue': '#b0e0e6',
- 'purple': '#800080',
- 'rebeccapurple': '#663399',
- 'red': '#ff0000',
- 'rosybrown': '#bc8f8f',
- 'royalblue': '#4169e1',
- 'saddlebrown': '#8b4513',
- 'salmon': '#fa8072',
- 'sandybrown': '#f4a460',
- 'seagreen': '#2e8b57',
- 'seashell': '#fff5ee',
- 'sienna': '#a0522d',
- 'silver': '#c0c0c0',
- 'skyblue': '#87ceeb',
- 'slateblue': '#6a5acd',
- 'slategray': '#708090',
- 'slategrey': '#708090',
- 'snow': '#fffafa',
- 'springgreen': '#00ff7f',
- 'steelblue': '#4682b4',
- 'tan': '#d2b48c',
- 'teal': '#008080',
- 'thistle': '#d8bfd8',
- 'tomato': '#ff6347',
- 'turquoise': '#40e0d0',
- 'violet': '#ee82ee',
- 'wheat': '#f5deb3',
- 'white': '#ffffff',
- 'whitesmoke': '#f5f5f5',
- 'yellow': '#ffff00',
- 'yellowgreen': '#9acd32'
- };
-
- var unitConversions = {
- length: {
- 'm': 1,
- 'cm': 0.01,
- 'mm': 0.001,
- 'in': 0.0254,
- 'px': 0.0254 / 96,
- 'pt': 0.0254 / 72,
- 'pc': 0.0254 / 72 * 12
- },
- duration: {
- 's': 1,
- 'ms': 0.001
- },
- angle: {
- 'rad': 1 / (2 * Math.PI),
- 'deg': 1 / 360,
- 'grad': 1 / 400,
- 'turn': 1
- }
- };
-
- var data = { colors: colors, unitConversions: unitConversions };
-
- /**
- * The reason why Node is a class and other nodes simply do not extend
- * from Node (since we're transpiling) is due to this issue:
- *
- * @see https://github.com/less/less.js/issues/3434
- */
- var Node = /** @class */ (function () {
- function Node() {
- this.parent = null;
- this.visibilityBlocks = undefined;
- this.nodeVisible = undefined;
- this.rootNode = null;
- this.parsed = null;
- }
- Object.defineProperty(Node.prototype, "currentFileInfo", {
- get: function () {
- return this.fileInfo();
- },
- enumerable: false,
- configurable: true
- });
- Object.defineProperty(Node.prototype, "index", {
- get: function () {
- return this.getIndex();
- },
- enumerable: false,
- configurable: true
- });
- Node.prototype.setParent = function (nodes, parent) {
- function set(node) {
- if (node && node instanceof Node) {
- node.parent = parent;
- }
- }
- if (Array.isArray(nodes)) {
- nodes.forEach(set);
- }
- else {
- set(nodes);
- }
- };
- Node.prototype.getIndex = function () {
- return this._index || (this.parent && this.parent.getIndex()) || 0;
- };
- Node.prototype.fileInfo = function () {
- return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};
- };
- Node.prototype.isRulesetLike = function () { return false; };
- Node.prototype.toCSS = function (context) {
- var strs = [];
- this.genCSS(context, {
- // remove when genCSS has JSDoc types
- // eslint-disable-next-line no-unused-vars
- add: function (chunk, fileInfo, index) {
- strs.push(chunk);
- },
- isEmpty: function () {
- return strs.length === 0;
- }
- });
- return strs.join('');
- };
- Node.prototype.genCSS = function (context, output) {
- output.add(this.value);
- };
- Node.prototype.accept = function (visitor) {
- this.value = visitor.visit(this.value);
- };
- Node.prototype.eval = function () { return this; };
- Node.prototype._operate = function (context, op, a, b) {
- switch (op) {
- case '+': return a + b;
- case '-': return a - b;
- case '*': return a * b;
- case '/': return a / b;
- }
- };
- Node.prototype.fround = function (context, value) {
- var precision = context && context.numPrecision;
- // add "epsilon" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:
- return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;
- };
- Node.compare = function (a, b) {
- /* returns:
- -1: a < b
- 0: a = b
- 1: a > b
- and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */
- if ((a.compare) &&
- // for "symmetric results" force toCSS-based comparison
- // of Quoted or Anonymous if either value is one of those
- !(b.type === 'Quoted' || b.type === 'Anonymous')) {
- return a.compare(b);
- }
- else if (b.compare) {
- return -b.compare(a);
- }
- else if (a.type !== b.type) {
- return undefined;
- }
- a = a.value;
- b = b.value;
- if (!Array.isArray(a)) {
- return a === b ? 0 : undefined;
- }
- if (a.length !== b.length) {
- return undefined;
- }
- for (var i_1 = 0; i_1 < a.length; i_1++) {
- if (Node.compare(a[i_1], b[i_1]) !== 0) {
- return undefined;
- }
- }
- return 0;
- };
- Node.numericCompare = function (a, b) {
- return a < b ? -1
- : a === b ? 0
- : a > b ? 1 : undefined;
- };
- // Returns true if this node represents root of ast imported by reference
- Node.prototype.blocksVisibility = function () {
- if (this.visibilityBlocks === undefined) {
- this.visibilityBlocks = 0;
- }
- return this.visibilityBlocks !== 0;
- };
- Node.prototype.addVisibilityBlock = function () {
- if (this.visibilityBlocks === undefined) {
- this.visibilityBlocks = 0;
- }
- this.visibilityBlocks = this.visibilityBlocks + 1;
- };
- Node.prototype.removeVisibilityBlock = function () {
- if (this.visibilityBlocks === undefined) {
- this.visibilityBlocks = 0;
- }
- this.visibilityBlocks = this.visibilityBlocks - 1;
- };
- // Turns on node visibility - if called node will be shown in output regardless
- // of whether it comes from import by reference or not
- Node.prototype.ensureVisibility = function () {
- this.nodeVisible = true;
- };
- // Turns off node visibility - if called node will NOT be shown in output regardless
- // of whether it comes from import by reference or not
- Node.prototype.ensureInvisibility = function () {
- this.nodeVisible = false;
- };
- // return values:
- // false - the node must not be visible
- // true - the node must be visible
- // undefined or null - the node has the same visibility as its parent
- Node.prototype.isVisible = function () {
- return this.nodeVisible;
- };
- Node.prototype.visibilityInfo = function () {
- return {
- visibilityBlocks: this.visibilityBlocks,
- nodeVisible: this.nodeVisible
- };
- };
- Node.prototype.copyVisibilityInfo = function (info) {
- if (!info) {
- return;
- }
- this.visibilityBlocks = info.visibilityBlocks;
- this.nodeVisible = info.nodeVisible;
- };
- return Node;
- }());
-
- //
- // RGB Colors - #ff0014, #eee
- //
- var Color = function (rgb, a, originalForm) {
- var self = this;
- //
- // The end goal here, is to parse the arguments
- // into an integer triplet, such as `128, 255, 0`
- //
- // This facilitates operations and conversions.
- //
- if (Array.isArray(rgb)) {
- this.rgb = rgb;
- }
- else if (rgb.length >= 6) {
- this.rgb = [];
- rgb.match(/.{2}/g).map(function (c, i) {
- if (i < 3) {
- self.rgb.push(parseInt(c, 16));
- }
- else {
- self.alpha = (parseInt(c, 16)) / 255;
- }
- });
- }
- else {
- this.rgb = [];
- rgb.split('').map(function (c, i) {
- if (i < 3) {
- self.rgb.push(parseInt(c + c, 16));
- }
- else {
- self.alpha = (parseInt(c + c, 16)) / 255;
- }
- });
- }
- this.alpha = this.alpha || (typeof a === 'number' ? a : 1);
- if (typeof originalForm !== 'undefined') {
- this.value = originalForm;
- }
- };
- Color.prototype = Object.assign(new Node(), {
- type: 'Color',
- luma: function () {
- var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;
- r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);
- g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);
- b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);
- return 0.2126 * r + 0.7152 * g + 0.0722 * b;
- },
- genCSS: function (context, output) {
- output.add(this.toCSS(context));
- },
- toCSS: function (context, doNotCompress) {
- var compress = context && context.compress && !doNotCompress;
- var color;
- var alpha;
- var colorFunction;
- var args = [];
- // `value` is set if this color was originally
- // converted from a named color string so we need
- // to respect this and try to output named color too.
- alpha = this.fround(context, this.alpha);
- if (this.value) {
- if (this.value.indexOf('rgb') === 0) {
- if (alpha < 1) {
- colorFunction = 'rgba';
- }
- }
- else if (this.value.indexOf('hsl') === 0) {
- if (alpha < 1) {
- colorFunction = 'hsla';
- }
- else {
- colorFunction = 'hsl';
- }
- }
- else {
- return this.value;
- }
- }
- else {
- if (alpha < 1) {
- colorFunction = 'rgba';
- }
- }
- switch (colorFunction) {
- case 'rgba':
- args = this.rgb.map(function (c) {
- return clamp$1(Math.round(c), 255);
- }).concat(clamp$1(alpha, 1));
- break;
- case 'hsla':
- args.push(clamp$1(alpha, 1));
- // eslint-disable-next-line no-fallthrough
- case 'hsl':
- color = this.toHSL();
- args = [
- this.fround(context, color.h),
- "".concat(this.fround(context, color.s * 100), "%"),
- "".concat(this.fround(context, color.l * 100), "%")
- ].concat(args);
- }
- if (colorFunction) {
- // Values are capped between `0` and `255`, rounded and zero-padded.
- return "".concat(colorFunction, "(").concat(args.join(",".concat(compress ? '' : ' ')), ")");
- }
- color = this.toRGB();
- if (compress) {
- var splitcolor = color.split('');
- // Convert color to short format
- if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {
- color = "#".concat(splitcolor[1]).concat(splitcolor[3]).concat(splitcolor[5]);
- }
- }
- return color;
- },
- //
- // Operations have to be done per-channel, if not,
- // channels will spill onto each other. Once we have
- // our result, in the form of an integer triplet,
- // we create a new Color node to hold the result.
- //
- operate: function (context, op, other) {
- var rgb = new Array(3);
- var alpha = this.alpha * (1 - other.alpha) + other.alpha;
- for (var c = 0; c < 3; c++) {
- rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);
- }
- return new Color(rgb, alpha);
- },
- toRGB: function () {
- return toHex(this.rgb);
- },
- toHSL: function () {
- var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;
- var max = Math.max(r, g, b), min = Math.min(r, g, b);
- var h;
- var s;
- var l = (max + min) / 2;
- var d = max - min;
- if (max === min) {
- h = s = 0;
- }
- else {
- s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
- switch (max) {
- case r:
- h = (g - b) / d + (g < b ? 6 : 0);
- break;
- case g:
- h = (b - r) / d + 2;
- break;
- case b:
- h = (r - g) / d + 4;
- break;
- }
- h /= 6;
- }
- return { h: h * 360, s: s, l: l, a: a };
- },
- // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
- toHSV: function () {
- var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;
- var max = Math.max(r, g, b), min = Math.min(r, g, b);
- var h;
- var s;
- var v = max;
- var d = max - min;
- if (max === 0) {
- s = 0;
- }
- else {
- s = d / max;
- }
- if (max === min) {
- h = 0;
- }
- else {
- switch (max) {
- case r:
- h = (g - b) / d + (g < b ? 6 : 0);
- break;
- case g:
- h = (b - r) / d + 2;
- break;
- case b:
- h = (r - g) / d + 4;
- break;
- }
- h /= 6;
- }
- return { h: h * 360, s: s, v: v, a: a };
- },
- toARGB: function () {
- return toHex([this.alpha * 255].concat(this.rgb));
- },
- compare: function (x) {
- return (x.rgb &&
- x.rgb[0] === this.rgb[0] &&
- x.rgb[1] === this.rgb[1] &&
- x.rgb[2] === this.rgb[2] &&
- x.alpha === this.alpha) ? 0 : undefined;
- }
- });
- Color.fromKeyword = function (keyword) {
- var c;
- var key = keyword.toLowerCase();
- // eslint-disable-next-line no-prototype-builtins
- if (colors.hasOwnProperty(key)) {
- c = new Color(colors[key].slice(1));
- }
- else if (key === 'transparent') {
- c = new Color([0, 0, 0], 0);
- }
- if (c) {
- c.value = keyword;
- return c;
- }
- };
- function clamp$1(v, max) {
- return Math.min(Math.max(v, 0), max);
- }
- function toHex(v) {
- return "#".concat(v.map(function (c) {
- c = clamp$1(Math.round(c), 255);
- return (c < 16 ? '0' : '') + c.toString(16);
- }).join(''));
- }
-
- /******************************************************************************
- Copyright (c) Microsoft Corporation.
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
-
- var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
-
- function __spreadArray(to, from, pack) {
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
- if (ar || !(i in from)) {
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
- ar[i] = from[i];
- }
- }
- return to.concat(ar || Array.prototype.slice.call(from));
- }
-
- typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
- var e = new Error(message);
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
- };
-
- var Paren = function (node) {
- this.value = node;
- };
- Paren.prototype = Object.assign(new Node(), {
- type: 'Paren',
- genCSS: function (context, output) {
- output.add('(');
- this.value.genCSS(context, output);
- output.add(')');
- },
- eval: function (context) {
- var paren = new Paren(this.value.eval(context));
- if (this.noSpacing) {
- paren.noSpacing = true;
- }
- return paren;
- }
- });
-
- var _noSpaceCombinators = {
- '': true,
- ' ': true,
- '|': true
- };
- var Combinator = function (value) {
- if (value === ' ') {
- this.value = ' ';
- this.emptyOrWhitespace = true;
- }
- else {
- this.value = value ? value.trim() : '';
- this.emptyOrWhitespace = this.value === '';
- }
- };
- Combinator.prototype = Object.assign(new Node(), {
- type: 'Combinator',
- genCSS: function (context, output) {
- var spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';
- output.add(spaceOrEmpty + this.value + spaceOrEmpty);
- }
- });
-
- var Element = function (combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {
- this.combinator = combinator instanceof Combinator ?
- combinator : new Combinator(combinator);
- if (typeof value === 'string') {
- this.value = value.trim();
- }
- else if (value) {
- this.value = value;
- }
- else {
- this.value = '';
- }
- this.isVariable = isVariable;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.copyVisibilityInfo(visibilityInfo);
- this.setParent(this.combinator, this);
- };
- Element.prototype = Object.assign(new Node(), {
- type: 'Element',
- accept: function (visitor) {
- var value = this.value;
- this.combinator = visitor.visit(this.combinator);
- if (typeof value === 'object') {
- this.value = visitor.visit(value);
- }
- },
- eval: function (context) {
- return new Element(this.combinator, this.value.eval ? this.value.eval(context) : this.value, this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo());
- },
- clone: function () {
- return new Element(this.combinator, this.value, this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo());
- },
- genCSS: function (context, output) {
- output.add(this.toCSS(context), this.fileInfo(), this.getIndex());
- },
- toCSS: function (context) {
- context = context || {};
- var value = this.value;
- var firstSelector = context.firstSelector;
- if (value instanceof Paren) {
- // selector in parens should not be affected by outer selector
- // flags (breaks only interpolated selectors - see #1973)
- context.firstSelector = true;
- }
- value = value.toCSS ? value.toCSS(context) : value;
- context.firstSelector = firstSelector;
- if (value === '' && this.combinator.value.charAt(0) === '&') {
- return '';
- }
- else {
- return this.combinator.toCSS(context) + value;
- }
- }
- });
-
- var Math$1 = {
- ALWAYS: 0,
- PARENS_DIVISION: 1,
- PARENS: 2
- // removed - STRICT_LEGACY: 3
- };
- var RewriteUrls = {
- OFF: 0,
- LOCAL: 1,
- ALL: 2
- };
-
- /**
- * Returns the object type of the given payload
- *
- * @param {*} payload
- * @returns {string}
- */
- function getType(payload) {
- return Object.prototype.toString.call(payload).slice(8, -1);
- }
- /**
- * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)
- *
- * @param {*} payload
- * @returns {payload is PlainObject}
- */
- function isPlainObject(payload) {
- if (getType(payload) !== 'Object')
- return false;
- return payload.constructor === Object && Object.getPrototypeOf(payload) === Object.prototype;
- }
- /**
- * Returns whether the payload is an array
- *
- * @param {any} payload
- * @returns {payload is any[]}
- */
- function isArray(payload) {
- return getType(payload) === 'Array';
- }
-
- function assignProp(carry, key, newVal, originalObject, includeNonenumerable) {
- const propType = {}.propertyIsEnumerable.call(originalObject, key)
- ? 'enumerable'
- : 'nonenumerable';
- if (propType === 'enumerable')
- carry[key] = newVal;
- if (includeNonenumerable && propType === 'nonenumerable') {
- Object.defineProperty(carry, key, {
- value: newVal,
- enumerable: false,
- writable: true,
- configurable: true,
- });
- }
- }
- /**
- * Copy (clone) an object and all its props recursively to get rid of any prop referenced of the original object. Arrays are also cloned, however objects inside arrays are still linked.
- *
- * @export
- * @template T
- * @param {T} target Target can be anything
- * @param {Options} [options = {}] Options can be `props` or `nonenumerable`
- * @returns {T} the target with replaced values
- * @export
- */
- function copy(target, options = {}) {
- if (isArray(target)) {
- return target.map((item) => copy(item, options));
- }
- if (!isPlainObject(target)) {
- return target;
- }
- const props = Object.getOwnPropertyNames(target);
- const symbols = Object.getOwnPropertySymbols(target);
- return [...props, ...symbols].reduce((carry, key) => {
- if (isArray(options.props) && !options.props.includes(key)) {
- return carry;
- }
- const val = target[key];
- const newVal = copy(val, options);
- assignProp(carry, key, newVal, target, options.nonenumerable);
- return carry;
- }, {});
- }
-
- /* jshint proto: true */
- function getLocation(index, inputStream) {
- var n = index + 1;
- var line = null;
- var column = -1;
- while (--n >= 0 && inputStream.charAt(n) !== '\n') {
- column++;
- }
- if (typeof index === 'number') {
- line = (inputStream.slice(0, index).match(/\n/g) || '').length;
- }
- return {
- line: line,
- column: column
- };
- }
- function copyArray(arr) {
- var i;
- var length = arr.length;
- var copy = new Array(length);
- for (i = 0; i < length; i++) {
- copy[i] = arr[i];
- }
- return copy;
- }
- function clone(obj) {
- var cloned = {};
- for (var prop in obj) {
- if (Object.prototype.hasOwnProperty.call(obj, prop)) {
- cloned[prop] = obj[prop];
- }
- }
- return cloned;
- }
- function defaults(obj1, obj2) {
- var newObj = obj2 || {};
- if (!obj2._defaults) {
- newObj = {};
- var defaults_1 = copy(obj1);
- newObj._defaults = defaults_1;
- var cloned = obj2 ? copy(obj2) : {};
- Object.assign(newObj, defaults_1, cloned);
- }
- return newObj;
- }
- function copyOptions(obj1, obj2) {
- if (obj2 && obj2._defaults) {
- return obj2;
- }
- var opts = defaults(obj1, obj2);
- if (opts.strictMath) {
- opts.math = Math$1.PARENS;
- }
- // Back compat with changed relativeUrls option
- if (opts.relativeUrls) {
- opts.rewriteUrls = RewriteUrls.ALL;
- }
- if (typeof opts.math === 'string') {
- switch (opts.math.toLowerCase()) {
- case 'always':
- opts.math = Math$1.ALWAYS;
- break;
- case 'parens-division':
- opts.math = Math$1.PARENS_DIVISION;
- break;
- case 'strict':
- case 'parens':
- opts.math = Math$1.PARENS;
- break;
- default:
- opts.math = Math$1.PARENS;
- }
- }
- if (typeof opts.rewriteUrls === 'string') {
- switch (opts.rewriteUrls.toLowerCase()) {
- case 'off':
- opts.rewriteUrls = RewriteUrls.OFF;
- break;
- case 'local':
- opts.rewriteUrls = RewriteUrls.LOCAL;
- break;
- case 'all':
- opts.rewriteUrls = RewriteUrls.ALL;
- break;
- }
- }
- return opts;
- }
- function merge(obj1, obj2) {
- for (var prop in obj2) {
- if (Object.prototype.hasOwnProperty.call(obj2, prop)) {
- obj1[prop] = obj2[prop];
- }
- }
- return obj1;
- }
- function flattenArray(arr, result) {
- if (result === void 0) { result = []; }
- for (var i_1 = 0, length_1 = arr.length; i_1 < length_1; i_1++) {
- var value = arr[i_1];
- if (Array.isArray(value)) {
- flattenArray(value, result);
- }
- else {
- if (value !== undefined) {
- result.push(value);
- }
- }
- }
- return result;
- }
- function isNullOrUndefined(val) {
- return val === null || val === undefined;
- }
-
- var utils = /*#__PURE__*/Object.freeze({
- __proto__: null,
- getLocation: getLocation,
- copyArray: copyArray,
- clone: clone,
- defaults: defaults,
- copyOptions: copyOptions,
- merge: merge,
- flattenArray: flattenArray,
- isNullOrUndefined: isNullOrUndefined
- });
-
- var anonymousFunc = /(|Function):(\d+):(\d+)/;
- /**
- * This is a centralized class of any error that could be thrown internally (mostly by the parser).
- * Besides standard .message it keeps some additional data like a path to the file where the error
- * occurred along with line and column numbers.
- *
- * @class
- * @extends Error
- * @type {module.LessError}
- *
- * @prop {string} type
- * @prop {string} filename
- * @prop {number} index
- * @prop {number} line
- * @prop {number} column
- * @prop {number} callLine
- * @prop {number} callExtract
- * @prop {string[]} extract
- *
- * @param {Object} e - An error object to wrap around or just a descriptive object
- * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?
- * @param {string} [currentFilename]
- */
- var LessError = function (e, fileContentMap, currentFilename) {
- Error.call(this);
- var filename = e.filename || currentFilename;
- this.message = e.message;
- this.stack = e.stack;
- if (fileContentMap && filename) {
- var input = fileContentMap.contents[filename];
- var loc = getLocation(e.index, input);
- var line = loc.line;
- var col = loc.column;
- var callLine = e.call && getLocation(e.call, input).line;
- var lines = input ? input.split('\n') : '';
- this.type = e.type || 'Syntax';
- this.filename = filename;
- this.index = e.index;
- this.line = typeof line === 'number' ? line + 1 : null;
- this.column = col;
- if (!this.line && this.stack) {
- var found = this.stack.match(anonymousFunc);
- /**
- * We have to figure out how this environment stringifies anonymous functions
- * so we can correctly map plugin errors.
- *
- * Note, in Node 8, the output of anonymous funcs varied based on parameters
- * being present or not, so we inject dummy params.
- */
- var func = new Function('a', 'throw new Error()');
- var lineAdjust = 0;
- try {
- func();
- }
- catch (e) {
- var match = e.stack.match(anonymousFunc);
- lineAdjust = 1 - parseInt(match[2]);
- }
- if (found) {
- if (found[2]) {
- this.line = parseInt(found[2]) + lineAdjust;
- }
- if (found[3]) {
- this.column = parseInt(found[3]);
- }
- }
- }
- this.callLine = callLine + 1;
- this.callExtract = lines[callLine];
- this.extract = [
- lines[this.line - 2],
- lines[this.line - 1],
- lines[this.line]
- ];
- }
- };
- if (typeof Object.create === 'undefined') {
- var F = function () { };
- F.prototype = Error.prototype;
- LessError.prototype = new F();
- }
- else {
- LessError.prototype = Object.create(Error.prototype);
- }
- LessError.prototype.constructor = LessError;
- /**
- * An overridden version of the default Object.prototype.toString
- * which uses additional information to create a helpful message.
- *
- * @param {Object} options
- * @returns {string}
- */
- LessError.prototype.toString = function (options) {
- var _a;
- options = options || {};
- var isWarning = ((_a = this.type) !== null && _a !== void 0 ? _a : '').toLowerCase().includes('warning');
- var type = isWarning ? this.type : "".concat(this.type, "Error");
- var color = isWarning ? 'yellow' : 'red';
- var message = '';
- var extract = this.extract || [];
- var error = [];
- var stylize = function (str) { return str; };
- if (options.stylize) {
- var type_1 = typeof options.stylize;
- if (type_1 !== 'function') {
- throw Error("options.stylize should be a function, got a ".concat(type_1, "!"));
- }
- stylize = options.stylize;
- }
- if (this.line !== null) {
- if (!isWarning && typeof extract[0] === 'string') {
- error.push(stylize("".concat(this.line - 1, " ").concat(extract[0]), 'grey'));
- }
- if (typeof extract[1] === 'string') {
- var errorTxt = "".concat(this.line, " ");
- if (extract[1]) {
- errorTxt += extract[1].slice(0, this.column) +
- stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +
- extract[1].slice(this.column + 1), 'red'), 'inverse');
- }
- error.push(errorTxt);
- }
- if (!isWarning && typeof extract[2] === 'string') {
- error.push(stylize("".concat(this.line + 1, " ").concat(extract[2]), 'grey'));
- }
- error = "".concat(error.join('\n') + stylize('', 'reset'), "\n");
- }
- message += stylize("".concat(type, ": ").concat(this.message), color);
- if (this.filename) {
- message += stylize(' in ', color) + this.filename;
- }
- if (this.line) {
- message += stylize(" on line ".concat(this.line, ", column ").concat(this.column + 1, ":"), 'grey');
- }
- message += "\n".concat(error);
- if (this.callLine) {
- message += "".concat(stylize('from ', color) + (this.filename || ''), "/n");
- message += "".concat(stylize(this.callLine, 'grey'), " ").concat(this.callExtract, "/n");
- }
- return message;
- };
-
- var _visitArgs = { visitDeeper: true };
- var _hasIndexed = false;
- function _noop(node) {
- return node;
- }
- function indexNodeTypes(parent, ticker) {
- // add .typeIndex to tree node types for lookup table
- var key, child;
- for (key in parent) {
- /* eslint guard-for-in: 0 */
- child = parent[key];
- switch (typeof child) {
- case 'function':
- // ignore bound functions directly on tree which do not have a prototype
- // or aren't nodes
- if (child.prototype && child.prototype.type) {
- child.prototype.typeIndex = ticker++;
- }
- break;
- case 'object':
- ticker = indexNodeTypes(child, ticker);
- break;
- }
- }
- return ticker;
- }
- var Visitor = /** @class */ (function () {
- function Visitor(implementation) {
- this._implementation = implementation;
- this._visitInCache = {};
- this._visitOutCache = {};
- if (!_hasIndexed) {
- indexNodeTypes(tree, 1);
- _hasIndexed = true;
- }
- }
- Visitor.prototype.visit = function (node) {
- if (!node) {
- return node;
- }
- var nodeTypeIndex = node.typeIndex;
- if (!nodeTypeIndex) {
- // MixinCall args aren't a node type?
- if (node.value && node.value.typeIndex) {
- this.visit(node.value);
- }
- return node;
- }
- var impl = this._implementation;
- var func = this._visitInCache[nodeTypeIndex];
- var funcOut = this._visitOutCache[nodeTypeIndex];
- var visitArgs = _visitArgs;
- var fnName;
- visitArgs.visitDeeper = true;
- if (!func) {
- fnName = "visit".concat(node.type);
- func = impl[fnName] || _noop;
- funcOut = impl["".concat(fnName, "Out")] || _noop;
- this._visitInCache[nodeTypeIndex] = func;
- this._visitOutCache[nodeTypeIndex] = funcOut;
- }
- if (func !== _noop) {
- var newNode = func.call(impl, node, visitArgs);
- if (node && impl.isReplacing) {
- node = newNode;
- }
- }
- if (visitArgs.visitDeeper && node) {
- if (node.length) {
- for (var i_1 = 0, cnt = node.length; i_1 < cnt; i_1++) {
- if (node[i_1].accept) {
- node[i_1].accept(this);
- }
- }
- }
- else if (node.accept) {
- node.accept(this);
- }
- }
- if (funcOut != _noop) {
- funcOut.call(impl, node);
- }
- return node;
- };
- Visitor.prototype.visitArray = function (nodes, nonReplacing) {
- if (!nodes) {
- return nodes;
- }
- var cnt = nodes.length;
- var i;
- // Non-replacing
- if (nonReplacing || !this._implementation.isReplacing) {
- for (i = 0; i < cnt; i++) {
- this.visit(nodes[i]);
- }
- return nodes;
- }
- // Replacing
- var out = [];
- for (i = 0; i < cnt; i++) {
- var evald = this.visit(nodes[i]);
- if (evald === undefined) {
- continue;
- }
- if (!evald.splice) {
- out.push(evald);
- }
- else if (evald.length) {
- this.flatten(evald, out);
- }
- }
- return out;
- };
- Visitor.prototype.flatten = function (arr, out) {
- if (!out) {
- out = [];
- }
- var cnt, i, item, nestedCnt, j, nestedItem;
- for (i = 0, cnt = arr.length; i < cnt; i++) {
- item = arr[i];
- if (item === undefined) {
- continue;
- }
- if (!item.splice) {
- out.push(item);
- continue;
- }
- for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {
- nestedItem = item[j];
- if (nestedItem === undefined) {
- continue;
- }
- if (!nestedItem.splice) {
- out.push(nestedItem);
- }
- else if (nestedItem.length) {
- this.flatten(nestedItem, out);
- }
- }
- }
- return out;
- };
- return Visitor;
- }());
-
- var contexts = {};
- var copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {
- if (!original) {
- return;
- }
- for (var i_1 = 0; i_1 < propertiesToCopy.length; i_1++) {
- if (Object.prototype.hasOwnProperty.call(original, propertiesToCopy[i_1])) {
- destination[propertiesToCopy[i_1]] = original[propertiesToCopy[i_1]];
- }
- }
- };
- /*
- parse is used whilst parsing
- */
- var parseCopyProperties = [
- // options
- 'paths',
- 'rewriteUrls',
- 'rootpath',
- 'strictImports',
- 'insecure',
- 'dumpLineNumbers',
- 'compress',
- 'syncImport',
- 'chunkInput',
- 'mime',
- 'useFileCache',
- // context
- 'processImports',
- // Used by the import manager to stop multiple import visitors being created.
- 'pluginManager',
- 'quiet', // option - whether to log warnings
- ];
- contexts.Parse = function (options) {
- copyFromOriginal(options, this, parseCopyProperties);
- if (typeof this.paths === 'string') {
- this.paths = [this.paths];
- }
- };
- var evalCopyProperties = [
- 'paths',
- 'compress',
- 'math',
- 'strictUnits',
- 'sourceMap',
- 'importMultiple',
- 'urlArgs',
- 'javascriptEnabled',
- 'pluginManager',
- 'importantScope',
- 'rewriteUrls' // option - whether to adjust URL's to be relative
- ];
- contexts.Eval = function (options, frames) {
- copyFromOriginal(options, this, evalCopyProperties);
- if (typeof this.paths === 'string') {
- this.paths = [this.paths];
- }
- this.frames = frames || [];
- this.importantScope = this.importantScope || [];
- };
- contexts.Eval.prototype.enterCalc = function () {
- if (!this.calcStack) {
- this.calcStack = [];
- }
- this.calcStack.push(true);
- this.inCalc = true;
- };
- contexts.Eval.prototype.exitCalc = function () {
- this.calcStack.pop();
- if (!this.calcStack.length) {
- this.inCalc = false;
- }
- };
- contexts.Eval.prototype.inParenthesis = function () {
- if (!this.parensStack) {
- this.parensStack = [];
- }
- this.parensStack.push(true);
- };
- contexts.Eval.prototype.outOfParenthesis = function () {
- this.parensStack.pop();
- };
- contexts.Eval.prototype.inCalc = false;
- contexts.Eval.prototype.mathOn = true;
- contexts.Eval.prototype.isMathOn = function (op) {
- if (!this.mathOn) {
- return false;
- }
- if (op === '/' && this.math !== Math$1.ALWAYS && (!this.parensStack || !this.parensStack.length)) {
- return false;
- }
- if (this.math > Math$1.PARENS_DIVISION) {
- return this.parensStack && this.parensStack.length;
- }
- return true;
- };
- contexts.Eval.prototype.pathRequiresRewrite = function (path) {
- var isRelative = this.rewriteUrls === RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;
- return isRelative(path);
- };
- contexts.Eval.prototype.rewritePath = function (path, rootpath) {
- var newPath;
- rootpath = rootpath || '';
- newPath = this.normalizePath(rootpath + path);
- // If a path was explicit relative and the rootpath was not an absolute path
- // we must ensure that the new path is also explicit relative.
- if (isPathLocalRelative(path) &&
- isPathRelative(rootpath) &&
- isPathLocalRelative(newPath) === false) {
- newPath = "./".concat(newPath);
- }
- return newPath;
- };
- contexts.Eval.prototype.normalizePath = function (path) {
- var segments = path.split('/').reverse();
- var segment;
- path = [];
- while (segments.length !== 0) {
- segment = segments.pop();
- switch (segment) {
- case '.':
- break;
- case '..':
- if ((path.length === 0) || (path[path.length - 1] === '..')) {
- path.push(segment);
- }
- else {
- path.pop();
- }
- break;
- default:
- path.push(segment);
- break;
- }
- }
- return path.join('/');
- };
- function isPathRelative(path) {
- return !/^(?:[a-z-]+:|\/|#)/i.test(path);
- }
- function isPathLocalRelative(path) {
- return path.charAt(0) === '.';
- }
- // todo - do the same for the toCSS ?
-
- var ImportSequencer = /** @class */ (function () {
- function ImportSequencer(onSequencerEmpty) {
- this.imports = [];
- this.variableImports = [];
- this._onSequencerEmpty = onSequencerEmpty;
- this._currentDepth = 0;
- }
- ImportSequencer.prototype.addImport = function (callback) {
- var importSequencer = this, importItem = {
- callback: callback,
- args: null,
- isReady: false
- };
- this.imports.push(importItem);
- return function () {
- importItem.args = Array.prototype.slice.call(arguments, 0);
- importItem.isReady = true;
- importSequencer.tryRun();
- };
- };
- ImportSequencer.prototype.addVariableImport = function (callback) {
- this.variableImports.push(callback);
- };
- ImportSequencer.prototype.tryRun = function () {
- this._currentDepth++;
- try {
- while (true) {
- while (this.imports.length > 0) {
- var importItem = this.imports[0];
- if (!importItem.isReady) {
- return;
- }
- this.imports = this.imports.slice(1);
- importItem.callback.apply(null, importItem.args);
- }
- if (this.variableImports.length === 0) {
- break;
- }
- var variableImport = this.variableImports[0];
- this.variableImports = this.variableImports.slice(1);
- variableImport();
- }
- }
- finally {
- this._currentDepth--;
- }
- if (this._currentDepth === 0 && this._onSequencerEmpty) {
- this._onSequencerEmpty();
- }
- };
- return ImportSequencer;
- }());
-
- /* eslint-disable no-unused-vars */
- var ImportVisitor = function (importer, finish) {
- this._visitor = new Visitor(this);
- this._importer = importer;
- this._finish = finish;
- this.context = new contexts.Eval();
- this.importCount = 0;
- this.onceFileDetectionMap = {};
- this.recursionDetector = {};
- this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));
- };
- ImportVisitor.prototype = {
- isReplacing: false,
- run: function (root) {
- try {
- // process the contents
- this._visitor.visit(root);
- }
- catch (e) {
- this.error = e;
- }
- this.isFinished = true;
- this._sequencer.tryRun();
- },
- _onSequencerEmpty: function () {
- if (!this.isFinished) {
- return;
- }
- this._finish(this.error);
- },
- visitImport: function (importNode, visitArgs) {
- var inlineCSS = importNode.options.inline;
- if (!importNode.css || inlineCSS) {
- var context = new contexts.Eval(this.context, copyArray(this.context.frames));
- var importParent = context.frames[0];
- this.importCount++;
- if (importNode.isVariableImport()) {
- this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));
- }
- else {
- this.processImportNode(importNode, context, importParent);
- }
- }
- visitArgs.visitDeeper = false;
- },
- processImportNode: function (importNode, context, importParent) {
- var evaldImportNode;
- var inlineCSS = importNode.options.inline;
- try {
- evaldImportNode = importNode.evalForImport(context);
- }
- catch (e) {
- if (!e.filename) {
- e.index = importNode.getIndex();
- e.filename = importNode.fileInfo().filename;
- }
- // attempt to eval properly and treat as css
- importNode.css = true;
- // if that fails, this error will be thrown
- importNode.error = e;
- }
- if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {
- if (evaldImportNode.options.multiple) {
- context.importMultiple = true;
- }
- // try appending if we haven't determined if it is css or not
- var tryAppendLessExtension = evaldImportNode.css === undefined;
- for (var i_1 = 0; i_1 < importParent.rules.length; i_1++) {
- if (importParent.rules[i_1] === importNode) {
- importParent.rules[i_1] = evaldImportNode;
- break;
- }
- }
- var onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);
- this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(), evaldImportNode.options, sequencedOnImported);
- }
- else {
- this.importCount--;
- if (this.isFinished) {
- this._sequencer.tryRun();
- }
- }
- },
- onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {
- if (e) {
- if (!e.filename) {
- e.index = importNode.getIndex();
- e.filename = importNode.fileInfo().filename;
- }
- this.error = e;
- }
- var importVisitor = this, inlineCSS = importNode.options.inline, isPlugin = importNode.options.isPlugin, isOptional = importNode.options.optional, duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;
- if (!context.importMultiple) {
- if (duplicateImport) {
- importNode.skip = true;
- }
- else {
- importNode.skip = function () {
- if (fullPath in importVisitor.onceFileDetectionMap) {
- return true;
- }
- importVisitor.onceFileDetectionMap[fullPath] = true;
- return false;
- };
- }
- }
- if (!fullPath && isOptional) {
- importNode.skip = true;
- }
- if (root) {
- importNode.root = root;
- importNode.importedFilename = fullPath;
- if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {
- importVisitor.recursionDetector[fullPath] = true;
- var oldContext = this.context;
- this.context = context;
- try {
- this._visitor.visit(root);
- }
- catch (e) {
- this.error = e;
- }
- this.context = oldContext;
- }
- }
- importVisitor.importCount--;
- if (importVisitor.isFinished) {
- importVisitor._sequencer.tryRun();
- }
- },
- visitDeclaration: function (declNode, visitArgs) {
- if (declNode.value.type === 'DetachedRuleset') {
- this.context.frames.unshift(declNode);
- }
- else {
- visitArgs.visitDeeper = false;
- }
- },
- visitDeclarationOut: function (declNode) {
- if (declNode.value.type === 'DetachedRuleset') {
- this.context.frames.shift();
- }
- },
- visitAtRule: function (atRuleNode, visitArgs) {
- if (atRuleNode.value) {
- this.context.frames.unshift(atRuleNode);
- }
- else if (atRuleNode.declarations && atRuleNode.declarations.length) {
- if (atRuleNode.isRooted) {
- this.context.frames.unshift(atRuleNode);
- }
- else {
- this.context.frames.unshift(atRuleNode.declarations[0]);
- }
- }
- else if (atRuleNode.rules && atRuleNode.rules.length) {
- this.context.frames.unshift(atRuleNode);
- }
- },
- visitAtRuleOut: function (atRuleNode) {
- this.context.frames.shift();
- },
- visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {
- this.context.frames.unshift(mixinDefinitionNode);
- },
- visitMixinDefinitionOut: function (mixinDefinitionNode) {
- this.context.frames.shift();
- },
- visitRuleset: function (rulesetNode, visitArgs) {
- this.context.frames.unshift(rulesetNode);
- },
- visitRulesetOut: function (rulesetNode) {
- this.context.frames.shift();
- },
- visitMedia: function (mediaNode, visitArgs) {
- this.context.frames.unshift(mediaNode.rules[0]);
- },
- visitMediaOut: function (mediaNode) {
- this.context.frames.shift();
- }
- };
-
- var SetTreeVisibilityVisitor = /** @class */ (function () {
- function SetTreeVisibilityVisitor(visible) {
- this.visible = visible;
- }
- SetTreeVisibilityVisitor.prototype.run = function (root) {
- this.visit(root);
- };
- SetTreeVisibilityVisitor.prototype.visitArray = function (nodes) {
- if (!nodes) {
- return nodes;
- }
- var cnt = nodes.length;
- var i;
- for (i = 0; i < cnt; i++) {
- this.visit(nodes[i]);
- }
- return nodes;
- };
- SetTreeVisibilityVisitor.prototype.visit = function (node) {
- if (!node) {
- return node;
- }
- if (node.constructor === Array) {
- return this.visitArray(node);
- }
- if (!node.blocksVisibility || node.blocksVisibility()) {
- return node;
- }
- if (this.visible) {
- node.ensureVisibility();
- }
- else {
- node.ensureInvisibility();
- }
- node.accept(this);
- return node;
- };
- return SetTreeVisibilityVisitor;
- }());
-
- /* eslint-disable no-unused-vars */
- /* jshint loopfunc:true */
- var ExtendFinderVisitor = /** @class */ (function () {
- function ExtendFinderVisitor() {
- this._visitor = new Visitor(this);
- this.contexts = [];
- this.allExtendsStack = [[]];
- }
- ExtendFinderVisitor.prototype.run = function (root) {
- root = this._visitor.visit(root);
- root.allExtends = this.allExtendsStack[0];
- return root;
- };
- ExtendFinderVisitor.prototype.visitDeclaration = function (declNode, visitArgs) {
- visitArgs.visitDeeper = false;
- };
- ExtendFinderVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) {
- visitArgs.visitDeeper = false;
- };
- ExtendFinderVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) {
- if (rulesetNode.root) {
- return;
- }
- var i;
- var j;
- var extend;
- var allSelectorsExtendList = [];
- var extendList;
- // get &:extend(.a); rules which apply to all selectors in this ruleset
- var rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;
- for (i = 0; i < ruleCnt; i++) {
- if (rulesetNode.rules[i] instanceof tree.Extend) {
- allSelectorsExtendList.push(rules[i]);
- rulesetNode.extendOnEveryPath = true;
- }
- }
- // now find every selector and apply the extends that apply to all extends
- // and the ones which apply to an individual extend
- var paths = rulesetNode.paths;
- for (i = 0; i < paths.length; i++) {
- var selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;
- extendList = selExtendList ? copyArray(selExtendList).concat(allSelectorsExtendList)
- : allSelectorsExtendList;
- if (extendList) {
- extendList = extendList.map(function (allSelectorsExtend) {
- return allSelectorsExtend.clone();
- });
- }
- for (j = 0; j < extendList.length; j++) {
- this.foundExtends = true;
- extend = extendList[j];
- extend.findSelfSelectors(selectorPath);
- extend.ruleset = rulesetNode;
- if (j === 0) {
- extend.firstExtendOnThisSelectorPath = true;
- }
- this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);
- }
- }
- this.contexts.push(rulesetNode.selectors);
- };
- ExtendFinderVisitor.prototype.visitRulesetOut = function (rulesetNode) {
- if (!rulesetNode.root) {
- this.contexts.length = this.contexts.length - 1;
- }
- };
- ExtendFinderVisitor.prototype.visitMedia = function (mediaNode, visitArgs) {
- mediaNode.allExtends = [];
- this.allExtendsStack.push(mediaNode.allExtends);
- };
- ExtendFinderVisitor.prototype.visitMediaOut = function (mediaNode) {
- this.allExtendsStack.length = this.allExtendsStack.length - 1;
- };
- ExtendFinderVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) {
- atRuleNode.allExtends = [];
- this.allExtendsStack.push(atRuleNode.allExtends);
- };
- ExtendFinderVisitor.prototype.visitAtRuleOut = function (atRuleNode) {
- this.allExtendsStack.length = this.allExtendsStack.length - 1;
- };
- return ExtendFinderVisitor;
- }());
- var ProcessExtendsVisitor = /** @class */ (function () {
- function ProcessExtendsVisitor() {
- this._visitor = new Visitor(this);
- }
- ProcessExtendsVisitor.prototype.run = function (root) {
- var extendFinder = new ExtendFinderVisitor();
- this.extendIndices = {};
- extendFinder.run(root);
- if (!extendFinder.foundExtends) {
- return root;
- }
- root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));
- this.allExtendsStack = [root.allExtends];
- var newRoot = this._visitor.visit(root);
- this.checkExtendsForNonMatched(root.allExtends);
- return newRoot;
- };
- ProcessExtendsVisitor.prototype.checkExtendsForNonMatched = function (extendList) {
- var indices = this.extendIndices;
- extendList.filter(function (extend) {
- return !extend.hasFoundMatches && extend.parent_ids.length == 1;
- }).forEach(function (extend) {
- var selector = '_unknown_';
- try {
- selector = extend.selector.toCSS({});
- }
- catch (_) { }
- if (!indices["".concat(extend.index, " ").concat(selector)]) {
- indices["".concat(extend.index, " ").concat(selector)] = true;
- /**
- * @todo Shouldn't this be an error? To alert the developer
- * that they may have made an error in the selector they are
- * targeting?
- */
- logger$1.warn("WARNING: extend '".concat(selector, "' has no matches"));
- }
- });
- };
- ProcessExtendsVisitor.prototype.doExtendChaining = function (extendsList, extendsListTarget, iterationCount) {
- //
- // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering
- // and pasting the selector we would do normally, but we are also adding an extend with the same target selector
- // this means this new extend can then go and alter other extends
- //
- // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors
- // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already
- // processed if we look at each selector at a time, as is done in visitRuleset
- var extendIndex;
- var targetExtendIndex;
- var matches;
- var extendsToAdd = [];
- var newSelector;
- var extendVisitor = this;
- var selectorPath;
- var extend;
- var targetExtend;
- var newExtend;
- iterationCount = iterationCount || 0;
- // loop through comparing every extend with every target extend.
- // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place
- // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one
- // and the second is the target.
- // the separation into two lists allows us to process a subset of chains with a bigger set, as is the
- // case when processing media queries
- for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {
- for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {
- extend = extendsList[extendIndex];
- targetExtend = extendsListTarget[targetExtendIndex];
- // look for circular references
- if (extend.parent_ids.indexOf(targetExtend.object_id) >= 0) {
- continue;
- }
- // find a match in the target extends self selector (the bit before :extend)
- selectorPath = [targetExtend.selfSelectors[0]];
- matches = extendVisitor.findMatch(extend, selectorPath);
- if (matches.length) {
- extend.hasFoundMatches = true;
- // we found a match, so for each self selector..
- extend.selfSelectors.forEach(function (selfSelector) {
- var info = targetExtend.visibilityInfo();
- // process the extend as usual
- newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());
- // but now we create a new extend from it
- newExtend = new (tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);
- newExtend.selfSelectors = newSelector;
- // add the extend onto the list of extends for that selector
- newSelector[newSelector.length - 1].extendList = [newExtend];
- // record that we need to add it.
- extendsToAdd.push(newExtend);
- newExtend.ruleset = targetExtend.ruleset;
- // remember its parents for circular references
- newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);
- // only process the selector once.. if we have :extend(.a,.b) then multiple
- // extends will look at the same selector path, so when extending
- // we know that any others will be duplicates in terms of what is added to the css
- if (targetExtend.firstExtendOnThisSelectorPath) {
- newExtend.firstExtendOnThisSelectorPath = true;
- targetExtend.ruleset.paths.push(newSelector);
- }
- });
- }
- }
- }
- if (extendsToAdd.length) {
- // try to detect circular references to stop a stack overflow.
- // may no longer be needed.
- this.extendChainCount++;
- if (iterationCount > 100) {
- var selectorOne = '{unable to calculate}';
- var selectorTwo = '{unable to calculate}';
- try {
- selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();
- selectorTwo = extendsToAdd[0].selector.toCSS();
- }
- catch (e) { }
- throw { message: "extend circular reference detected. One of the circular extends is currently:".concat(selectorOne, ":extend(").concat(selectorTwo, ")") };
- }
- // now process the new extends on the existing rules so that we can handle a extending b extending c extending
- // d extending e...
- return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));
- }
- else {
- return extendsToAdd;
- }
- };
- ProcessExtendsVisitor.prototype.visitDeclaration = function (ruleNode, visitArgs) {
- visitArgs.visitDeeper = false;
- };
- ProcessExtendsVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) {
- visitArgs.visitDeeper = false;
- };
- ProcessExtendsVisitor.prototype.visitSelector = function (selectorNode, visitArgs) {
- visitArgs.visitDeeper = false;
- };
- ProcessExtendsVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) {
- if (rulesetNode.root) {
- return;
- }
- var matches;
- var pathIndex;
- var extendIndex;
- var allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];
- var selectorsToAdd = [];
- var extendVisitor = this;
- var selectorPath;
- // look at each selector path in the ruleset, find any extend matches and then copy, find and replace
- for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {
- for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {
- selectorPath = rulesetNode.paths[pathIndex];
- // extending extends happens initially, before the main pass
- if (rulesetNode.extendOnEveryPath) {
- continue;
- }
- var extendList = selectorPath[selectorPath.length - 1].extendList;
- if (extendList && extendList.length) {
- continue;
- }
- matches = this.findMatch(allExtends[extendIndex], selectorPath);
- if (matches.length) {
- allExtends[extendIndex].hasFoundMatches = true;
- allExtends[extendIndex].selfSelectors.forEach(function (selfSelector) {
- var extendedSelectors;
- extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());
- selectorsToAdd.push(extendedSelectors);
- });
- }
- }
- }
- rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);
- };
- ProcessExtendsVisitor.prototype.findMatch = function (extend, haystackSelectorPath) {
- //
- // look through the haystack selector path to try and find the needle - extend.selector
- // returns an array of selector matches that can then be replaced
- //
- var haystackSelectorIndex;
- var hackstackSelector;
- var hackstackElementIndex;
- var haystackElement;
- var targetCombinator;
- var i;
- var extendVisitor = this;
- var needleElements = extend.selector.elements;
- var potentialMatches = [];
- var potentialMatch;
- var matches = [];
- // loop through the haystack elements
- for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {
- hackstackSelector = haystackSelectorPath[haystackSelectorIndex];
- for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {
- haystackElement = hackstackSelector.elements[hackstackElementIndex];
- // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.
- if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {
- potentialMatches.push({ pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,
- initialCombinator: haystackElement.combinator });
- }
- for (i = 0; i < potentialMatches.length; i++) {
- potentialMatch = potentialMatches[i];
- // selectors add " " onto the first element. When we use & it joins the selectors together, but if we don't
- // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to
- // work out what the resulting combinator will be
- targetCombinator = haystackElement.combinator.value;
- if (targetCombinator === '' && hackstackElementIndex === 0) {
- targetCombinator = ' ';
- }
- // if we don't match, null our match to indicate failure
- if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||
- (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {
- potentialMatch = null;
- }
- else {
- potentialMatch.matched++;
- }
- // if we are still valid and have finished, test whether we have elements after and whether these are allowed
- if (potentialMatch) {
- potentialMatch.finished = potentialMatch.matched === needleElements.length;
- if (potentialMatch.finished &&
- (!extend.allowAfter &&
- (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {
- potentialMatch = null;
- }
- }
- // if null we remove, if not, we are still valid, so either push as a valid match or continue
- if (potentialMatch) {
- if (potentialMatch.finished) {
- potentialMatch.length = needleElements.length;
- potentialMatch.endPathIndex = haystackSelectorIndex;
- potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match
- potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again
- matches.push(potentialMatch);
- }
- }
- else {
- potentialMatches.splice(i, 1);
- i--;
- }
- }
- }
- }
- return matches;
- };
- ProcessExtendsVisitor.prototype.isElementValuesEqual = function (elementValue1, elementValue2) {
- if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {
- return elementValue1 === elementValue2;
- }
- if (elementValue1 instanceof tree.Attribute) {
- if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {
- return false;
- }
- if (!elementValue1.value || !elementValue2.value) {
- if (elementValue1.value || elementValue2.value) {
- return false;
- }
- return true;
- }
- elementValue1 = elementValue1.value.value || elementValue1.value;
- elementValue2 = elementValue2.value.value || elementValue2.value;
- return elementValue1 === elementValue2;
- }
- elementValue1 = elementValue1.value;
- elementValue2 = elementValue2.value;
- if (elementValue1 instanceof tree.Selector) {
- if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {
- return false;
- }
- for (var i_1 = 0; i_1 < elementValue1.elements.length; i_1++) {
- if (elementValue1.elements[i_1].combinator.value !== elementValue2.elements[i_1].combinator.value) {
- if (i_1 !== 0 || (elementValue1.elements[i_1].combinator.value || ' ') !== (elementValue2.elements[i_1].combinator.value || ' ')) {
- return false;
- }
- }
- if (!this.isElementValuesEqual(elementValue1.elements[i_1].value, elementValue2.elements[i_1].value)) {
- return false;
- }
- }
- return true;
- }
- return false;
- };
- ProcessExtendsVisitor.prototype.extendSelector = function (matches, selectorPath, replacementSelector, isVisible) {
- // for a set of matches, replace each match with the replacement selector
- var currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;
- for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {
- match = matches[matchIndex];
- selector = selectorPath[match.pathIndex];
- firstElement = new tree.Element(match.initialCombinator, replacementSelector.elements[0].value, replacementSelector.elements[0].isVariable, replacementSelector.elements[0].getIndex(), replacementSelector.elements[0].fileInfo());
- if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {
- path[path.length - 1].elements = path[path.length - 1]
- .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));
- currentSelectorPathElementIndex = 0;
- currentSelectorPathIndex++;
- }
- newElements = selector.elements
- .slice(currentSelectorPathElementIndex, match.index)
- .concat([firstElement])
- .concat(replacementSelector.elements.slice(1));
- if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {
- path[path.length - 1].elements =
- path[path.length - 1].elements.concat(newElements);
- }
- else {
- path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));
- path.push(new tree.Selector(newElements));
- }
- currentSelectorPathIndex = match.endPathIndex;
- currentSelectorPathElementIndex = match.endPathElementIndex;
- if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {
- currentSelectorPathElementIndex = 0;
- currentSelectorPathIndex++;
- }
- }
- if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {
- path[path.length - 1].elements = path[path.length - 1]
- .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));
- currentSelectorPathIndex++;
- }
- path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));
- path = path.map(function (currentValue) {
- // we can re-use elements here, because the visibility property matters only for selectors
- var derived = currentValue.createDerived(currentValue.elements);
- if (isVisible) {
- derived.ensureVisibility();
- }
- else {
- derived.ensureInvisibility();
- }
- return derived;
- });
- return path;
- };
- ProcessExtendsVisitor.prototype.visitMedia = function (mediaNode, visitArgs) {
- var newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);
- newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));
- this.allExtendsStack.push(newAllExtends);
- };
- ProcessExtendsVisitor.prototype.visitMediaOut = function (mediaNode) {
- var lastIndex = this.allExtendsStack.length - 1;
- this.allExtendsStack.length = lastIndex;
- };
- ProcessExtendsVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) {
- var newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);
- newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));
- this.allExtendsStack.push(newAllExtends);
- };
- ProcessExtendsVisitor.prototype.visitAtRuleOut = function (atRuleNode) {
- var lastIndex = this.allExtendsStack.length - 1;
- this.allExtendsStack.length = lastIndex;
- };
- return ProcessExtendsVisitor;
- }());
-
- /* eslint-disable no-unused-vars */
- var JoinSelectorVisitor = /** @class */ (function () {
- function JoinSelectorVisitor() {
- this.contexts = [[]];
- this._visitor = new Visitor(this);
- }
- JoinSelectorVisitor.prototype.run = function (root) {
- return this._visitor.visit(root);
- };
- JoinSelectorVisitor.prototype.visitDeclaration = function (declNode, visitArgs) {
- visitArgs.visitDeeper = false;
- };
- JoinSelectorVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) {
- visitArgs.visitDeeper = false;
- };
- JoinSelectorVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) {
- var context = this.contexts[this.contexts.length - 1];
- var paths = [];
- var selectors;
- this.contexts.push(paths);
- if (!rulesetNode.root) {
- selectors = rulesetNode.selectors;
- if (selectors) {
- selectors = selectors.filter(function (selector) { return selector.getIsOutput(); });
- rulesetNode.selectors = selectors.length ? selectors : (selectors = null);
- if (selectors) {
- rulesetNode.joinSelectors(paths, context, selectors);
- }
- }
- if (!selectors) {
- rulesetNode.rules = null;
- }
- rulesetNode.paths = paths;
- }
- };
- JoinSelectorVisitor.prototype.visitRulesetOut = function (rulesetNode) {
- this.contexts.length = this.contexts.length - 1;
- };
- JoinSelectorVisitor.prototype.visitMedia = function (mediaNode, visitArgs) {
- var context = this.contexts[this.contexts.length - 1];
- mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);
- };
- JoinSelectorVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) {
- var context = this.contexts[this.contexts.length - 1];
- if (atRuleNode.declarations && atRuleNode.declarations.length) {
- atRuleNode.declarations[0].root = (context.length === 0 || context[0].multiMedia);
- }
- else if (atRuleNode.rules && atRuleNode.rules.length) {
- atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);
- }
- };
- return JoinSelectorVisitor;
- }());
-
- /* eslint-disable no-unused-vars */
- var CSSVisitorUtils = /** @class */ (function () {
- function CSSVisitorUtils(context) {
- this._visitor = new Visitor(this);
- this._context = context;
- }
- CSSVisitorUtils.prototype.containsSilentNonBlockedChild = function (bodyRules) {
- var rule;
- if (!bodyRules) {
- return false;
- }
- for (var r = 0; r < bodyRules.length; r++) {
- rule = bodyRules[r];
- if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {
- // the atrule contains something that was referenced (likely by extend)
- // therefore it needs to be shown in output too
- return true;
- }
- }
- return false;
- };
- CSSVisitorUtils.prototype.keepOnlyVisibleChilds = function (owner) {
- if (owner && owner.rules) {
- owner.rules = owner.rules.filter(function (thing) { return thing.isVisible(); });
- }
- };
- CSSVisitorUtils.prototype.isEmpty = function (owner) {
- return (owner && owner.rules)
- ? (owner.rules.length === 0) : true;
- };
- CSSVisitorUtils.prototype.hasVisibleSelector = function (rulesetNode) {
- return (rulesetNode && rulesetNode.paths)
- ? (rulesetNode.paths.length > 0) : false;
- };
- CSSVisitorUtils.prototype.resolveVisibility = function (node) {
- if (!node.blocksVisibility()) {
- if (this.isEmpty(node)) {
- return;
- }
- return node;
- }
- var compiledRulesBody = node.rules[0];
- this.keepOnlyVisibleChilds(compiledRulesBody);
- if (this.isEmpty(compiledRulesBody)) {
- return;
- }
- node.ensureVisibility();
- node.removeVisibilityBlock();
- return node;
- };
- CSSVisitorUtils.prototype.isVisibleRuleset = function (rulesetNode) {
- if (rulesetNode.firstRoot) {
- return true;
- }
- if (this.isEmpty(rulesetNode)) {
- return false;
- }
- if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {
- return false;
- }
- return true;
- };
- return CSSVisitorUtils;
- }());
- var ToCSSVisitor = function (context) {
- this._visitor = new Visitor(this);
- this._context = context;
- this.utils = new CSSVisitorUtils(context);
- };
- ToCSSVisitor.prototype = {
- isReplacing: true,
- run: function (root) {
- return this._visitor.visit(root);
- },
- visitDeclaration: function (declNode, visitArgs) {
- if (declNode.blocksVisibility() || declNode.variable) {
- return;
- }
- return declNode;
- },
- visitMixinDefinition: function (mixinNode, visitArgs) {
- // mixin definitions do not get eval'd - this means they keep state
- // so we have to clear that state here so it isn't used if toCSS is called twice
- mixinNode.frames = [];
- },
- visitExtend: function (extendNode, visitArgs) {
- },
- visitComment: function (commentNode, visitArgs) {
- if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {
- return;
- }
- return commentNode;
- },
- visitMedia: function (mediaNode, visitArgs) {
- var originalRules = mediaNode.rules[0].rules;
- mediaNode.accept(this._visitor);
- visitArgs.visitDeeper = false;
- return this.utils.resolveVisibility(mediaNode, originalRules);
- },
- visitImport: function (importNode, visitArgs) {
- if (importNode.blocksVisibility()) {
- return;
- }
- return importNode;
- },
- visitAtRule: function (atRuleNode, visitArgs) {
- if (atRuleNode.rules && atRuleNode.rules.length) {
- return this.visitAtRuleWithBody(atRuleNode, visitArgs);
- }
- else {
- return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);
- }
- },
- visitAnonymous: function (anonymousNode, visitArgs) {
- if (!anonymousNode.blocksVisibility()) {
- anonymousNode.accept(this._visitor);
- return anonymousNode;
- }
- },
- visitAtRuleWithBody: function (atRuleNode, visitArgs) {
- // if there is only one nested ruleset and that one has no path, then it is
- // just fake ruleset
- function hasFakeRuleset(atRuleNode) {
- var bodyRules = atRuleNode.rules;
- return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);
- }
- function getBodyRules(atRuleNode) {
- var nodeRules = atRuleNode.rules;
- if (hasFakeRuleset(atRuleNode)) {
- return nodeRules[0].rules;
- }
- return nodeRules;
- }
- // it is still true that it is only one ruleset in array
- // this is last such moment
- // process childs
- var originalRules = getBodyRules(atRuleNode);
- atRuleNode.accept(this._visitor);
- visitArgs.visitDeeper = false;
- if (!this.utils.isEmpty(atRuleNode)) {
- this._mergeRules(atRuleNode.rules[0].rules);
- }
- return this.utils.resolveVisibility(atRuleNode, originalRules);
- },
- visitAtRuleWithoutBody: function (atRuleNode, visitArgs) {
- if (atRuleNode.blocksVisibility()) {
- return;
- }
- if (atRuleNode.name === '@charset') {
- // Only output the debug info together with subsequent @charset definitions
- // a comment (or @media statement) before the actual @charset atrule would
- // be considered illegal css as it has to be on the first line
- if (this.charset) {
- if (atRuleNode.debugInfo) {
- var comment = new tree.Comment("/* ".concat(atRuleNode.toCSS(this._context).replace(/\n/g, ''), " */\n"));
- comment.debugInfo = atRuleNode.debugInfo;
- return this._visitor.visit(comment);
- }
- return;
- }
- this.charset = true;
- }
- return atRuleNode;
- },
- checkValidNodes: function (rules, isRoot) {
- if (!rules) {
- return;
- }
- for (var i_1 = 0; i_1 < rules.length; i_1++) {
- var ruleNode = rules[i_1];
- if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {
- throw { message: 'Properties must be inside selector blocks. They cannot be in the root',
- index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename };
- }
- if (ruleNode instanceof tree.Call) {
- throw { message: "Function '".concat(ruleNode.name, "' did not return a root node"),
- index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename };
- }
- if (ruleNode.type && !ruleNode.allowRoot) {
- throw { message: "".concat(ruleNode.type, " node returned by a function is not valid here"),
- index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename };
- }
- }
- },
- visitRuleset: function (rulesetNode, visitArgs) {
- // at this point rulesets are nested into each other
- var rule;
- var rulesets = [];
- this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);
- if (!rulesetNode.root) {
- // remove invisible paths
- this._compileRulesetPaths(rulesetNode);
- // remove rulesets from this ruleset body and compile them separately
- var nodeRules = rulesetNode.rules;
- var nodeRuleCnt = nodeRules ? nodeRules.length : 0;
- for (var i_2 = 0; i_2 < nodeRuleCnt;) {
- rule = nodeRules[i_2];
- if (rule && rule.rules) {
- // visit because we are moving them out from being a child
- rulesets.push(this._visitor.visit(rule));
- nodeRules.splice(i_2, 1);
- nodeRuleCnt--;
- continue;
- }
- i_2++;
- }
- // accept the visitor to remove rules and refactor itself
- // then we can decide nogw whether we want it or not
- // compile body
- if (nodeRuleCnt > 0) {
- rulesetNode.accept(this._visitor);
- }
- else {
- rulesetNode.rules = null;
- }
- visitArgs.visitDeeper = false;
- }
- else { // if (! rulesetNode.root) {
- rulesetNode.accept(this._visitor);
- visitArgs.visitDeeper = false;
- }
- if (rulesetNode.rules) {
- this._mergeRules(rulesetNode.rules);
- this._removeDuplicateRules(rulesetNode.rules);
- }
- // now decide whether we keep the ruleset
- if (this.utils.isVisibleRuleset(rulesetNode)) {
- rulesetNode.ensureVisibility();
- rulesets.splice(0, 0, rulesetNode);
- }
- if (rulesets.length === 1) {
- return rulesets[0];
- }
- return rulesets;
- },
- _compileRulesetPaths: function (rulesetNode) {
- if (rulesetNode.paths) {
- rulesetNode.paths = rulesetNode.paths
- .filter(function (p) {
- var i;
- if (p[0].elements[0].combinator.value === ' ') {
- p[0].elements[0].combinator = new (tree.Combinator)('');
- }
- for (i = 0; i < p.length; i++) {
- if (p[i].isVisible() && p[i].getIsOutput()) {
- return true;
- }
- }
- return false;
- });
- }
- },
- _removeDuplicateRules: function (rules) {
- if (!rules) {
- return;
- }
- // remove duplicates
- var ruleCache = {};
- var ruleList;
- var rule;
- var i;
- for (i = rules.length - 1; i >= 0; i--) {
- rule = rules[i];
- if (rule instanceof tree.Declaration) {
- if (!ruleCache[rule.name]) {
- ruleCache[rule.name] = rule;
- }
- else {
- ruleList = ruleCache[rule.name];
- if (ruleList instanceof tree.Declaration) {
- ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];
- }
- var ruleCSS = rule.toCSS(this._context);
- if (ruleList.indexOf(ruleCSS) !== -1) {
- rules.splice(i, 1);
- }
- else {
- ruleList.push(ruleCSS);
- }
- }
- }
- }
- },
- _mergeRules: function (rules) {
- if (!rules) {
- return;
- }
- var groups = {};
- var groupsArr = [];
- for (var i_3 = 0; i_3 < rules.length; i_3++) {
- var rule = rules[i_3];
- if (rule.merge) {
- var key = rule.name;
- groups[key] ? rules.splice(i_3--, 1) :
- groupsArr.push(groups[key] = []);
- groups[key].push(rule);
- }
- }
- groupsArr.forEach(function (group) {
- if (group.length > 0) {
- var result_1 = group[0];
- var space_1 = [];
- var comma_1 = [new tree.Expression(space_1)];
- group.forEach(function (rule) {
- if ((rule.merge === '+') && (space_1.length > 0)) {
- comma_1.push(new tree.Expression(space_1 = []));
- }
- space_1.push(rule.value);
- result_1.important = result_1.important || rule.important;
- });
- result_1.value = new tree.Value(comma_1);
- }
- });
- }
- };
-
- var visitors = {
- Visitor: Visitor,
- ImportVisitor: ImportVisitor,
- MarkVisibleSelectorsVisitor: SetTreeVisibilityVisitor,
- ExtendVisitor: ProcessExtendsVisitor,
- JoinSelectorVisitor: JoinSelectorVisitor,
- ToCSSVisitor: ToCSSVisitor
- };
-
- // Split the input into chunks.
- function chunker (input, fail) {
- var len = input.length;
- var level = 0;
- var parenLevel = 0;
- var lastOpening;
- var lastOpeningParen;
- var lastMultiComment;
- var lastMultiCommentEndBrace;
- var chunks = [];
- var emitFrom = 0;
- var chunkerCurrentIndex;
- var currentChunkStartIndex;
- var cc;
- var cc2;
- var matched;
- function emitChunk(force) {
- var len = chunkerCurrentIndex - emitFrom;
- if (((len < 512) && !force) || !len) {
- return;
- }
- chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));
- emitFrom = chunkerCurrentIndex + 1;
- }
- for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {
- cc = input.charCodeAt(chunkerCurrentIndex);
- if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {
- // a-z or whitespace
- continue;
- }
- switch (cc) {
- case 40: // (
- parenLevel++;
- lastOpeningParen = chunkerCurrentIndex;
- continue;
- case 41: // )
- if (--parenLevel < 0) {
- return fail('missing opening `(`', chunkerCurrentIndex);
- }
- continue;
- case 59: // ;
- if (!parenLevel) {
- emitChunk();
- }
- continue;
- case 123: // {
- level++;
- lastOpening = chunkerCurrentIndex;
- continue;
- case 125: // }
- if (--level < 0) {
- return fail('missing opening `{`', chunkerCurrentIndex);
- }
- if (!level && !parenLevel) {
- emitChunk();
- }
- continue;
- case 92: // \
- if (chunkerCurrentIndex < len - 1) {
- chunkerCurrentIndex++;
- continue;
- }
- return fail('unescaped `\\`', chunkerCurrentIndex);
- case 34:
- case 39:
- case 96: // ", ' and `
- matched = 0;
- currentChunkStartIndex = chunkerCurrentIndex;
- for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {
- cc2 = input.charCodeAt(chunkerCurrentIndex);
- if (cc2 > 96) {
- continue;
- }
- if (cc2 == cc) {
- matched = 1;
- break;
- }
- if (cc2 == 92) { // \
- if (chunkerCurrentIndex == len - 1) {
- return fail('unescaped `\\`', chunkerCurrentIndex);
- }
- chunkerCurrentIndex++;
- }
- }
- if (matched) {
- continue;
- }
- return fail("unmatched `".concat(String.fromCharCode(cc), "`"), currentChunkStartIndex);
- case 47: // /, check for comment
- if (parenLevel || (chunkerCurrentIndex == len - 1)) {
- continue;
- }
- cc2 = input.charCodeAt(chunkerCurrentIndex + 1);
- if (cc2 == 47) {
- // //, find lnfeed
- for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {
- cc2 = input.charCodeAt(chunkerCurrentIndex);
- if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) {
- break;
- }
- }
- }
- else if (cc2 == 42) {
- // /*, find */
- lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;
- for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {
- cc2 = input.charCodeAt(chunkerCurrentIndex);
- if (cc2 == 125) {
- lastMultiCommentEndBrace = chunkerCurrentIndex;
- }
- if (cc2 != 42) {
- continue;
- }
- if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) {
- break;
- }
- }
- if (chunkerCurrentIndex == len - 1) {
- return fail('missing closing `*/`', currentChunkStartIndex);
- }
- chunkerCurrentIndex++;
- }
- continue;
- case 42: // *, check for unmatched */
- if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {
- return fail('unmatched `/*`', chunkerCurrentIndex);
- }
- continue;
- }
- }
- if (level !== 0) {
- if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {
- return fail('missing closing `}` or `*/`', lastOpening);
- }
- else {
- return fail('missing closing `}`', lastOpening);
- }
- }
- else if (parenLevel !== 0) {
- return fail('missing closing `)`', lastOpeningParen);
- }
- emitChunk(true);
- return chunks;
- }
-
- var getParserInput = (function () {
- var // Less input string
- input;
- var // current chunk
- j;
- var // holds state for backtracking
- saveStack = [];
- var // furthest index the parser has gone to
- furthest;
- var // if this is furthest we got to, this is the probably cause
- furthestPossibleErrorMessage;
- var // chunkified input
- chunks;
- var // current chunk
- current;
- var // index of current chunk, in `input`
- currentPos;
- var parserInput = {};
- var CHARCODE_SPACE = 32;
- var CHARCODE_TAB = 9;
- var CHARCODE_LF = 10;
- var CHARCODE_CR = 13;
- var CHARCODE_PLUS = 43;
- var CHARCODE_COMMA = 44;
- var CHARCODE_FORWARD_SLASH = 47;
- var CHARCODE_9 = 57;
- function skipWhitespace(length) {
- var oldi = parserInput.i;
- var oldj = j;
- var curr = parserInput.i - currentPos;
- var endIndex = parserInput.i + current.length - curr;
- var mem = (parserInput.i += length);
- var inp = input;
- var c;
- var nextChar;
- var comment;
- for (; parserInput.i < endIndex; parserInput.i++) {
- c = inp.charCodeAt(parserInput.i);
- if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {
- nextChar = inp.charAt(parserInput.i + 1);
- if (nextChar === '/') {
- comment = { index: parserInput.i, isLineComment: true };
- var nextNewLine = inp.indexOf('\n', parserInput.i + 2);
- if (nextNewLine < 0) {
- nextNewLine = endIndex;
- }
- parserInput.i = nextNewLine;
- comment.text = inp.substr(comment.index, parserInput.i - comment.index);
- parserInput.commentStore.push(comment);
- continue;
- }
- else if (nextChar === '*') {
- var nextStarSlash = inp.indexOf('*/', parserInput.i + 2);
- if (nextStarSlash >= 0) {
- comment = {
- index: parserInput.i,
- text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),
- isLineComment: false
- };
- parserInput.i += comment.text.length - 1;
- parserInput.commentStore.push(comment);
- continue;
- }
- }
- break;
- }
- if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {
- break;
- }
- }
- current = current.slice(length + parserInput.i - mem + curr);
- currentPos = parserInput.i;
- if (!current.length) {
- if (j < chunks.length - 1) {
- current = chunks[++j];
- skipWhitespace(0); // skip space at the beginning of a chunk
- return true; // things changed
- }
- parserInput.finished = true;
- }
- return oldi !== parserInput.i || oldj !== j;
- }
- parserInput.save = function () {
- currentPos = parserInput.i;
- saveStack.push({ current: current, i: parserInput.i, j: j });
- };
- parserInput.restore = function (possibleErrorMessage) {
- if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {
- furthest = parserInput.i;
- furthestPossibleErrorMessage = possibleErrorMessage;
- }
- var state = saveStack.pop();
- current = state.current;
- currentPos = parserInput.i = state.i;
- j = state.j;
- };
- parserInput.forget = function () {
- saveStack.pop();
- };
- parserInput.isWhitespace = function (offset) {
- var pos = parserInput.i + (offset || 0);
- var code = input.charCodeAt(pos);
- return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);
- };
- // Specialization of $(tok)
- parserInput.$re = function (tok) {
- if (parserInput.i > currentPos) {
- current = current.slice(parserInput.i - currentPos);
- currentPos = parserInput.i;
- }
- var m = tok.exec(current);
- if (!m) {
- return null;
- }
- skipWhitespace(m[0].length);
- if (typeof m === 'string') {
- return m;
- }
- return m.length === 1 ? m[0] : m;
- };
- parserInput.$char = function (tok) {
- if (input.charAt(parserInput.i) !== tok) {
- return null;
- }
- skipWhitespace(1);
- return tok;
- };
- parserInput.$peekChar = function (tok) {
- if (input.charAt(parserInput.i) !== tok) {
- return null;
- }
- return tok;
- };
- parserInput.$str = function (tok) {
- var tokLength = tok.length;
- // https://jsperf.com/string-startswith/21
- for (var i_1 = 0; i_1 < tokLength; i_1++) {
- if (input.charAt(parserInput.i + i_1) !== tok.charAt(i_1)) {
- return null;
- }
- }
- skipWhitespace(tokLength);
- return tok;
- };
- parserInput.$quoted = function (loc) {
- var pos = loc || parserInput.i;
- var startChar = input.charAt(pos);
- if (startChar !== '\'' && startChar !== '"') {
- return;
- }
- var length = input.length;
- var currentPosition = pos;
- for (var i_2 = 1; i_2 + currentPosition < length; i_2++) {
- var nextChar = input.charAt(i_2 + currentPosition);
- switch (nextChar) {
- case '\\':
- i_2++;
- continue;
- case '\r':
- case '\n':
- break;
- case startChar: {
- var str = input.substr(currentPosition, i_2 + 1);
- if (!loc && loc !== 0) {
- skipWhitespace(i_2 + 1);
- return str;
- }
- return [startChar, str];
- }
- }
- }
- return null;
- };
- /**
- * Permissive parsing. Ignores everything except matching {} [] () and quotes
- * until matching token (outside of blocks)
- */
- parserInput.$parseUntil = function (tok) {
- var quote = '';
- var returnVal = null;
- var inComment = false;
- var blockDepth = 0;
- var blockStack = [];
- var parseGroups = [];
- var length = input.length;
- var startPos = parserInput.i;
- var lastPos = parserInput.i;
- var i = parserInput.i;
- var loop = true;
- var testChar;
- if (typeof tok === 'string') {
- testChar = function (char) { return char === tok; };
- }
- else {
- testChar = function (char) { return tok.test(char); };
- }
- do {
- var nextChar = input.charAt(i);
- if (blockDepth === 0 && testChar(nextChar)) {
- returnVal = input.substr(lastPos, i - lastPos);
- if (returnVal) {
- parseGroups.push(returnVal);
- }
- else {
- parseGroups.push(' ');
- }
- returnVal = parseGroups;
- skipWhitespace(i - startPos);
- loop = false;
- }
- else {
- if (inComment) {
- if (nextChar === '*' &&
- input.charAt(i + 1) === '/') {
- i++;
- blockDepth--;
- inComment = false;
- }
- i++;
- continue;
- }
- switch (nextChar) {
- case '\\':
- i++;
- nextChar = input.charAt(i);
- parseGroups.push(input.substr(lastPos, i - lastPos + 1));
- lastPos = i + 1;
- break;
- case '/':
- if (input.charAt(i + 1) === '*') {
- i++;
- inComment = true;
- blockDepth++;
- }
- break;
- case '\'':
- case '"':
- quote = parserInput.$quoted(i);
- if (quote) {
- parseGroups.push(input.substr(lastPos, i - lastPos), quote);
- i += quote[1].length - 1;
- lastPos = i + 1;
- }
- else {
- skipWhitespace(i - startPos);
- returnVal = nextChar;
- loop = false;
- }
- break;
- case '{':
- blockStack.push('}');
- blockDepth++;
- break;
- case '(':
- blockStack.push(')');
- blockDepth++;
- break;
- case '[':
- blockStack.push(']');
- blockDepth++;
- break;
- case '}':
- case ')':
- case ']': {
- var expected = blockStack.pop();
- if (nextChar === expected) {
- blockDepth--;
- }
- else {
- // move the parser to the error and return expected
- skipWhitespace(i - startPos);
- returnVal = expected;
- loop = false;
- }
- }
- }
- i++;
- if (i > length) {
- loop = false;
- }
- }
- } while (loop);
- return returnVal ? returnVal : null;
- };
- parserInput.autoCommentAbsorb = true;
- parserInput.commentStore = [];
- parserInput.finished = false;
- // Same as $(), but don't change the state of the parser,
- // just return the match.
- parserInput.peek = function (tok) {
- if (typeof tok === 'string') {
- // https://jsperf.com/string-startswith/21
- for (var i_3 = 0; i_3 < tok.length; i_3++) {
- if (input.charAt(parserInput.i + i_3) !== tok.charAt(i_3)) {
- return false;
- }
- }
- return true;
- }
- else {
- return tok.test(current);
- }
- };
- // Specialization of peek()
- // TODO remove or change some currentChar calls to peekChar
- parserInput.peekChar = function (tok) { return input.charAt(parserInput.i) === tok; };
- parserInput.currentChar = function () { return input.charAt(parserInput.i); };
- parserInput.prevChar = function () { return input.charAt(parserInput.i - 1); };
- parserInput.getInput = function () { return input; };
- parserInput.peekNotNumeric = function () {
- var c = input.charCodeAt(parserInput.i);
- // Is the first char of the dimension 0-9, '.', '+' or '-'
- return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;
- };
- parserInput.start = function (str, chunkInput, failFunction) {
- input = str;
- parserInput.i = j = currentPos = furthest = 0;
- // chunking apparently makes things quicker (but my tests indicate
- // it might actually make things slower in node at least)
- // and it is a non-perfect parse - it can't recognise
- // unquoted urls, meaning it can't distinguish comments
- // meaning comments with quotes or {}() in them get 'counted'
- // and then lead to parse errors.
- // In addition if the chunking chunks in the wrong place we might
- // not be able to parse a parser statement in one go
- // this is officially deprecated but can be switched on via an option
- // in the case it causes too much performance issues.
- if (chunkInput) {
- chunks = chunker(str, failFunction);
- }
- else {
- chunks = [str];
- }
- current = chunks[0];
- skipWhitespace(0);
- };
- parserInput.end = function () {
- var message;
- var isFinished = parserInput.i >= input.length;
- if (parserInput.i < furthest) {
- message = furthestPossibleErrorMessage;
- parserInput.i = furthest;
- }
- return {
- isFinished: isFinished,
- furthest: parserInput.i,
- furthestPossibleErrorMessage: message,
- furthestReachedEnd: parserInput.i >= input.length - 1,
- furthestChar: input[parserInput.i]
- };
- };
- return parserInput;
- });
-
- function makeRegistry(base) {
- return {
- _data: {},
- add: function (name, func) {
- // precautionary case conversion, as later querying of
- // the registry by function-caller uses lower case as well.
- name = name.toLowerCase();
- // eslint-disable-next-line no-prototype-builtins
- if (this._data.hasOwnProperty(name)) ;
- this._data[name] = func;
- },
- addMultiple: function (functions) {
- var _this = this;
- Object.keys(functions).forEach(function (name) {
- _this.add(name, functions[name]);
- });
- },
- get: function (name) {
- return this._data[name] || (base && base.get(name));
- },
- getLocalFunctions: function () {
- return this._data;
- },
- inherit: function () {
- return makeRegistry(this);
- },
- create: function (base) {
- return makeRegistry(base);
- }
- };
- }
- var functionRegistry = makeRegistry(null);
-
- var MediaSyntaxOptions = {
- queryInParens: true
- };
- var ContainerSyntaxOptions = {
- queryInParens: true
- };
-
- var Anonymous = function (value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {
- this.value = value;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.mapLines = mapLines;
- this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;
- this.allowRoot = true;
- this.copyVisibilityInfo(visibilityInfo);
- };
- Anonymous.prototype = Object.assign(new Node(), {
- type: 'Anonymous',
- eval: function () {
- return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());
- },
- compare: function (other) {
- return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;
- },
- isRulesetLike: function () {
- return this.rulesetLike;
- },
- genCSS: function (context, output) {
- this.nodeVisible = Boolean(this.value);
- if (this.nodeVisible) {
- output.add(this.value, this._fileInfo, this._index, this.mapLines);
- }
- }
- });
-
- //
- // less.js - parser
- //
- // A relatively straight-forward predictive parser.
- // There is no tokenization/lexing stage, the input is parsed
- // in one sweep.
- //
- // To make the parser fast enough to run in the browser, several
- // optimization had to be made:
- //
- // - Matching and slicing on a huge input is often cause of slowdowns.
- // The solution is to chunkify the input into smaller strings.
- // The chunks are stored in the `chunks` var,
- // `j` holds the current chunk index, and `currentPos` holds
- // the index of the current chunk in relation to `input`.
- // This gives us an almost 4x speed-up.
- //
- // - In many cases, we don't need to match individual tokens;
- // for example, if a value doesn't hold any variables, operations
- // or dynamic references, the parser can effectively 'skip' it,
- // treating it as a literal.
- // An example would be '1px solid #000' - which evaluates to itself,
- // we don't need to know what the individual components are.
- // The drawback, of course is that you don't get the benefits of
- // syntax-checking on the CSS. This gives us a 50% speed-up in the parser,
- // and a smaller speed-up in the code-gen.
- //
- //
- // Token matching is done with the `$` function, which either takes
- // a terminal string or regexp, or a non-terminal function to call.
- // It also takes care of moving all the indices forwards.
- //
- var Parser = function Parser(context, imports, fileInfo, currentIndex) {
- currentIndex = currentIndex || 0;
- var parsers;
- var parserInput = getParserInput();
- function error(msg, type) {
- throw new LessError({
- index: parserInput.i,
- filename: fileInfo.filename,
- type: type || 'Syntax',
- message: msg
- }, imports);
- }
- /**
- *
- * @param {string} msg
- * @param {number} index
- * @param {string} type
- */
- function warn(msg, index, type) {
- if (!context.quiet) {
- logger$1.warn((new LessError({
- index: index !== null && index !== void 0 ? index : parserInput.i,
- filename: fileInfo.filename,
- type: type ? "".concat(type.toUpperCase(), " WARNING") : 'WARNING',
- message: msg
- }, imports)).toString());
- }
- }
- function expect(arg, msg) {
- // some older browsers return typeof 'function' for RegExp
- var result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);
- if (result) {
- return result;
- }
- error(msg || (typeof arg === 'string'
- ? "expected '".concat(arg, "' got '").concat(parserInput.currentChar(), "'")
- : 'unexpected token'));
- }
- // Specialization of expect()
- function expectChar(arg, msg) {
- if (parserInput.$char(arg)) {
- return arg;
- }
- error(msg || "expected '".concat(arg, "' got '").concat(parserInput.currentChar(), "'"));
- }
- function getDebugInfo(index) {
- var filename = fileInfo.filename;
- return {
- lineNumber: getLocation(index, parserInput.getInput()).line + 1,
- fileName: filename
- };
- }
- /**
- * Used after initial parsing to create nodes on the fly
- *
- * @param {String} str - string to parse
- * @param {Array} parseList - array of parsers to run input through e.g. ["value", "important"]
- * @param {Number} currentIndex - start number to begin indexing
- * @param {Object} fileInfo - fileInfo to attach to created nodes
- */
- function parseNode(str, parseList, callback) {
- var result;
- var returnNodes = [];
- var parser = parserInput;
- try {
- parser.start(str, false, function fail(msg, index) {
- callback({
- message: msg,
- index: index + currentIndex
- });
- });
- for (var x = 0, p = void 0; (p = parseList[x]); x++) {
- result = parsers[p]();
- returnNodes.push(result || null);
- }
- var endInfo = parser.end();
- if (endInfo.isFinished) {
- callback(null, returnNodes);
- }
- else {
- callback(true, null);
- }
- }
- catch (e) {
- throw new LessError({
- index: e.index + currentIndex,
- message: e.message
- }, imports, fileInfo.filename);
- }
- }
- //
- // The Parser
- //
- return {
- parserInput: parserInput,
- imports: imports,
- fileInfo: fileInfo,
- parseNode: parseNode,
- //
- // Parse an input string into an abstract syntax tree,
- // @param str A string containing 'less' markup
- // @param callback call `callback` when done.
- // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply
- //
- parse: function (str, callback, additionalData) {
- var root;
- var err = null;
- var globalVars;
- var modifyVars;
- var ignored;
- var preText = '';
- // Optionally disable @plugin parsing
- if (additionalData && additionalData.disablePluginRule) {
- parsers.plugin = function () {
- var dir = parserInput.$re(/^@plugin?\s+/);
- if (dir) {
- error('@plugin statements are not allowed when disablePluginRule is set to true');
- }
- };
- }
- globalVars = (additionalData && additionalData.globalVars) ? "".concat(Parser.serializeVars(additionalData.globalVars), "\n") : '';
- modifyVars = (additionalData && additionalData.modifyVars) ? "\n".concat(Parser.serializeVars(additionalData.modifyVars)) : '';
- if (context.pluginManager) {
- var preProcessors = context.pluginManager.getPreProcessors();
- for (var i_1 = 0; i_1 < preProcessors.length; i_1++) {
- str = preProcessors[i_1].process(str, { context: context, imports: imports, fileInfo: fileInfo });
- }
- }
- if (globalVars || (additionalData && additionalData.banner)) {
- preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;
- ignored = imports.contentsIgnoredChars;
- ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;
- ignored[fileInfo.filename] += preText.length;
- }
- str = str.replace(/\r\n?/g, '\n');
- // Remove potential UTF Byte Order Mark
- str = preText + str.replace(/^\uFEFF/, '') + modifyVars;
- imports.contents[fileInfo.filename] = str;
- // Start with the primary rule.
- // The whole syntax tree is held under a Ruleset node,
- // with the `root` property set to true, so no `{}` are
- // output. The callback is called when the input is parsed.
- try {
- parserInput.start(str, context.chunkInput, function fail(msg, index) {
- throw new LessError({
- index: index,
- type: 'Parse',
- message: msg,
- filename: fileInfo.filename
- }, imports);
- });
- tree.Node.prototype.parse = this;
- root = new tree.Ruleset(null, this.parsers.primary());
- tree.Node.prototype.rootNode = root;
- root.root = true;
- root.firstRoot = true;
- root.functionRegistry = functionRegistry.inherit();
- }
- catch (e) {
- return callback(new LessError(e, imports, fileInfo.filename));
- }
- // If `i` is smaller than the `input.length - 1`,
- // it means the parser wasn't able to parse the whole
- // string, so we've got a parsing error.
- //
- // We try to extract a \n delimited string,
- // showing the line where the parse error occurred.
- // We split it up into two parts (the part which parsed,
- // and the part which didn't), so we can color them differently.
- var endInfo = parserInput.end();
- if (!endInfo.isFinished) {
- var message = endInfo.furthestPossibleErrorMessage;
- if (!message) {
- message = 'Unrecognised input';
- if (endInfo.furthestChar === '}') {
- message += '. Possibly missing opening \'{\'';
- }
- else if (endInfo.furthestChar === ')') {
- message += '. Possibly missing opening \'(\'';
- }
- else if (endInfo.furthestReachedEnd) {
- message += '. Possibly missing something';
- }
- }
- err = new LessError({
- type: 'Parse',
- message: message,
- index: endInfo.furthest,
- filename: fileInfo.filename
- }, imports);
- }
- var finish = function (e) {
- e = err || e || imports.error;
- if (e) {
- if (!(e instanceof LessError)) {
- e = new LessError(e, imports, fileInfo.filename);
- }
- return callback(e);
- }
- else {
- return callback(null, root);
- }
- };
- if (context.processImports !== false) {
- new visitors.ImportVisitor(imports, finish)
- .run(root);
- }
- else {
- return finish();
- }
- },
- //
- // Here in, the parsing rules/functions
- //
- // The basic structure of the syntax tree generated is as follows:
- //
- // Ruleset -> Declaration -> Value -> Expression -> Entity
- //
- // Here's some Less code:
- //
- // .class {
- // color: #fff;
- // border: 1px solid #000;
- // width: @w + 4px;
- // > .child {...}
- // }
- //
- // And here's what the parse tree might look like:
- //
- // Ruleset (Selector '.class', [
- // Declaration ("color", Value ([Expression [Color #fff]]))
- // Declaration ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]]))
- // Declaration ("width", Value ([Expression [Operation " + " [Variable "@w"][Dimension 4px]]]))
- // Ruleset (Selector [Element '>', '.child'], [...])
- // ])
- //
- // In general, most rules will try to parse a token with the `$re()` function, and if the return
- // value is truly, will return a new node, of the relevant type. Sometimes, we need to check
- // first, before parsing, that's when we use `peek()`.
- //
- parsers: parsers = {
- //
- // The `primary` rule is the *entry* and *exit* point of the parser.
- // The rules here can appear at any level of the parse tree.
- //
- // The recursive nature of the grammar is an interplay between the `block`
- // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,
- // as represented by this simplified grammar:
- //
- // primary → (ruleset | declaration)+
- // ruleset → selector+ block
- // block → '{' primary '}'
- //
- // Only at one point is the primary rule not called from the
- // block rule: at the root level.
- //
- primary: function () {
- var mixin = this.mixin;
- var root = [];
- var node;
- while (true) {
- while (true) {
- node = this.comment();
- if (!node) {
- break;
- }
- root.push(node);
- }
- // always process comments before deciding if finished
- if (parserInput.finished) {
- break;
- }
- if (parserInput.peek('}')) {
- break;
- }
- node = this.extendRule();
- if (node) {
- root = root.concat(node);
- continue;
- }
- node = mixin.definition() || this.declaration() || mixin.call(false, false) ||
- this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();
- if (node) {
- root.push(node);
- }
- else {
- var foundSemiColon = false;
- while (parserInput.$char(';')) {
- foundSemiColon = true;
- }
- if (!foundSemiColon) {
- break;
- }
- }
- }
- return root;
- },
- // comments are collected by the main parsing mechanism and then assigned to nodes
- // where the current structure allows it
- comment: function () {
- if (parserInput.commentStore.length) {
- var comment = parserInput.commentStore.shift();
- return new (tree.Comment)(comment.text, comment.isLineComment, comment.index + currentIndex, fileInfo);
- }
- },
- //
- // Entities are tokens which can be found inside an Expression
- //
- entities: {
- mixinLookup: function () {
- return parsers.mixin.call(true, true);
- },
- //
- // A string, which supports escaping " and '
- //
- // "milky way" 'he\'s the one!'
- //
- quoted: function (forceEscaped) {
- var str;
- var index = parserInput.i;
- var isEscaped = false;
- parserInput.save();
- if (parserInput.$char('~')) {
- isEscaped = true;
- }
- else if (forceEscaped) {
- parserInput.restore();
- return;
- }
- str = parserInput.$quoted();
- if (!str) {
- parserInput.restore();
- return;
- }
- parserInput.forget();
- return new (tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index + currentIndex, fileInfo);
- },
- //
- // A catch-all word, such as:
- //
- // black border-collapse
- //
- keyword: function () {
- var k = parserInput.$char('%') || parserInput.$re(/^\[?(?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\]?/);
- if (k) {
- return tree.Color.fromKeyword(k) || new (tree.Keyword)(k);
- }
- },
- //
- // A function call
- //
- // rgb(255, 0, 255)
- //
- // The arguments are parsed with the `entities.arguments` parser.
- //
- call: function () {
- var name;
- var args;
- var func;
- var index = parserInput.i;
- // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18
- if (parserInput.peek(/^url\(/i)) {
- return;
- }
- parserInput.save();
- name = parserInput.$re(/^([\w-]+|%|~|progid:[\w.]+)\(/);
- if (!name) {
- parserInput.forget();
- return;
- }
- name = name[1];
- func = this.customFuncCall(name);
- if (func) {
- args = func.parse();
- if (args && func.stop) {
- parserInput.forget();
- return args;
- }
- }
- args = this.arguments(args);
- if (!parserInput.$char(')')) {
- parserInput.restore('Could not parse call arguments or missing \')\'');
- return;
- }
- parserInput.forget();
- return new (tree.Call)(name, args, index + currentIndex, fileInfo);
- },
- declarationCall: function () {
- var validCall;
- var args;
- var index = parserInput.i;
- parserInput.save();
- validCall = parserInput.$re(/^[\w]+\(/);
- if (!validCall) {
- parserInput.forget();
- return;
- }
- validCall = validCall.substring(0, validCall.length - 1);
- var rule = this.ruleProperty();
- var value;
- if (rule) {
- value = this.value();
- }
- if (rule && value) {
- args = [new (tree.Declaration)(rule, value, null, null, parserInput.i + currentIndex, fileInfo, true)];
- }
- if (!parserInput.$char(')')) {
- parserInput.restore('Could not parse call arguments or missing \')\'');
- return;
- }
- parserInput.forget();
- return new (tree.Call)(validCall, args, index + currentIndex, fileInfo);
- },
- //
- // Parsing rules for functions with non-standard args, e.g.:
- //
- // boolean(not(2 > 1))
- //
- // This is a quick prototype, to be modified/improved when
- // more custom-parsed funcs come (e.g. `selector(...)`)
- //
- customFuncCall: function (name) {
- /* Ideally the table is to be moved out of here for faster perf.,
- but it's quite tricky since it relies on all these `parsers`
- and `expect` available only here */
- return {
- alpha: f(parsers.ieAlpha, true),
- boolean: f(condition),
- 'if': f(condition)
- }[name.toLowerCase()];
- function f(parse, stop) {
- return {
- parse: parse,
- stop: stop // when true - stop after parse() and return its result,
- // otherwise continue for plain args
- };
- }
- function condition() {
- return [expect(parsers.condition, 'expected condition')];
- }
- },
- arguments: function (prevArgs) {
- var argsComma = prevArgs || [];
- var argsSemiColon = [];
- var isSemiColonSeparated;
- var value;
- parserInput.save();
- while (true) {
- if (prevArgs) {
- prevArgs = false;
- }
- else {
- value = parsers.detachedRuleset() || this.assignment() || parsers.expression();
- if (!value) {
- break;
- }
- if (value.value && value.value.length == 1) {
- value = value.value[0];
- }
- argsComma.push(value);
- }
- if (parserInput.$char(',')) {
- continue;
- }
- if (parserInput.$char(';') || isSemiColonSeparated) {
- isSemiColonSeparated = true;
- value = (argsComma.length < 1) ? argsComma[0]
- : new tree.Value(argsComma);
- argsSemiColon.push(value);
- argsComma = [];
- }
- }
- parserInput.forget();
- return isSemiColonSeparated ? argsSemiColon : argsComma;
- },
- literal: function () {
- return this.dimension() ||
- this.color() ||
- this.quoted() ||
- this.unicodeDescriptor();
- },
- // Assignments are argument entities for calls.
- // They are present in ie filter properties as shown below.
- //
- // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )
- //
- assignment: function () {
- var key;
- var value;
- parserInput.save();
- key = parserInput.$re(/^\w+(?=\s?=)/i);
- if (!key) {
- parserInput.restore();
- return;
- }
- if (!parserInput.$char('=')) {
- parserInput.restore();
- return;
- }
- value = parsers.entity();
- if (value) {
- parserInput.forget();
- return new (tree.Assignment)(key, value);
- }
- else {
- parserInput.restore();
- }
- },
- //
- // Parse url() tokens
- //
- // We use a specific rule for urls, because they don't really behave like
- // standard function calls. The difference is that the argument doesn't have
- // to be enclosed within a string, so it can't be parsed as an Expression.
- //
- url: function () {
- var value;
- var index = parserInput.i;
- parserInput.autoCommentAbsorb = false;
- if (!parserInput.$str('url(')) {
- parserInput.autoCommentAbsorb = true;
- return;
- }
- value = this.quoted() || this.variable() || this.property() ||
- parserInput.$re(/^(?:(?:\\[()'"])|[^()'"])+/) || '';
- parserInput.autoCommentAbsorb = true;
- expectChar(')');
- return new (tree.URL)((value.value !== undefined ||
- value instanceof tree.Variable ||
- value instanceof tree.Property) ?
- value : new (tree.Anonymous)(value, index), index + currentIndex, fileInfo);
- },
- //
- // A Variable entity, such as `@fink`, in
- //
- // width: @fink + 2px
- //
- // We use a different parser for variable definitions,
- // see `parsers.variable`.
- //
- variable: function () {
- var ch;
- var name;
- var index = parserInput.i;
- parserInput.save();
- if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\w-]+/))) {
- ch = parserInput.currentChar();
- if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\s/)) {
- // this may be a VariableCall lookup
- var result = parsers.variableCall(name);
- if (result) {
- parserInput.forget();
- return result;
- }
- }
- parserInput.forget();
- return new (tree.Variable)(name, index + currentIndex, fileInfo);
- }
- parserInput.restore();
- },
- // A variable entity using the protective {} e.g. @{var}
- variableCurly: function () {
- var curly;
- var index = parserInput.i;
- if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\{([\w-]+)\}/))) {
- return new (tree.Variable)("@".concat(curly[1]), index + currentIndex, fileInfo);
- }
- },
- //
- // A Property accessor, such as `$color`, in
- //
- // background-color: $color
- //
- property: function () {
- var name;
- var index = parserInput.i;
- if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\$[\w-]+/))) {
- return new (tree.Property)(name, index + currentIndex, fileInfo);
- }
- },
- // A property entity useing the protective {} e.g. ${prop}
- propertyCurly: function () {
- var curly;
- var index = parserInput.i;
- if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\$\{([\w-]+)\}/))) {
- return new (tree.Property)("$".concat(curly[1]), index + currentIndex, fileInfo);
- }
- },
- //
- // A Hexadecimal color
- //
- // #4F3C2F
- //
- // `rgb` and `hsl` colors are parsed through the `entities.call` parser.
- //
- color: function () {
- var rgb;
- parserInput.save();
- if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\w.#[])?/))) {
- if (!rgb[2]) {
- parserInput.forget();
- return new (tree.Color)(rgb[1], undefined, rgb[0]);
- }
- }
- parserInput.restore();
- },
- colorKeyword: function () {
- parserInput.save();
- var autoCommentAbsorb = parserInput.autoCommentAbsorb;
- parserInput.autoCommentAbsorb = false;
- var k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);
- parserInput.autoCommentAbsorb = autoCommentAbsorb;
- if (!k) {
- parserInput.forget();
- return;
- }
- parserInput.restore();
- var color = tree.Color.fromKeyword(k);
- if (color) {
- parserInput.$str(k);
- return color;
- }
- },
- //
- // A Dimension, that is, a number and a unit
- //
- // 0.5em 95%
- //
- dimension: function () {
- if (parserInput.peekNotNumeric()) {
- return;
- }
- var value = parserInput.$re(/^([+-]?\d*\.?\d+)(%|[a-z_]+)?/i);
- if (value) {
- return new (tree.Dimension)(value[1], value[2]);
- }
- },
- //
- // A unicode descriptor, as is used in unicode-range
- //
- // U+0?? or U+00A1-00A9
- //
- unicodeDescriptor: function () {
- var ud;
- ud = parserInput.$re(/^U\+[0-9a-fA-F?]+(-[0-9a-fA-F?]+)?/);
- if (ud) {
- return new (tree.UnicodeDescriptor)(ud[0]);
- }
- },
- //
- // JavaScript code to be evaluated
- //
- // `window.location.href`
- //
- javascript: function () {
- var js;
- var index = parserInput.i;
- parserInput.save();
- var escape = parserInput.$char('~');
- var jsQuote = parserInput.$char('`');
- if (!jsQuote) {
- parserInput.restore();
- return;
- }
- js = parserInput.$re(/^[^`]*`/);
- if (js) {
- parserInput.forget();
- return new (tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index + currentIndex, fileInfo);
- }
- parserInput.restore('invalid javascript definition');
- }
- },
- //
- // The variable part of a variable definition. Used in the `rule` parser
- //
- // @fink:
- //
- variable: function () {
- var name;
- if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\w-]+)\s*:/))) {
- return name[1];
- }
- },
- //
- // Call a variable value to retrieve a detached ruleset
- // or a value from a detached ruleset's rules.
- //
- // @fink();
- // @fink;
- // color: @fink[@color];
- //
- variableCall: function (parsedName) {
- var lookups;
- var i = parserInput.i;
- var inValue = !!parsedName;
- var name = parsedName;
- parserInput.save();
- if (name || (parserInput.currentChar() === '@'
- && (name = parserInput.$re(/^(@[\w-]+)(\(\s*\))?/)))) {
- lookups = this.mixin.ruleLookups();
- if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {
- parserInput.restore('Missing \'[...]\' lookup in variable call');
- return;
- }
- if (!inValue) {
- name = name[1];
- }
- var call = new tree.VariableCall(name, i, fileInfo);
- if (!inValue && parsers.end()) {
- parserInput.forget();
- return call;
- }
- else {
- parserInput.forget();
- return new tree.NamespaceValue(call, lookups, i, fileInfo);
- }
- }
- parserInput.restore();
- },
- //
- // extend syntax - used to extend selectors
- //
- extend: function (isRule) {
- var elements;
- var e;
- var index = parserInput.i;
- var option;
- var extendList;
- var extend;
- if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {
- return;
- }
- do {
- option = null;
- elements = null;
- var first = true;
- while (!(option = parserInput.$re(/^(!?all)(?=\s*(\)|,))/))) {
- e = this.element();
- if (!e) {
- break;
- }
- /**
- * @note - This will not catch selectors in pseudos like :is() and :where() because
- * they don't currently parse their contents as selectors.
- */
- if (!first && e.combinator.value) {
- warn('Targeting complex selectors can have unexpected behavior, and this behavior may change in the future.', index);
- }
- first = false;
- if (elements) {
- elements.push(e);
- }
- else {
- elements = [e];
- }
- }
- option = option && option[1];
- if (!elements) {
- error('Missing target selector for :extend().');
- }
- extend = new (tree.Extend)(new (tree.Selector)(elements), option, index + currentIndex, fileInfo);
- if (extendList) {
- extendList.push(extend);
- }
- else {
- extendList = [extend];
- }
- } while (parserInput.$char(','));
- expect(/^\)/);
- if (isRule) {
- expect(/^;/);
- }
- return extendList;
- },
- //
- // extendRule - used in a rule to extend all the parent selectors
- //
- extendRule: function () {
- return this.extend(true);
- },
- //
- // Mixins
- //
- mixin: {
- //
- // A Mixin call, with an optional argument list
- //
- // #mixins > .square(#fff);
- // #mixins.square(#fff);
- // .rounded(4px, black);
- // .button;
- //
- // We can lookup / return a value using the lookup syntax:
- //
- // color: #mixin.square(#fff)[@color];
- //
- // The `while` loop is there because mixins can be
- // namespaced, but we only support the child and descendant
- // selector for now.
- //
- call: function (inValue, getLookup) {
- var s = parserInput.currentChar();
- var important = false;
- var lookups;
- var index = parserInput.i;
- var elements;
- var args;
- var hasParens;
- var parensIndex;
- var parensWS = false;
- if (s !== '.' && s !== '#') {
- return;
- }
- parserInput.save(); // stop us absorbing part of an invalid selector
- elements = this.elements();
- if (elements) {
- parensIndex = parserInput.i;
- if (parserInput.$char('(')) {
- parensWS = parserInput.isWhitespace(-2);
- args = this.args(true).args;
- expectChar(')');
- hasParens = true;
- if (parensWS) {
- warn('Whitespace between a mixin name and parentheses for a mixin call is deprecated', parensIndex, 'DEPRECATED');
- }
- }
- if (getLookup !== false) {
- lookups = this.ruleLookups();
- }
- if (getLookup === true && !lookups) {
- parserInput.restore();
- return;
- }
- if (inValue && !lookups && !hasParens) {
- // This isn't a valid in-value mixin call
- parserInput.restore();
- return;
- }
- if (!inValue && parsers.important()) {
- important = true;
- }
- if (inValue || parsers.end()) {
- parserInput.forget();
- var mixin = new (tree.mixin.Call)(elements, args, index + currentIndex, fileInfo, !lookups && important);
- if (lookups) {
- return new tree.NamespaceValue(mixin, lookups);
- }
- else {
- if (!hasParens) {
- warn('Calling a mixin without parentheses is deprecated', parensIndex, 'DEPRECATED');
- }
- return mixin;
- }
- }
- }
- parserInput.restore();
- },
- /**
- * Matching elements for mixins
- * (Start with . or # and can have > )
- */
- elements: function () {
- var elements;
- var e;
- var c;
- var elem;
- var elemIndex;
- var re = /^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;
- while (true) {
- elemIndex = parserInput.i;
- e = parserInput.$re(re);
- if (!e) {
- break;
- }
- elem = new (tree.Element)(c, e, false, elemIndex + currentIndex, fileInfo);
- if (elements) {
- elements.push(elem);
- }
- else {
- elements = [elem];
- }
- c = parserInput.$char('>');
- }
- return elements;
- },
- args: function (isCall) {
- var entities = parsers.entities;
- var returner = { args: null, variadic: false };
- var expressions = [];
- var argsSemiColon = [];
- var argsComma = [];
- var isSemiColonSeparated;
- var expressionContainsNamed;
- var name;
- var nameLoop;
- var value;
- var arg;
- var expand;
- var hasSep = true;
- parserInput.save();
- while (true) {
- if (isCall) {
- arg = parsers.detachedRuleset() || parsers.expression();
- }
- else {
- parserInput.commentStore.length = 0;
- if (parserInput.$str('...')) {
- returner.variadic = true;
- if (parserInput.$char(';') && !isSemiColonSeparated) {
- isSemiColonSeparated = true;
- }
- (isSemiColonSeparated ? argsSemiColon : argsComma)
- .push({ variadic: true });
- break;
- }
- arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);
- }
- if (!arg || !hasSep) {
- break;
- }
- nameLoop = null;
- if (arg.throwAwayComments) {
- arg.throwAwayComments();
- }
- value = arg;
- var val = null;
- if (isCall) {
- // Variable
- if (arg.value && arg.value.length == 1) {
- val = arg.value[0];
- }
- }
- else {
- val = arg;
- }
- if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {
- if (parserInput.$char(':')) {
- if (expressions.length > 0) {
- if (isSemiColonSeparated) {
- error('Cannot mix ; and , as delimiter types');
- }
- expressionContainsNamed = true;
- }
- value = parsers.detachedRuleset() || parsers.expression();
- if (!value) {
- if (isCall) {
- error('could not understand value for named argument');
- }
- else {
- parserInput.restore();
- returner.args = [];
- return returner;
- }
- }
- nameLoop = (name = val.name);
- }
- else if (parserInput.$str('...')) {
- if (!isCall) {
- returner.variadic = true;
- if (parserInput.$char(';') && !isSemiColonSeparated) {
- isSemiColonSeparated = true;
- }
- (isSemiColonSeparated ? argsSemiColon : argsComma)
- .push({ name: arg.name, variadic: true });
- break;
- }
- else {
- expand = true;
- }
- }
- else if (!isCall) {
- name = nameLoop = val.name;
- value = null;
- }
- }
- if (value) {
- expressions.push(value);
- }
- argsComma.push({ name: nameLoop, value: value, expand: expand });
- if (parserInput.$char(',')) {
- hasSep = true;
- continue;
- }
- hasSep = parserInput.$char(';') === ';';
- if (hasSep || isSemiColonSeparated) {
- if (expressionContainsNamed) {
- error('Cannot mix ; and , as delimiter types');
- }
- isSemiColonSeparated = true;
- if (expressions.length > 1) {
- value = new (tree.Value)(expressions);
- }
- argsSemiColon.push({ name: name, value: value, expand: expand });
- name = null;
- expressions = [];
- expressionContainsNamed = false;
- }
- }
- parserInput.forget();
- returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;
- return returner;
- },
- //
- // A Mixin definition, with a list of parameters
- //
- // .rounded (@radius: 2px, @color) {
- // ...
- // }
- //
- // Until we have a finer grained state-machine, we have to
- // do a look-ahead, to make sure we don't have a mixin call.
- // See the `rule` function for more information.
- //
- // We start by matching `.rounded (`, and then proceed on to
- // the argument list, which has optional default values.
- // We store the parameters in `params`, with a `value` key,
- // if there is a value, such as in the case of `@radius`.
- //
- // Once we've got our params list, and a closing `)`, we parse
- // the `{...}` block.
- //
- definition: function () {
- var name;
- var params = [];
- var match;
- var ruleset;
- var cond;
- var variadic = false;
- if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||
- parserInput.peek(/^[^{]*\}/)) {
- return;
- }
- parserInput.save();
- match = parserInput.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/);
- if (match) {
- name = match[1];
- var argInfo = this.args(false);
- params = argInfo.args;
- variadic = argInfo.variadic;
- // .mixincall("@{a}");
- // looks a bit like a mixin definition..
- // also
- // .mixincall(@a: {rule: set;});
- // so we have to be nice and restore
- if (!parserInput.$char(')')) {
- parserInput.restore('Missing closing \')\'');
- return;
- }
- parserInput.commentStore.length = 0;
- if (parserInput.$str('when')) { // Guard
- cond = expect(parsers.conditions, 'expected condition');
- }
- ruleset = parsers.block();
- if (ruleset) {
- parserInput.forget();
- return new (tree.mixin.Definition)(name, params, ruleset, cond, variadic);
- }
- else {
- parserInput.restore();
- }
- }
- else {
- parserInput.restore();
- }
- },
- ruleLookups: function () {
- var rule;
- var lookups = [];
- if (parserInput.currentChar() !== '[') {
- return;
- }
- while (true) {
- parserInput.save();
- rule = this.lookupValue();
- if (!rule && rule !== '') {
- parserInput.restore();
- break;
- }
- lookups.push(rule);
- parserInput.forget();
- }
- if (lookups.length > 0) {
- return lookups;
- }
- },
- lookupValue: function () {
- parserInput.save();
- if (!parserInput.$char('[')) {
- parserInput.restore();
- return;
- }
- var name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);
- if (!parserInput.$char(']')) {
- parserInput.restore();
- return;
- }
- if (name || name === '') {
- parserInput.forget();
- return name;
- }
- parserInput.restore();
- }
- },
- //
- // Entities are the smallest recognized token,
- // and can be found inside a rule's value.
- //
- entity: function () {
- var entities = this.entities;
- return this.comment() || entities.literal() || entities.variable() || entities.url() ||
- entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||
- entities.javascript();
- },
- //
- // A Declaration terminator. Note that we use `peek()` to check for '}',
- // because the `block` rule will be expecting it, but we still need to make sure
- // it's there, if ';' was omitted.
- //
- end: function () {
- return parserInput.$char(';') || parserInput.peek('}');
- },
- //
- // IE's alpha function
- //
- // alpha(opacity=88)
- //
- ieAlpha: function () {
- var value;
- // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18
- if (!parserInput.$re(/^opacity=/i)) {
- return;
- }
- value = parserInput.$re(/^\d+/);
- if (!value) {
- value = expect(parsers.entities.variable, 'Could not parse alpha');
- value = "@{".concat(value.name.slice(1), "}");
- }
- expectChar(')');
- return new tree.Quoted('', "alpha(opacity=".concat(value, ")"));
- },
- /**
- * A Selector Element
- *
- * div
- * + h1
- * #socks
- * input[type="text"]
- *
- * Elements are the building blocks for Selectors,
- * they are made out of a `Combinator` (see combinator rule),
- * and an element name, such as a tag a class, or `*`.
- */
- element: function () {
- var e;
- var c;
- var v;
- var index = parserInput.i;
- c = this.combinator();
- /** This selector parser is quite simplistic and will pass a number of invalid selectors. */
- e = parserInput.$re(/^(?:\d+\.\d+|\d+)%/) ||
- // eslint-disable-next-line no-control-regex
- parserInput.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||
- parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||
- parserInput.$re(/^\([^&()@]+\)/) || parserInput.$re(/^[.#:](?=@)/) ||
- this.entities.variableCurly();
- if (!e) {
- parserInput.save();
- if (parserInput.$char('(')) {
- if ((v = this.selector(false))) {
- var selectors = [];
- while (parserInput.$char(',')) {
- selectors.push(v);
- selectors.push(new Anonymous(','));
- v = this.selector(false);
- }
- selectors.push(v);
- if (parserInput.$char(')')) {
- if (selectors.length > 1) {
- e = new (tree.Paren)(new Selector(selectors));
- }
- else {
- e = new (tree.Paren)(v);
- }
- parserInput.forget();
- }
- else {
- parserInput.restore('Missing closing \')\'');
- }
- }
- else {
- parserInput.restore('Missing closing \')\'');
- }
- }
- else {
- parserInput.forget();
- }
- }
- if (e) {
- return new (tree.Element)(c, e, e instanceof tree.Variable, index + currentIndex, fileInfo);
- }
- },
- //
- // Combinators combine elements together, in a Selector.
- //
- // Because our parser isn't white-space sensitive, special care
- // has to be taken, when parsing the descendant combinator, ` `,
- // as it's an empty space. We have to check the previous character
- // in the input, to see if it's a ` ` character. More info on how
- // we deal with this in *combinator.js*.
- //
- combinator: function () {
- var c = parserInput.currentChar();
- if (c === '/') {
- parserInput.save();
- var slashedCombinator = parserInput.$re(/^\/[a-z]+\//i);
- if (slashedCombinator) {
- parserInput.forget();
- return new (tree.Combinator)(slashedCombinator);
- }
- parserInput.restore();
- }
- if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {
- parserInput.i++;
- if (c === '^' && parserInput.currentChar() === '^') {
- c = '^^';
- parserInput.i++;
- }
- while (parserInput.isWhitespace()) {
- parserInput.i++;
- }
- return new (tree.Combinator)(c);
- }
- else if (parserInput.isWhitespace(-1)) {
- return new (tree.Combinator)(' ');
- }
- else {
- return new (tree.Combinator)(null);
- }
- },
- //
- // A CSS Selector
- // with less extensions e.g. the ability to extend and guard
- //
- // .class > div + h1
- // li a:hover
- //
- // Selectors are made out of one or more Elements, see above.
- //
- selector: function (isLess) {
- var index = parserInput.i;
- var elements;
- var extendList;
- var c;
- var e;
- var allExtends;
- var when;
- var condition;
- isLess = isLess !== false;
- while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {
- if (when) {
- condition = expect(this.conditions, 'expected condition');
- }
- else if (condition) {
- error('CSS guard can only be used at the end of selector');
- }
- else if (extendList) {
- if (allExtends) {
- allExtends = allExtends.concat(extendList);
- }
- else {
- allExtends = extendList;
- }
- }
- else {
- if (allExtends) {
- error('Extend can only be used at the end of selector');
- }
- c = parserInput.currentChar();
- if (Array.isArray(e)) {
- e.forEach(function (ele) { return elements.push(ele); });
- }
- if (elements) {
- elements.push(e);
- }
- else {
- elements = [e];
- }
- e = null;
- }
- if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {
- break;
- }
- }
- if (elements) {
- return new (tree.Selector)(elements, allExtends, condition, index + currentIndex, fileInfo);
- }
- if (allExtends) {
- error('Extend must be used to extend a selector, it cannot be used on its own');
- }
- },
- selectors: function () {
- var s;
- var selectors;
- while (true) {
- s = this.selector();
- if (!s) {
- break;
- }
- if (selectors) {
- selectors.push(s);
- }
- else {
- selectors = [s];
- }
- parserInput.commentStore.length = 0;
- if (s.condition && selectors.length > 1) {
- error('Guards are only currently allowed on a single selector.');
- }
- if (!parserInput.$char(',')) {
- break;
- }
- if (s.condition) {
- error('Guards are only currently allowed on a single selector.');
- }
- parserInput.commentStore.length = 0;
- }
- return selectors;
- },
- attribute: function () {
- if (!parserInput.$char('[')) {
- return;
- }
- var entities = this.entities;
- var key;
- var val;
- var op;
- //
- // case-insensitive flag
- // e.g. [attr operator value i]
- //
- var cif;
- if (!(key = entities.variableCurly())) {
- key = expect(/^(?:[_A-Za-z0-9-*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/);
- }
- op = parserInput.$re(/^[|~*$^]?=/);
- if (op) {
- val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\w-]+/) || entities.variableCurly();
- if (val) {
- cif = parserInput.$re(/^[iIsS]/);
- }
- }
- expectChar(']');
- return new (tree.Attribute)(key, op, val, cif);
- },
- //
- // The `block` rule is used by `ruleset` and `mixin.definition`.
- // It's a wrapper around the `primary` rule, with added `{}`.
- //
- block: function () {
- var content;
- if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {
- return content;
- }
- },
- blockRuleset: function () {
- var block = this.block();
- if (block) {
- block = new tree.Ruleset(null, block);
- }
- return block;
- },
- detachedRuleset: function () {
- var argInfo;
- var params;
- var variadic;
- parserInput.save();
- if (parserInput.$re(/^[.#]\(/)) {
- /**
- * DR args currently only implemented for each() function, and not
- * yet settable as `@dr: #(@arg) {}`
- * This should be done when DRs are merged with mixins.
- * See: https://github.com/less/less-meta/issues/16
- */
- argInfo = this.mixin.args(false);
- params = argInfo.args;
- variadic = argInfo.variadic;
- if (!parserInput.$char(')')) {
- parserInput.restore();
- return;
- }
- }
- var blockRuleset = this.blockRuleset();
- if (blockRuleset) {
- parserInput.forget();
- if (params) {
- return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);
- }
- return new tree.DetachedRuleset(blockRuleset);
- }
- parserInput.restore();
- },
- //
- // div, .class, body > p {...}
- //
- ruleset: function () {
- var selectors;
- var rules;
- var debugInfo;
- parserInput.save();
- if (context.dumpLineNumbers) {
- debugInfo = getDebugInfo(parserInput.i);
- }
- selectors = this.selectors();
- if (selectors && (rules = this.block())) {
- parserInput.forget();
- var ruleset = new (tree.Ruleset)(selectors, rules, context.strictImports);
- if (context.dumpLineNumbers) {
- ruleset.debugInfo = debugInfo;
- }
- return ruleset;
- }
- else {
- parserInput.restore();
- }
- },
- declaration: function () {
- var name;
- var value;
- var index = parserInput.i;
- var hasDR;
- var c = parserInput.currentChar();
- var important;
- var merge;
- var isVariable;
- if (c === '.' || c === '#' || c === '&' || c === ':') {
- return;
- }
- parserInput.save();
- name = this.variable() || this.ruleProperty();
- if (name) {
- isVariable = typeof name === 'string';
- if (isVariable) {
- value = this.detachedRuleset();
- if (value) {
- hasDR = true;
- }
- }
- parserInput.commentStore.length = 0;
- if (!value) {
- // a name returned by this.ruleProperty() is always an array of the form:
- // [string-1, ..., string-n, ""] or [string-1, ..., string-n, "+"]
- // where each item is a tree.Keyword or tree.Variable
- merge = !isVariable && name.length > 1 && name.pop().value;
- // Custom property values get permissive parsing
- if (name[0].value && name[0].value.slice(0, 2) === '--') {
- if (parserInput.$char(';')) {
- value = new Anonymous('');
- }
- else {
- value = this.permissiveValue(/[;}]/, true);
- }
- }
- // Try to store values as anonymous
- // If we need the value later we'll re-parse it in ruleset.parseValue
- else {
- value = this.anonymousValue();
- }
- if (value) {
- parserInput.forget();
- // anonymous values absorb the end ';' which is required for them to work
- return new (tree.Declaration)(name, value, false, merge, index + currentIndex, fileInfo);
- }
- if (!value) {
- value = this.value();
- }
- if (value) {
- important = this.important();
- }
- else if (isVariable) {
- /**
- * As a last resort, try permissiveValue
- *
- * @todo - This has created some knock-on problems of not
- * flagging incorrect syntax or detecting user intent.
- */
- value = this.permissiveValue();
- }
- }
- if (value && (this.end() || hasDR)) {
- parserInput.forget();
- return new (tree.Declaration)(name, value, important, merge, index + currentIndex, fileInfo);
- }
- else {
- parserInput.restore();
- }
- }
- else {
- parserInput.restore();
- }
- },
- anonymousValue: function () {
- var index = parserInput.i;
- var match = parserInput.$re(/^([^.#@$+/'"*`(;{}-]*);/);
- if (match) {
- return new (tree.Anonymous)(match[1], index + currentIndex);
- }
- },
- /**
- * Used for custom properties, at-rules, and variables (as fallback)
- * Parses almost anything inside of {} [] () "" blocks
- * until it reaches outer-most tokens.
- *
- * First, it will try to parse comments and entities to reach
- * the end. This is mostly like the Expression parser except no
- * math is allowed.
- *
- * @param {RexExp} untilTokens - Characters to stop parsing at
- */
- permissiveValue: function (untilTokens) {
- var i;
- var e;
- var done;
- var value;
- var tok = untilTokens || ';';
- var index = parserInput.i;
- var result = [];
- function testCurrentChar() {
- var char = parserInput.currentChar();
- if (typeof tok === 'string') {
- return char === tok;
- }
- else {
- return tok.test(char);
- }
- }
- if (testCurrentChar()) {
- return;
- }
- value = [];
- do {
- e = this.comment();
- if (e) {
- value.push(e);
- continue;
- }
- e = this.entity();
- if (e) {
- value.push(e);
- }
- if (parserInput.peek(',')) {
- value.push(new (tree.Anonymous)(',', parserInput.i));
- parserInput.$char(',');
- }
- } while (e);
- done = testCurrentChar();
- if (value.length > 0) {
- value = new (tree.Expression)(value);
- if (done) {
- return value;
- }
- else {
- result.push(value);
- }
- // Preserve space before $parseUntil as it will not
- if (parserInput.prevChar() === ' ') {
- result.push(new tree.Anonymous(' ', index));
- }
- }
- parserInput.save();
- value = parserInput.$parseUntil(tok);
- if (value) {
- if (typeof value === 'string') {
- error("Expected '".concat(value, "'"), 'Parse');
- }
- if (value.length === 1 && value[0] === ' ') {
- parserInput.forget();
- return new tree.Anonymous('', index);
- }
- /** @type {string} */
- var item = void 0;
- for (i = 0; i < value.length; i++) {
- item = value[i];
- if (Array.isArray(item)) {
- // Treat actual quotes as normal quoted values
- result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));
- }
- else {
- if (i === value.length - 1) {
- item = item.trim();
- }
- // Treat like quoted values, but replace vars like unquoted expressions
- var quote = new tree.Quoted('\'', item, true, index, fileInfo);
- var variableRegex = /@([\w-]+)/g;
- var propRegex = /\$([\w-]+)/g;
- if (variableRegex.test(item)) {
- warn('@[ident] in unknown values will not be evaluated as variables in the future. Use @{[ident]}', index, 'DEPRECATED');
- }
- if (propRegex.test(item)) {
- warn('$[ident] in unknown values will not be evaluated as property references in the future. Use ${[ident]}', index, 'DEPRECATED');
- }
- quote.variableRegex = /@([\w-]+)|@{([\w-]+)}/g;
- quote.propRegex = /\$([\w-]+)|\${([\w-]+)}/g;
- result.push(quote);
- }
- }
- parserInput.forget();
- return new tree.Expression(result, true);
- }
- parserInput.restore();
- },
- //
- // An @import atrule
- //
- // @import "lib";
- //
- // Depending on our environment, importing is done differently:
- // In the browser, it's an XHR request, in Node, it would be a
- // file-system operation. The function used for importing is
- // stored in `import`, which we pass to the Import constructor.
- //
- 'import': function () {
- var path;
- var features;
- var index = parserInput.i;
- var dir = parserInput.$re(/^@import\s+/);
- if (dir) {
- var options = (dir ? this.importOptions() : null) || {};
- if ((path = this.entities.quoted() || this.entities.url())) {
- features = this.mediaFeatures({});
- if (!parserInput.$char(';')) {
- parserInput.i = index;
- error('missing semi-colon or unrecognised media features on import');
- }
- features = features && new (tree.Value)(features);
- return new (tree.Import)(path, features, options, index + currentIndex, fileInfo);
- }
- else {
- parserInput.i = index;
- error('malformed import statement');
- }
- }
- },
- importOptions: function () {
- var o;
- var options = {};
- var optionName;
- var value;
- // list of options, surrounded by parens
- if (!parserInput.$char('(')) {
- return null;
- }
- do {
- o = this.importOption();
- if (o) {
- optionName = o;
- value = true;
- switch (optionName) {
- case 'css':
- optionName = 'less';
- value = false;
- break;
- case 'once':
- optionName = 'multiple';
- value = false;
- break;
- }
- options[optionName] = value;
- if (!parserInput.$char(',')) {
- break;
- }
- }
- } while (o);
- expectChar(')');
- return options;
- },
- importOption: function () {
- var opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);
- if (opt) {
- return opt[1];
- }
- },
- mediaFeature: function (syntaxOptions) {
- var entities = this.entities;
- var nodes = [];
- var e;
- var p;
- var rangeP;
- var spacing = false;
- parserInput.save();
- do {
- parserInput.save();
- if (parserInput.$re(/^[0-9a-z-]*\s+\(/)) {
- spacing = true;
- }
- parserInput.restore();
- e = entities.declarationCall.bind(this)() || entities.keyword() || entities.variable() || entities.mixinLookup();
- if (e) {
- nodes.push(e);
- }
- else if (parserInput.$char('(')) {
- p = this.property();
- parserInput.save();
- if (!p && syntaxOptions.queryInParens && parserInput.$re(/^[0-9a-z-]*\s*([<>]=|<=|>=|[<>]|=)/)) {
- parserInput.restore();
- p = this.condition();
- parserInput.save();
- rangeP = this.atomicCondition(null, p.rvalue);
- if (!rangeP) {
- parserInput.restore();
- }
- }
- else {
- parserInput.restore();
- e = this.value();
- }
- if (parserInput.$char(')')) {
- if (p && !e) {
- nodes.push(new (tree.Paren)(new (tree.QueryInParens)(p.op, p.lvalue, p.rvalue, rangeP ? rangeP.op : null, rangeP ? rangeP.rvalue : null, p._index)));
- e = p;
- }
- else if (p && e) {
- nodes.push(new (tree.Paren)(new (tree.Declaration)(p, e, null, null, parserInput.i + currentIndex, fileInfo, true)));
- if (!spacing) {
- nodes[nodes.length - 1].noSpacing = true;
- }
- spacing = false;
- }
- else if (e) {
- nodes.push(new (tree.Paren)(e));
- spacing = false;
- }
- else {
- error('badly formed media feature definition');
- }
- }
- else {
- error('Missing closing \')\'', 'Parse');
- }
- }
- } while (e);
- parserInput.forget();
- if (nodes.length > 0) {
- return new (tree.Expression)(nodes);
- }
- },
- mediaFeatures: function (syntaxOptions) {
- var entities = this.entities;
- var features = [];
- var e;
- do {
- e = this.mediaFeature(syntaxOptions);
- if (e) {
- features.push(e);
- if (!parserInput.$char(',')) {
- break;
- }
- else if (!features[features.length - 1].noSpacing) {
- features[features.length - 1].noSpacing = false;
- }
- }
- else {
- e = entities.variable() || entities.mixinLookup();
- if (e) {
- features.push(e);
- if (!parserInput.$char(',')) {
- break;
- }
- else if (!features[features.length - 1].noSpacing) {
- features[features.length - 1].noSpacing = false;
- }
- }
- }
- } while (e);
- return features.length > 0 ? features : null;
- },
- prepareAndGetNestableAtRule: function (treeType, index, debugInfo, syntaxOptions) {
- var features = this.mediaFeatures(syntaxOptions);
- var rules = this.block();
- if (!rules) {
- error('media definitions require block statements after any features');
- }
- parserInput.forget();
- var atRule = new (treeType)(rules, features, index + currentIndex, fileInfo);
- if (context.dumpLineNumbers) {
- atRule.debugInfo = debugInfo;
- }
- return atRule;
- },
- nestableAtRule: function () {
- var debugInfo;
- var index = parserInput.i;
- if (context.dumpLineNumbers) {
- debugInfo = getDebugInfo(index);
- }
- parserInput.save();
- if (parserInput.$peekChar('@')) {
- if (parserInput.$str('@media')) {
- return this.prepareAndGetNestableAtRule(tree.Media, index, debugInfo, MediaSyntaxOptions);
- }
- if (parserInput.$str('@container')) {
- return this.prepareAndGetNestableAtRule(tree.Container, index, debugInfo, ContainerSyntaxOptions);
- }
- }
- parserInput.restore();
- },
- //
- // A @plugin directive, used to import plugins dynamically.
- //
- // @plugin (args) "lib";
- //
- plugin: function () {
- var path;
- var args;
- var options;
- var index = parserInput.i;
- var dir = parserInput.$re(/^@plugin\s+/);
- if (dir) {
- args = this.pluginArgs();
- if (args) {
- options = {
- pluginArgs: args,
- isPlugin: true
- };
- }
- else {
- options = { isPlugin: true };
- }
- if ((path = this.entities.quoted() || this.entities.url())) {
- if (!parserInput.$char(';')) {
- parserInput.i = index;
- error('missing semi-colon on @plugin');
- }
- return new (tree.Import)(path, null, options, index + currentIndex, fileInfo);
- }
- else {
- parserInput.i = index;
- error('malformed @plugin statement');
- }
- }
- },
- pluginArgs: function () {
- // list of options, surrounded by parens
- parserInput.save();
- if (!parserInput.$char('(')) {
- parserInput.restore();
- return null;
- }
- var args = parserInput.$re(/^\s*([^);]+)\)\s*/);
- if (args[1]) {
- parserInput.forget();
- return args[1].trim();
- }
- else {
- parserInput.restore();
- return null;
- }
- },
- atruleUnknown: function (value, name, hasBlock) {
- value = this.permissiveValue(/^[{;]/);
- hasBlock = (parserInput.currentChar() === '{');
- if (!value) {
- if (!hasBlock && parserInput.currentChar() !== ';') {
- error(''.concat(name, ' rule is missing block or ending semi-colon'));
- }
- }
- else if (!value.value) {
- value = null;
- }
- return [value, hasBlock];
- },
- atruleBlock: function (rules, value, isRooted, isKeywordList) {
- rules = this.blockRuleset();
- parserInput.save();
- if (!rules && !isRooted) {
- value = this.entity();
- rules = this.blockRuleset();
- }
- if (!rules && !isRooted) {
- parserInput.restore();
- var e = [];
- value = this.entity();
- while (parserInput.$char(',')) {
- e.push(value);
- value = this.entity();
- }
- if (value && e.length > 0) {
- e.push(value);
- value = e;
- isKeywordList = true;
- }
- else {
- rules = this.blockRuleset();
- }
- }
- else {
- parserInput.forget();
- }
- return [rules, value, isKeywordList];
- },
- //
- // A CSS AtRule
- //
- // @charset "utf-8";
- //
- atrule: function () {
- var index = parserInput.i;
- var name;
- var value;
- var rules;
- var nonVendorSpecificName;
- var hasIdentifier;
- var hasExpression;
- var hasUnknown;
- var hasBlock = true;
- var isRooted = true;
- var isKeywordList = false;
- if (parserInput.currentChar() !== '@') {
- return;
- }
- value = this['import']() || this.plugin() || this.nestableAtRule();
- if (value) {
- return value;
- }
- parserInput.save();
- name = parserInput.$re(/^@[a-z-]+/);
- if (!name) {
- return;
- }
- nonVendorSpecificName = name;
- if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {
- nonVendorSpecificName = "@".concat(name.slice(name.indexOf('-', 2) + 1));
- }
- switch (nonVendorSpecificName) {
- case '@charset':
- hasIdentifier = true;
- hasBlock = false;
- break;
- case '@namespace':
- hasExpression = true;
- hasBlock = false;
- break;
- case '@keyframes':
- case '@counter-style':
- hasIdentifier = true;
- break;
- case '@document':
- case '@supports':
- hasUnknown = true;
- isRooted = false;
- break;
- case '@starting-style':
- isRooted = false;
- break;
- case '@layer':
- isRooted = false;
- break;
- default:
- hasUnknown = true;
- break;
- }
- parserInput.commentStore.length = 0;
- if (hasIdentifier) {
- value = this.entity();
- if (!value) {
- error("expected ".concat(name, " identifier"));
- }
- }
- else if (hasExpression) {
- value = this.expression();
- if (!value) {
- error("expected ".concat(name, " expression"));
- }
- }
- else if (hasUnknown) {
- var unknownPackage = this.atruleUnknown(value, name, hasBlock);
- value = unknownPackage[0];
- hasBlock = unknownPackage[1];
- }
- if (hasBlock) {
- var blockPackage = this.atruleBlock(rules, value, isRooted, isKeywordList);
- rules = blockPackage[0];
- value = blockPackage[1];
- isKeywordList = blockPackage[2];
- if (!rules && !hasUnknown) {
- parserInput.restore();
- name = parserInput.$re(/^@[a-z-]+/);
- var unknownPackage = this.atruleUnknown(value, name, hasBlock);
- value = unknownPackage[0];
- hasBlock = unknownPackage[1];
- if (hasBlock) {
- blockPackage = this.atruleBlock(rules, value, isRooted, isKeywordList);
- rules = blockPackage[0];
- value = blockPackage[1];
- isKeywordList = blockPackage[2];
- }
- }
- }
- if (rules || isKeywordList || (!hasBlock && value && parserInput.$char(';'))) {
- parserInput.forget();
- return new (tree.AtRule)(name, value, rules, index + currentIndex, fileInfo, context.dumpLineNumbers ? getDebugInfo(index) : null, isRooted);
- }
- parserInput.restore('at-rule options not recognised');
- },
- //
- // A Value is a comma-delimited list of Expressions
- //
- // font-family: Baskerville, Georgia, serif;
- //
- // In a Rule, a Value represents everything after the `:`,
- // and before the `;`.
- //
- value: function () {
- var e;
- var expressions = [];
- var index = parserInput.i;
- do {
- e = this.expression();
- if (e) {
- expressions.push(e);
- if (!parserInput.$char(',')) {
- break;
- }
- }
- } while (e);
- if (expressions.length > 0) {
- return new (tree.Value)(expressions, index + currentIndex);
- }
- },
- important: function () {
- if (parserInput.currentChar() === '!') {
- return parserInput.$re(/^! *important/);
- }
- },
- sub: function () {
- var a;
- var e;
- parserInput.save();
- if (parserInput.$char('(')) {
- a = this.addition();
- if (a && parserInput.$char(')')) {
- parserInput.forget();
- e = new (tree.Expression)([a]);
- e.parens = true;
- return e;
- }
- parserInput.restore('Expected \')\'');
- return;
- }
- parserInput.restore();
- },
- colorOperand: function () {
- parserInput.save();
- // hsl or rgb or lch operand
- var match = parserInput.$re(/^[lchrgbs]\s+/);
- if (match) {
- return new tree.Keyword(match[0]);
- }
- parserInput.restore();
- },
- multiplication: function () {
- var m;
- var a;
- var op;
- var operation;
- var isSpaced;
- m = this.operand();
- if (m) {
- isSpaced = parserInput.isWhitespace(-1);
- while (true) {
- if (parserInput.peek(/^\/[*/]/)) {
- break;
- }
- parserInput.save();
- op = parserInput.$char('/') || parserInput.$char('*');
- if (!op) {
- var index = parserInput.i;
- op = parserInput.$str('./');
- if (op) {
- warn('./ operator is deprecated', index, 'DEPRECATED');
- }
- }
- if (!op) {
- parserInput.forget();
- break;
- }
- a = this.operand();
- if (!a) {
- parserInput.restore();
- break;
- }
- parserInput.forget();
- m.parensInOp = true;
- a.parensInOp = true;
- operation = new (tree.Operation)(op, [operation || m, a], isSpaced);
- isSpaced = parserInput.isWhitespace(-1);
- }
- return operation || m;
- }
- },
- addition: function () {
- var m;
- var a;
- var op;
- var operation;
- var isSpaced;
- m = this.multiplication();
- if (m) {
- isSpaced = parserInput.isWhitespace(-1);
- while (true) {
- op = parserInput.$re(/^[-+]\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));
- if (!op) {
- break;
- }
- a = this.multiplication();
- if (!a) {
- break;
- }
- m.parensInOp = true;
- a.parensInOp = true;
- operation = new (tree.Operation)(op, [operation || m, a], isSpaced);
- isSpaced = parserInput.isWhitespace(-1);
- }
- return operation || m;
- }
- },
- conditions: function () {
- var a;
- var b;
- var index = parserInput.i;
- var condition;
- a = this.condition(true);
- if (a) {
- while (true) {
- if (!parserInput.peek(/^,\s*(not\s*)?\(/) || !parserInput.$char(',')) {
- break;
- }
- b = this.condition(true);
- if (!b) {
- break;
- }
- condition = new (tree.Condition)('or', condition || a, b, index + currentIndex);
- }
- return condition || a;
- }
- },
- condition: function (needsParens) {
- var result;
- var logical;
- var next;
- function or() {
- return parserInput.$str('or');
- }
- result = this.conditionAnd(needsParens);
- if (!result) {
- return;
- }
- logical = or();
- if (logical) {
- next = this.condition(needsParens);
- if (next) {
- result = new (tree.Condition)(logical, result, next);
- }
- else {
- return;
- }
- }
- return result;
- },
- conditionAnd: function (needsParens) {
- var result;
- var logical;
- var next;
- var self = this;
- function insideCondition() {
- var cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);
- if (!cond && !needsParens) {
- return self.atomicCondition(needsParens);
- }
- return cond;
- }
- function and() {
- return parserInput.$str('and');
- }
- result = insideCondition();
- if (!result) {
- return;
- }
- logical = and();
- if (logical) {
- next = this.conditionAnd(needsParens);
- if (next) {
- result = new (tree.Condition)(logical, result, next);
- }
- else {
- return;
- }
- }
- return result;
- },
- negatedCondition: function (needsParens) {
- if (parserInput.$str('not')) {
- var result = this.parenthesisCondition(needsParens);
- if (result) {
- result.negate = !result.negate;
- }
- return result;
- }
- },
- parenthesisCondition: function (needsParens) {
- function tryConditionFollowedByParenthesis(me) {
- var body;
- parserInput.save();
- body = me.condition(needsParens);
- if (!body) {
- parserInput.restore();
- return;
- }
- if (!parserInput.$char(')')) {
- parserInput.restore();
- return;
- }
- parserInput.forget();
- return body;
- }
- var body;
- parserInput.save();
- if (!parserInput.$str('(')) {
- parserInput.restore();
- return;
- }
- body = tryConditionFollowedByParenthesis(this);
- if (body) {
- parserInput.forget();
- return body;
- }
- body = this.atomicCondition(needsParens);
- if (!body) {
- parserInput.restore();
- return;
- }
- if (!parserInput.$char(')')) {
- parserInput.restore("expected ')' got '".concat(parserInput.currentChar(), "'"));
- return;
- }
- parserInput.forget();
- return body;
- },
- atomicCondition: function (needsParens, preparsedCond) {
- var entities = this.entities;
- var index = parserInput.i;
- var a;
- var b;
- var c;
- var op;
- var cond = (function () {
- return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();
- }).bind(this);
- if (preparsedCond) {
- a = preparsedCond;
- }
- else {
- a = cond();
- }
- if (a) {
- if (parserInput.$char('>')) {
- if (parserInput.$char('=')) {
- op = '>=';
- }
- else {
- op = '>';
- }
- }
- else if (parserInput.$char('<')) {
- if (parserInput.$char('=')) {
- op = '<=';
- }
- else {
- op = '<';
- }
- }
- else if (parserInput.$char('=')) {
- if (parserInput.$char('>')) {
- op = '=>';
- }
- else if (parserInput.$char('<')) {
- op = '=<';
- }
- else {
- op = '=';
- }
- }
- if (op) {
- b = cond();
- if (b) {
- c = new (tree.Condition)(op, a, b, index + currentIndex, false);
- }
- else {
- error('expected expression');
- }
- }
- else if (!preparsedCond) {
- c = new (tree.Condition)('=', a, new (tree.Keyword)('true'), index + currentIndex, false);
- }
- return c;
- }
- },
- //
- // An operand is anything that can be part of an operation,
- // such as a Color, or a Variable
- //
- operand: function () {
- var entities = this.entities;
- var negate;
- if (parserInput.peek(/^-[@$(]/)) {
- negate = parserInput.$char('-');
- }
- var o = this.sub() || entities.dimension() ||
- entities.color() || entities.variable() ||
- entities.property() || entities.call() ||
- entities.quoted(true) || entities.colorKeyword() ||
- this.colorOperand() || entities.mixinLookup();
- if (negate) {
- o.parensInOp = true;
- o = new (tree.Negative)(o);
- }
- return o;
- },
- //
- // Expressions either represent mathematical operations,
- // or white-space delimited Entities.
- //
- // 1px solid black
- // @var * 2
- //
- expression: function () {
- var entities = [];
- var e;
- var delim;
- var index = parserInput.i;
- do {
- e = this.comment();
- if (e && !e.isLineComment) {
- entities.push(e);
- continue;
- }
- e = this.addition() || this.entity();
- if (e instanceof tree.Comment) {
- e = null;
- }
- if (e) {
- entities.push(e);
- // operations do not allow keyword "/" dimension (e.g. small/20px) so we support that here
- if (!parserInput.peek(/^\/[/*]/)) {
- delim = parserInput.$char('/');
- if (delim) {
- entities.push(new (tree.Anonymous)(delim, index + currentIndex));
- }
- }
- }
- } while (e);
- if (entities.length > 0) {
- return new (tree.Expression)(entities);
- }
- },
- property: function () {
- var name = parserInput.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);
- if (name) {
- return name[1];
- }
- },
- ruleProperty: function () {
- var name = [];
- var index = [];
- var s;
- var k;
- parserInput.save();
- var simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\s*:/);
- if (simpleProperty) {
- name = [new (tree.Keyword)(simpleProperty[1])];
- parserInput.forget();
- return name;
- }
- function match(re) {
- var i = parserInput.i;
- var chunk = parserInput.$re(re);
- if (chunk) {
- index.push(i);
- return name.push(chunk[1]);
- }
- }
- match(/^(\*?)/);
- while (true) {
- if (!match(/^((?:[\w-]+)|(?:[@$]\{[\w-]+\}))/)) {
- break;
- }
- }
- if ((name.length > 1) && match(/^((?:\+_|\+)?)\s*:/)) {
- parserInput.forget();
- // at last, we have the complete match now. move forward,
- // convert name particles to tree objects and return:
- if (name[0] === '') {
- name.shift();
- index.shift();
- }
- for (k = 0; k < name.length; k++) {
- s = name[k];
- name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?
- new (tree.Keyword)(s) :
- (s.charAt(0) === '@' ?
- new (tree.Variable)("@".concat(s.slice(2, -1)), index[k] + currentIndex, fileInfo) :
- new (tree.Property)("$".concat(s.slice(2, -1)), index[k] + currentIndex, fileInfo));
- }
- return name;
- }
- parserInput.restore();
- }
- }
- };
- };
- Parser.serializeVars = function (vars) {
- var s = '';
- for (var name_1 in vars) {
- if (Object.hasOwnProperty.call(vars, name_1)) {
- var value = vars[name_1];
- s += "".concat(((name_1[0] === '@') ? '' : '@') + name_1, ": ").concat(value).concat((String(value).slice(-1) === ';') ? '' : ';');
- }
- }
- return s;
- };
-
- var Selector = function (elements, extendList, condition, index, currentFileInfo, visibilityInfo) {
- this.extendList = extendList;
- this.condition = condition;
- this.evaldCondition = !condition;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.elements = this.getElements(elements);
- this.mixinElements_ = undefined;
- this.copyVisibilityInfo(visibilityInfo);
- this.setParent(this.elements, this);
- };
- Selector.prototype = Object.assign(new Node(), {
- type: 'Selector',
- accept: function (visitor) {
- if (this.elements) {
- this.elements = visitor.visitArray(this.elements);
- }
- if (this.extendList) {
- this.extendList = visitor.visitArray(this.extendList);
- }
- if (this.condition) {
- this.condition = visitor.visit(this.condition);
- }
- },
- createDerived: function (elements, extendList, evaldCondition) {
- elements = this.getElements(elements);
- var newSelector = new Selector(elements, extendList || this.extendList, null, this.getIndex(), this.fileInfo(), this.visibilityInfo());
- newSelector.evaldCondition = (!isNullOrUndefined(evaldCondition)) ? evaldCondition : this.evaldCondition;
- newSelector.mediaEmpty = this.mediaEmpty;
- return newSelector;
- },
- getElements: function (els) {
- if (!els) {
- return [new Element('', '&', false, this._index, this._fileInfo)];
- }
- if (typeof els === 'string') {
- new Parser(this.parse.context, this.parse.importManager, this._fileInfo, this._index).parseNode(els, ['selector'], function (err, result) {
- if (err) {
- throw new LessError({
- index: err.index,
- message: err.message
- }, this.parse.imports, this._fileInfo.filename);
- }
- els = result[0].elements;
- });
- }
- return els;
- },
- createEmptySelectors: function () {
- var el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];
- sels[0].mediaEmpty = true;
- return sels;
- },
- match: function (other) {
- var elements = this.elements;
- var len = elements.length;
- var olen;
- var i;
- other = other.mixinElements();
- olen = other.length;
- if (olen === 0 || len < olen) {
- return 0;
- }
- else {
- for (i = 0; i < olen; i++) {
- if (elements[i].value !== other[i]) {
- return 0;
- }
- }
- }
- return olen; // return number of matched elements
- },
- mixinElements: function () {
- if (this.mixinElements_) {
- return this.mixinElements_;
- }
- var elements = this.elements.map(function (v) {
- return v.combinator.value + (v.value.value || v.value);
- }).join('').match(/[,*.\w-]([\w-]|(\\.))*/g);
- if (elements) {
- if (elements[0] === '&') {
- elements.shift();
- }
- }
- else {
- elements = [];
- }
- return (this.mixinElements_ = elements);
- },
- isJustParentSelector: function () {
- return !this.mediaEmpty &&
- this.elements.length === 1 &&
- this.elements[0].value === '&' &&
- (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');
- },
- eval: function (context) {
- var evaldCondition = this.condition && this.condition.eval(context);
- var elements = this.elements;
- var extendList = this.extendList;
- elements = elements && elements.map(function (e) { return e.eval(context); });
- extendList = extendList && extendList.map(function (extend) { return extend.eval(context); });
- return this.createDerived(elements, extendList, evaldCondition);
- },
- genCSS: function (context, output) {
- var i, element;
- if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {
- output.add(' ', this.fileInfo(), this.getIndex());
- }
- for (i = 0; i < this.elements.length; i++) {
- element = this.elements[i];
- element.genCSS(context, output);
- }
- },
- getIsOutput: function () {
- return this.evaldCondition;
- }
- });
-
- var Value = function (value) {
- if (!value) {
- throw new Error('Value requires an array argument');
- }
- if (!Array.isArray(value)) {
- this.value = [value];
- }
- else {
- this.value = value;
- }
- };
- Value.prototype = Object.assign(new Node(), {
- type: 'Value',
- accept: function (visitor) {
- if (this.value) {
- this.value = visitor.visitArray(this.value);
- }
- },
- eval: function (context) {
- if (this.value.length === 1) {
- return this.value[0].eval(context);
- }
- else {
- return new Value(this.value.map(function (v) {
- return v.eval(context);
- }));
- }
- },
- genCSS: function (context, output) {
- var i;
- for (i = 0; i < this.value.length; i++) {
- this.value[i].genCSS(context, output);
- if (i + 1 < this.value.length) {
- output.add((context && context.compress) ? ',' : ', ');
- }
- }
- }
- });
-
- var Keyword = function (value) {
- this.value = value;
- };
- Keyword.prototype = Object.assign(new Node(), {
- type: 'Keyword',
- genCSS: function (context, output) {
- if (this.value === '%') {
- throw { type: 'Syntax', message: 'Invalid % without number' };
- }
- output.add(this.value);
- }
- });
- Keyword.True = new Keyword('true');
- Keyword.False = new Keyword('false');
-
- var MATH$1 = Math$1;
- function evalName(context, name) {
- var value = '';
- var i;
- var n = name.length;
- var output = { add: function (s) { value += s; } };
- for (i = 0; i < n; i++) {
- name[i].eval(context).genCSS(context, output);
- }
- return value;
- }
- var Declaration = function (name, value, important, merge, index, currentFileInfo, inline, variable) {
- this.name = name;
- this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);
- this.important = important ? " ".concat(important.trim()) : '';
- this.merge = merge;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.inline = inline || false;
- this.variable = (variable !== undefined) ? variable
- : (name.charAt && (name.charAt(0) === '@'));
- this.allowRoot = true;
- this.setParent(this.value, this);
- };
- Declaration.prototype = Object.assign(new Node(), {
- type: 'Declaration',
- genCSS: function (context, output) {
- output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());
- try {
- this.value.genCSS(context, output);
- }
- catch (e) {
- e.index = this._index;
- e.filename = this._fileInfo.filename;
- throw e;
- }
- output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);
- },
- eval: function (context) {
- var mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;
- if (typeof name !== 'string') {
- // expand 'primitive' name directly to get
- // things faster (~10% for benchmark.less):
- name = (name.length === 1) && (name[0] instanceof Keyword) ?
- name[0].value : evalName(context, name);
- variable = false; // never treat expanded interpolation as new variable name
- }
- // @todo remove when parens-division is default
- if (name === 'font' && context.math === MATH$1.ALWAYS) {
- mathBypass = true;
- prevMath = context.math;
- context.math = MATH$1.PARENS_DIVISION;
- }
- try {
- context.importantScope.push({});
- evaldValue = this.value.eval(context);
- if (!this.variable && evaldValue.type === 'DetachedRuleset') {
- throw { message: 'Rulesets cannot be evaluated on a property.',
- index: this.getIndex(), filename: this.fileInfo().filename };
- }
- var important = this.important;
- var importantResult = context.importantScope.pop();
- if (!important && importantResult.important) {
- important = importantResult.important;
- }
- return new Declaration(name, evaldValue, important, this.merge, this.getIndex(), this.fileInfo(), this.inline, variable);
- }
- catch (e) {
- if (typeof e.index !== 'number') {
- e.index = this.getIndex();
- e.filename = this.fileInfo().filename;
- }
- throw e;
- }
- finally {
- if (mathBypass) {
- context.math = prevMath;
- }
- }
- },
- makeImportant: function () {
- return new Declaration(this.name, this.value, '!important', this.merge, this.getIndex(), this.fileInfo(), this.inline);
- }
- });
-
- function asComment(ctx) {
- return "/* line ".concat(ctx.debugInfo.lineNumber, ", ").concat(ctx.debugInfo.fileName, " */\n");
- }
- function asMediaQuery(ctx) {
- var filenameWithProtocol = ctx.debugInfo.fileName;
- if (!/^[a-z]+:\/\//i.test(filenameWithProtocol)) {
- filenameWithProtocol = "file://".concat(filenameWithProtocol);
- }
- return "@media -sass-debug-info{filename{font-family:".concat(filenameWithProtocol.replace(/([.:/\\])/g, function (a) {
- if (a == '\\') {
- a = '/';
- }
- return "\\".concat(a);
- }), "}line{font-family:\\00003").concat(ctx.debugInfo.lineNumber, "}}\n");
- }
- function debugInfo(context, ctx, lineSeparator) {
- var result = '';
- if (context.dumpLineNumbers && !context.compress) {
- switch (context.dumpLineNumbers) {
- case 'comments':
- result = asComment(ctx);
- break;
- case 'mediaquery':
- result = asMediaQuery(ctx);
- break;
- case 'all':
- result = asComment(ctx) + (lineSeparator || '') + asMediaQuery(ctx);
- break;
- }
- }
- return result;
- }
-
- var Comment = function (value, isLineComment, index, currentFileInfo) {
- this.value = value;
- this.isLineComment = isLineComment;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.allowRoot = true;
- };
- Comment.prototype = Object.assign(new Node(), {
- type: 'Comment',
- genCSS: function (context, output) {
- if (this.debugInfo) {
- output.add(debugInfo(context, this), this.fileInfo(), this.getIndex());
- }
- output.add(this.value);
- },
- isSilent: function (context) {
- var isCompressed = context.compress && this.value[2] !== '!';
- return this.isLineComment || isCompressed;
- }
- });
-
- var defaultFunc = {
- eval: function () {
- var v = this.value_;
- var e = this.error_;
- if (e) {
- throw e;
- }
- if (!isNullOrUndefined(v)) {
- return v ? Keyword.True : Keyword.False;
- }
- },
- value: function (v) {
- this.value_ = v;
- },
- error: function (e) {
- this.error_ = e;
- },
- reset: function () {
- this.value_ = this.error_ = null;
- }
- };
-
- var Ruleset = function (selectors, rules, strictImports, visibilityInfo) {
- this.selectors = selectors;
- this.rules = rules;
- this._lookups = {};
- this._variables = null;
- this._properties = null;
- this.strictImports = strictImports;
- this.copyVisibilityInfo(visibilityInfo);
- this.allowRoot = true;
- this.setParent(this.selectors, this);
- this.setParent(this.rules, this);
- };
- Ruleset.prototype = Object.assign(new Node(), {
- type: 'Ruleset',
- isRuleset: true,
- isRulesetLike: function () { return true; },
- accept: function (visitor) {
- if (this.paths) {
- this.paths = visitor.visitArray(this.paths, true);
- }
- else if (this.selectors) {
- this.selectors = visitor.visitArray(this.selectors);
- }
- if (this.rules && this.rules.length) {
- this.rules = visitor.visitArray(this.rules);
- }
- },
- eval: function (context) {
- var selectors;
- var selCnt;
- var selector;
- var i;
- var hasVariable;
- var hasOnePassingSelector = false;
- if (this.selectors && (selCnt = this.selectors.length)) {
- selectors = new Array(selCnt);
- defaultFunc.error({
- type: 'Syntax',
- message: 'it is currently only allowed in parametric mixin guards,'
- });
- for (i = 0; i < selCnt; i++) {
- selector = this.selectors[i].eval(context);
- for (var j = 0; j < selector.elements.length; j++) {
- if (selector.elements[j].isVariable) {
- hasVariable = true;
- break;
- }
- }
- selectors[i] = selector;
- if (selector.evaldCondition) {
- hasOnePassingSelector = true;
- }
- }
- if (hasVariable) {
- var toParseSelectors = new Array(selCnt);
- for (i = 0; i < selCnt; i++) {
- selector = selectors[i];
- toParseSelectors[i] = selector.toCSS(context);
- }
- var startingIndex = selectors[0].getIndex();
- var selectorFileInfo = selectors[0].fileInfo();
- new Parser(context, this.parse.importManager, selectorFileInfo, startingIndex).parseNode(toParseSelectors.join(','), ['selectors'], function (err, result) {
- if (result) {
- selectors = flattenArray(result);
- }
- });
- }
- defaultFunc.reset();
- }
- else {
- hasOnePassingSelector = true;
- }
- var rules = this.rules ? copyArray(this.rules) : null;
- var ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());
- var rule;
- var subRule;
- ruleset.originalRuleset = this;
- ruleset.root = this.root;
- ruleset.firstRoot = this.firstRoot;
- ruleset.allowImports = this.allowImports;
- if (this.debugInfo) {
- ruleset.debugInfo = this.debugInfo;
- }
- if (!hasOnePassingSelector) {
- rules.length = 0;
- }
- // inherit a function registry from the frames stack when possible;
- // otherwise from the global registry
- ruleset.functionRegistry = (function (frames) {
- var i = 0;
- var n = frames.length;
- var found;
- for (; i !== n; ++i) {
- found = frames[i].functionRegistry;
- if (found) {
- return found;
- }
- }
- return functionRegistry;
- }(context.frames)).inherit();
- // push the current ruleset to the frames stack
- var ctxFrames = context.frames;
- ctxFrames.unshift(ruleset);
- // currrent selectors
- var ctxSelectors = context.selectors;
- if (!ctxSelectors) {
- context.selectors = ctxSelectors = [];
- }
- ctxSelectors.unshift(this.selectors);
- // Evaluate imports
- if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {
- ruleset.evalImports(context);
- }
- // Store the frames around mixin definitions,
- // so they can be evaluated like closures when the time comes.
- var rsRules = ruleset.rules;
- for (i = 0; (rule = rsRules[i]); i++) {
- if (rule.evalFirst) {
- rsRules[i] = rule.eval(context);
- }
- }
- var mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;
- // Evaluate mixin calls.
- for (i = 0; (rule = rsRules[i]); i++) {
- if (rule.type === 'MixinCall') {
- /* jshint loopfunc:true */
- rules = rule.eval(context).filter(function (r) {
- if ((r instanceof Declaration) && r.variable) {
- // do not pollute the scope if the variable is
- // already there. consider returning false here
- // but we need a way to "return" variable from mixins
- return !(ruleset.variable(r.name));
- }
- return true;
- });
- rsRules.splice.apply(rsRules, [i, 1].concat(rules));
- i += rules.length - 1;
- ruleset.resetCache();
- }
- else if (rule.type === 'VariableCall') {
- /* jshint loopfunc:true */
- rules = rule.eval(context).rules.filter(function (r) {
- if ((r instanceof Declaration) && r.variable) {
- // do not pollute the scope at all
- return false;
- }
- return true;
- });
- rsRules.splice.apply(rsRules, [i, 1].concat(rules));
- i += rules.length - 1;
- ruleset.resetCache();
- }
- }
- // Evaluate everything else
- for (i = 0; (rule = rsRules[i]); i++) {
- if (!rule.evalFirst) {
- rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;
- }
- }
- // Evaluate everything else
- for (i = 0; (rule = rsRules[i]); i++) {
- // for rulesets, check if it is a css guard and can be removed
- if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {
- // check if it can be folded in (e.g. & where)
- if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {
- rsRules.splice(i--, 1);
- for (var j = 0; (subRule = rule.rules[j]); j++) {
- if (subRule instanceof Node) {
- subRule.copyVisibilityInfo(rule.visibilityInfo());
- if (!(subRule instanceof Declaration) || !subRule.variable) {
- rsRules.splice(++i, 0, subRule);
- }
- }
- }
- }
- }
- }
- // Pop the stack
- ctxFrames.shift();
- ctxSelectors.shift();
- if (context.mediaBlocks) {
- for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {
- context.mediaBlocks[i].bubbleSelectors(selectors);
- }
- }
- return ruleset;
- },
- evalImports: function (context) {
- var rules = this.rules;
- var i;
- var importRules;
- if (!rules) {
- return;
- }
- for (i = 0; i < rules.length; i++) {
- if (rules[i].type === 'Import') {
- importRules = rules[i].eval(context);
- if (importRules && (importRules.length || importRules.length === 0)) {
- rules.splice.apply(rules, [i, 1].concat(importRules));
- i += importRules.length - 1;
- }
- else {
- rules.splice(i, 1, importRules);
- }
- this.resetCache();
- }
- }
- },
- makeImportant: function () {
- var result = new Ruleset(this.selectors, this.rules.map(function (r) {
- if (r.makeImportant) {
- return r.makeImportant();
- }
- else {
- return r;
- }
- }), this.strictImports, this.visibilityInfo());
- return result;
- },
- matchArgs: function (args) {
- return !args || args.length === 0;
- },
- // lets you call a css selector with a guard
- matchCondition: function (args, context) {
- var lastSelector = this.selectors[this.selectors.length - 1];
- if (!lastSelector.evaldCondition) {
- return false;
- }
- if (lastSelector.condition &&
- !lastSelector.condition.eval(new contexts.Eval(context, context.frames))) {
- return false;
- }
- return true;
- },
- resetCache: function () {
- this._rulesets = null;
- this._variables = null;
- this._properties = null;
- this._lookups = {};
- },
- variables: function () {
- if (!this._variables) {
- this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {
- if (r instanceof Declaration && r.variable === true) {
- hash[r.name] = r;
- }
- // when evaluating variables in an import statement, imports have not been eval'd
- // so we need to go inside import statements.
- // guard against root being a string (in the case of inlined less)
- if (r.type === 'Import' && r.root && r.root.variables) {
- var vars = r.root.variables();
- for (var name_1 in vars) {
- // eslint-disable-next-line no-prototype-builtins
- if (vars.hasOwnProperty(name_1)) {
- hash[name_1] = r.root.variable(name_1);
- }
- }
- }
- return hash;
- }, {});
- }
- return this._variables;
- },
- properties: function () {
- if (!this._properties) {
- this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {
- if (r instanceof Declaration && r.variable !== true) {
- var name_2 = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?
- r.name[0].value : r.name;
- // Properties don't overwrite as they can merge
- if (!hash["$".concat(name_2)]) {
- hash["$".concat(name_2)] = [r];
- }
- else {
- hash["$".concat(name_2)].push(r);
- }
- }
- return hash;
- }, {});
- }
- return this._properties;
- },
- variable: function (name) {
- var decl = this.variables()[name];
- if (decl) {
- return this.parseValue(decl);
- }
- },
- property: function (name) {
- var decl = this.properties()[name];
- if (decl) {
- return this.parseValue(decl);
- }
- },
- lastDeclaration: function () {
- for (var i_1 = this.rules.length; i_1 > 0; i_1--) {
- var decl = this.rules[i_1 - 1];
- if (decl instanceof Declaration) {
- return this.parseValue(decl);
- }
- }
- },
- parseValue: function (toParse) {
- var self = this;
- function transformDeclaration(decl) {
- if (decl.value instanceof Anonymous && !decl.parsed) {
- if (typeof decl.value.value === 'string') {
- new Parser(this.parse.context, this.parse.importManager, decl.fileInfo(), decl.value.getIndex()).parseNode(decl.value.value, ['value', 'important'], function (err, result) {
- if (err) {
- decl.parsed = true;
- }
- if (result) {
- decl.value = result[0];
- decl.important = result[1] || '';
- decl.parsed = true;
- }
- });
- }
- else {
- decl.parsed = true;
- }
- return decl;
- }
- else {
- return decl;
- }
- }
- if (!Array.isArray(toParse)) {
- return transformDeclaration.call(self, toParse);
- }
- else {
- var nodes_1 = [];
- toParse.forEach(function (n) {
- nodes_1.push(transformDeclaration.call(self, n));
- });
- return nodes_1;
- }
- },
- rulesets: function () {
- if (!this.rules) {
- return [];
- }
- var filtRules = [];
- var rules = this.rules;
- var i;
- var rule;
- for (i = 0; (rule = rules[i]); i++) {
- if (rule.isRuleset) {
- filtRules.push(rule);
- }
- }
- return filtRules;
- },
- prependRule: function (rule) {
- var rules = this.rules;
- if (rules) {
- rules.unshift(rule);
- }
- else {
- this.rules = [rule];
- }
- this.setParent(rule, this);
- },
- find: function (selector, self, filter) {
- self = self || this;
- var rules = [];
- var match;
- var foundMixins;
- var key = selector.toCSS();
- if (key in this._lookups) {
- return this._lookups[key];
- }
- this.rulesets().forEach(function (rule) {
- if (rule !== self) {
- for (var j = 0; j < rule.selectors.length; j++) {
- match = selector.match(rule.selectors[j]);
- if (match) {
- if (selector.elements.length > match) {
- if (!filter || filter(rule)) {
- foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);
- for (var i_2 = 0; i_2 < foundMixins.length; ++i_2) {
- foundMixins[i_2].path.push(rule);
- }
- Array.prototype.push.apply(rules, foundMixins);
- }
- }
- else {
- rules.push({ rule: rule, path: [] });
- }
- break;
- }
- }
- }
- });
- this._lookups[key] = rules;
- return rules;
- },
- genCSS: function (context, output) {
- var i;
- var j;
- var charsetRuleNodes = [];
- var ruleNodes = [];
- var // Line number debugging
- debugInfo$1;
- var rule;
- var path;
- context.tabLevel = (context.tabLevel || 0);
- if (!this.root) {
- context.tabLevel++;
- }
- var tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');
- var tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');
- var sep;
- var charsetNodeIndex = 0;
- var importNodeIndex = 0;
- for (i = 0; (rule = this.rules[i]); i++) {
- if (rule instanceof Comment) {
- if (importNodeIndex === i) {
- importNodeIndex++;
- }
- ruleNodes.push(rule);
- }
- else if (rule.isCharset && rule.isCharset()) {
- ruleNodes.splice(charsetNodeIndex, 0, rule);
- charsetNodeIndex++;
- importNodeIndex++;
- }
- else if (rule.type === 'Import') {
- ruleNodes.splice(importNodeIndex, 0, rule);
- importNodeIndex++;
- }
- else {
- ruleNodes.push(rule);
- }
- }
- ruleNodes = charsetRuleNodes.concat(ruleNodes);
- // If this is the root node, we don't render
- // a selector, or {}.
- if (!this.root) {
- debugInfo$1 = debugInfo(context, this, tabSetStr);
- if (debugInfo$1) {
- output.add(debugInfo$1);
- output.add(tabSetStr);
- }
- var paths = this.paths;
- var pathCnt = paths.length;
- var pathSubCnt = void 0;
- sep = context.compress ? ',' : (",\n".concat(tabSetStr));
- for (i = 0; i < pathCnt; i++) {
- path = paths[i];
- if (!(pathSubCnt = path.length)) {
- continue;
- }
- if (i > 0) {
- output.add(sep);
- }
- context.firstSelector = true;
- path[0].genCSS(context, output);
- context.firstSelector = false;
- for (j = 1; j < pathSubCnt; j++) {
- path[j].genCSS(context, output);
- }
- }
- output.add((context.compress ? '{' : ' {\n') + tabRuleStr);
- }
- // Compile rules and rulesets
- for (i = 0; (rule = ruleNodes[i]); i++) {
- if (i + 1 === ruleNodes.length) {
- context.lastRule = true;
- }
- var currentLastRule = context.lastRule;
- if (rule.isRulesetLike(rule)) {
- context.lastRule = false;
- }
- if (rule.genCSS) {
- rule.genCSS(context, output);
- }
- else if (rule.value) {
- output.add(rule.value.toString());
- }
- context.lastRule = currentLastRule;
- if (!context.lastRule && rule.isVisible()) {
- output.add(context.compress ? '' : ("\n".concat(tabRuleStr)));
- }
- else {
- context.lastRule = false;
- }
- }
- if (!this.root) {
- output.add((context.compress ? '}' : "\n".concat(tabSetStr, "}")));
- context.tabLevel--;
- }
- if (!output.isEmpty() && !context.compress && this.firstRoot) {
- output.add('\n');
- }
- },
- joinSelectors: function (paths, context, selectors) {
- for (var s = 0; s < selectors.length; s++) {
- this.joinSelector(paths, context, selectors[s]);
- }
- },
- joinSelector: function (paths, context, selector) {
- function createParenthesis(elementsToPak, originalElement) {
- var replacementParen, j;
- if (elementsToPak.length === 0) {
- replacementParen = new Paren(elementsToPak[0]);
- }
- else {
- var insideParent = new Array(elementsToPak.length);
- for (j = 0; j < elementsToPak.length; j++) {
- insideParent[j] = new Element(null, elementsToPak[j], originalElement.isVariable, originalElement._index, originalElement._fileInfo);
- }
- replacementParen = new Paren(new Selector(insideParent));
- }
- return replacementParen;
- }
- function createSelector(containedElement, originalElement) {
- var element, selector;
- element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);
- selector = new Selector([element]);
- return selector;
- }
- // joins selector path from `beginningPath` with selector path in `addPath`
- // `replacedElement` contains element that is being replaced by `addPath`
- // returns concatenated path
- function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {
- var newSelectorPath, lastSelector, newJoinedSelector;
- // our new selector path
- newSelectorPath = [];
- // construct the joined selector - if & is the first thing this will be empty,
- // if not newJoinedSelector will be the last set of elements in the selector
- if (beginningPath.length > 0) {
- newSelectorPath = copyArray(beginningPath);
- lastSelector = newSelectorPath.pop();
- newJoinedSelector = originalSelector.createDerived(copyArray(lastSelector.elements));
- }
- else {
- newJoinedSelector = originalSelector.createDerived([]);
- }
- if (addPath.length > 0) {
- // /deep/ is a CSS4 selector - (removed, so should deprecate)
- // that is valid without anything in front of it
- // so if the & does not have a combinator that is "" or " " then
- // and there is a combinator on the parent, then grab that.
- // this also allows + a { & .b { .a & { ... though not sure why you would want to do that
- var combinator = replacedElement.combinator;
- var parentEl = addPath[0].elements[0];
- if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {
- combinator = parentEl.combinator;
- }
- // join the elements so far with the first part of the parent
- newJoinedSelector.elements.push(new Element(combinator, parentEl.value, replacedElement.isVariable, replacedElement._index, replacedElement._fileInfo));
- newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));
- }
- // now add the joined selector - but only if it is not empty
- if (newJoinedSelector.elements.length !== 0) {
- newSelectorPath.push(newJoinedSelector);
- }
- // put together the parent selectors after the join (e.g. the rest of the parent)
- if (addPath.length > 1) {
- var restOfPath = addPath.slice(1);
- restOfPath = restOfPath.map(function (selector) {
- return selector.createDerived(selector.elements, []);
- });
- newSelectorPath = newSelectorPath.concat(restOfPath);
- }
- return newSelectorPath;
- }
- // joins selector path from `beginningPath` with every selector path in `addPaths` array
- // `replacedElement` contains element that is being replaced by `addPath`
- // returns array with all concatenated paths
- function addAllReplacementsIntoPath(beginningPath, addPaths, replacedElement, originalSelector, result) {
- var j;
- for (j = 0; j < beginningPath.length; j++) {
- var newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);
- result.push(newSelectorPath);
- }
- return result;
- }
- function mergeElementsOnToSelectors(elements, selectors) {
- var i, sel;
- if (elements.length === 0) {
- return;
- }
- if (selectors.length === 0) {
- selectors.push([new Selector(elements)]);
- return;
- }
- for (i = 0; (sel = selectors[i]); i++) {
- // if the previous thing in sel is a parent this needs to join on to it
- if (sel.length > 0) {
- sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));
- }
- else {
- sel.push(new Selector(elements));
- }
- }
- }
- // replace all parent selectors inside `inSelector` by content of `context` array
- // resulting selectors are returned inside `paths` array
- // returns true if `inSelector` contained at least one parent selector
- function replaceParentSelector(paths, context, inSelector) {
- // The paths are [[Selector]]
- // The first list is a list of comma separated selectors
- // The inner list is a list of inheritance separated selectors
- // e.g.
- // .a, .b {
- // .c {
- // }
- // }
- // == [[.a] [.c]] [[.b] [.c]]
- //
- var i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;
- function findNestedSelector(element) {
- var maybeSelector;
- if (!(element.value instanceof Paren)) {
- return null;
- }
- maybeSelector = element.value.value;
- if (!(maybeSelector instanceof Selector)) {
- return null;
- }
- return maybeSelector;
- }
- // the elements from the current selector so far
- currentElements = [];
- // the current list of new selectors to add to the path.
- // We will build it up. We initiate it with one empty selector as we "multiply" the new selectors
- // by the parents
- newSelectors = [
- []
- ];
- for (i = 0; (el = inSelector.elements[i]); i++) {
- // non parent reference elements just get added
- if (el.value !== '&') {
- var nestedSelector = findNestedSelector(el);
- if (nestedSelector !== null) {
- // merge the current list of non parent selector elements
- // on to the current list of selectors to add
- mergeElementsOnToSelectors(currentElements, newSelectors);
- var nestedPaths = [];
- var replaced = void 0;
- var replacedNewSelectors = [];
- replaced = replaceParentSelector(nestedPaths, context, nestedSelector);
- hadParentSelector = hadParentSelector || replaced;
- // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors
- for (k = 0; k < nestedPaths.length; k++) {
- var replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);
- addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);
- }
- newSelectors = replacedNewSelectors;
- currentElements = [];
- }
- else {
- currentElements.push(el);
- }
- }
- else {
- hadParentSelector = true;
- // the new list of selectors to add
- selectorsMultiplied = [];
- // merge the current list of non parent selector elements
- // on to the current list of selectors to add
- mergeElementsOnToSelectors(currentElements, newSelectors);
- // loop through our current selectors
- for (j = 0; j < newSelectors.length; j++) {
- sel = newSelectors[j];
- // if we don't have any parent paths, the & might be in a mixin so that it can be used
- // whether there are parents or not
- if (context.length === 0) {
- // the combinator used on el should now be applied to the next element instead so that
- // it is not lost
- if (sel.length > 0) {
- sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));
- }
- selectorsMultiplied.push(sel);
- }
- else {
- // and the parent selectors
- for (k = 0; k < context.length; k++) {
- // We need to put the current selectors
- // then join the last selector's elements on to the parents selectors
- var newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);
- // add that to our new set of selectors
- selectorsMultiplied.push(newSelectorPath);
- }
- }
- }
- // our new selectors has been multiplied, so reset the state
- newSelectors = selectorsMultiplied;
- currentElements = [];
- }
- }
- // if we have any elements left over (e.g. .a& .b == .b)
- // add them on to all the current selectors
- mergeElementsOnToSelectors(currentElements, newSelectors);
- for (i = 0; i < newSelectors.length; i++) {
- length = newSelectors[i].length;
- if (length > 0) {
- paths.push(newSelectors[i]);
- lastSelector = newSelectors[i][length - 1];
- newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);
- }
- }
- return hadParentSelector;
- }
- function deriveSelector(visibilityInfo, deriveFrom) {
- var newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);
- newSelector.copyVisibilityInfo(visibilityInfo);
- return newSelector;
- }
- // joinSelector code follows
- var i, newPaths, hadParentSelector;
- newPaths = [];
- hadParentSelector = replaceParentSelector(newPaths, context, selector);
- if (!hadParentSelector) {
- if (context.length > 0) {
- newPaths = [];
- for (i = 0; i < context.length; i++) {
- var concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));
- concatenated.push(selector);
- newPaths.push(concatenated);
- }
- }
- else {
- newPaths = [[selector]];
- }
- }
- for (i = 0; i < newPaths.length; i++) {
- paths.push(newPaths[i]);
- }
- }
- });
-
- var Unit = function (numerator, denominator, backupUnit) {
- this.numerator = numerator ? copyArray(numerator).sort() : [];
- this.denominator = denominator ? copyArray(denominator).sort() : [];
- if (backupUnit) {
- this.backupUnit = backupUnit;
- }
- else if (numerator && numerator.length) {
- this.backupUnit = numerator[0];
- }
- };
- Unit.prototype = Object.assign(new Node(), {
- type: 'Unit',
- clone: function () {
- return new Unit(copyArray(this.numerator), copyArray(this.denominator), this.backupUnit);
- },
- genCSS: function (context, output) {
- // Dimension checks the unit is singular and throws an error if in strict math mode.
- var strictUnits = context && context.strictUnits;
- if (this.numerator.length === 1) {
- output.add(this.numerator[0]); // the ideal situation
- }
- else if (!strictUnits && this.backupUnit) {
- output.add(this.backupUnit);
- }
- else if (!strictUnits && this.denominator.length) {
- output.add(this.denominator[0]);
- }
- },
- toString: function () {
- var i, returnStr = this.numerator.join('*');
- for (i = 0; i < this.denominator.length; i++) {
- returnStr += "/".concat(this.denominator[i]);
- }
- return returnStr;
- },
- compare: function (other) {
- return this.is(other.toString()) ? 0 : undefined;
- },
- is: function (unitString) {
- return this.toString().toUpperCase() === unitString.toUpperCase();
- },
- isLength: function () {
- return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());
- },
- isEmpty: function () {
- return this.numerator.length === 0 && this.denominator.length === 0;
- },
- isSingular: function () {
- return this.numerator.length <= 1 && this.denominator.length === 0;
- },
- map: function (callback) {
- var i;
- for (i = 0; i < this.numerator.length; i++) {
- this.numerator[i] = callback(this.numerator[i], false);
- }
- for (i = 0; i < this.denominator.length; i++) {
- this.denominator[i] = callback(this.denominator[i], true);
- }
- },
- usedUnits: function () {
- var group;
- var result = {};
- var mapUnit;
- var groupName;
- mapUnit = function (atomicUnit) {
- // eslint-disable-next-line no-prototype-builtins
- if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {
- result[groupName] = atomicUnit;
- }
- return atomicUnit;
- };
- for (groupName in unitConversions) {
- // eslint-disable-next-line no-prototype-builtins
- if (unitConversions.hasOwnProperty(groupName)) {
- group = unitConversions[groupName];
- this.map(mapUnit);
- }
- }
- return result;
- },
- cancel: function () {
- var counter = {};
- var atomicUnit;
- var i;
- for (i = 0; i < this.numerator.length; i++) {
- atomicUnit = this.numerator[i];
- counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;
- }
- for (i = 0; i < this.denominator.length; i++) {
- atomicUnit = this.denominator[i];
- counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;
- }
- this.numerator = [];
- this.denominator = [];
- for (atomicUnit in counter) {
- // eslint-disable-next-line no-prototype-builtins
- if (counter.hasOwnProperty(atomicUnit)) {
- var count = counter[atomicUnit];
- if (count > 0) {
- for (i = 0; i < count; i++) {
- this.numerator.push(atomicUnit);
- }
- }
- else if (count < 0) {
- for (i = 0; i < -count; i++) {
- this.denominator.push(atomicUnit);
- }
- }
- }
- }
- this.numerator.sort();
- this.denominator.sort();
- }
- });
-
- /* eslint-disable no-prototype-builtins */
- //
- // A number with a unit
- //
- var Dimension = function (value, unit) {
- this.value = parseFloat(value);
- if (isNaN(this.value)) {
- throw new Error('Dimension is not a number.');
- }
- this.unit = (unit && unit instanceof Unit) ? unit :
- new Unit(unit ? [unit] : undefined);
- this.setParent(this.unit, this);
- };
- Dimension.prototype = Object.assign(new Node(), {
- type: 'Dimension',
- accept: function (visitor) {
- this.unit = visitor.visit(this.unit);
- },
- // remove when Nodes have JSDoc types
- // eslint-disable-next-line no-unused-vars
- eval: function (context) {
- return this;
- },
- toColor: function () {
- return new Color([this.value, this.value, this.value]);
- },
- genCSS: function (context, output) {
- if ((context && context.strictUnits) && !this.unit.isSingular()) {
- throw new Error("Multiple units in dimension. Correct the units or use the unit function. Bad unit: ".concat(this.unit.toString()));
- }
- var value = this.fround(context, this.value);
- var strValue = String(value);
- if (value !== 0 && value < 0.000001 && value > -0.000001) {
- // would be output 1e-6 etc.
- strValue = value.toFixed(20).replace(/0+$/, '');
- }
- if (context && context.compress) {
- // Zero values doesn't need a unit
- if (value === 0 && this.unit.isLength()) {
- output.add(strValue);
- return;
- }
- // Float values doesn't need a leading zero
- if (value > 0 && value < 1) {
- strValue = (strValue).substr(1);
- }
- }
- output.add(strValue);
- this.unit.genCSS(context, output);
- },
- // In an operation between two Dimensions,
- // we default to the first Dimension's unit,
- // so `1px + 2` will yield `3px`.
- operate: function (context, op, other) {
- /* jshint noempty:false */
- var value = this._operate(context, op, this.value, other.value);
- var unit = this.unit.clone();
- if (op === '+' || op === '-') {
- if (unit.numerator.length === 0 && unit.denominator.length === 0) {
- unit = other.unit.clone();
- if (this.unit.backupUnit) {
- unit.backupUnit = this.unit.backupUnit;
- }
- }
- else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) ;
- else {
- other = other.convertTo(this.unit.usedUnits());
- if (context.strictUnits && other.unit.toString() !== unit.toString()) {
- throw new Error('Incompatible units. Change the units or use the unit function. '
- + "Bad units: '".concat(unit.toString(), "' and '").concat(other.unit.toString(), "'."));
- }
- value = this._operate(context, op, this.value, other.value);
- }
- }
- else if (op === '*') {
- unit.numerator = unit.numerator.concat(other.unit.numerator).sort();
- unit.denominator = unit.denominator.concat(other.unit.denominator).sort();
- unit.cancel();
- }
- else if (op === '/') {
- unit.numerator = unit.numerator.concat(other.unit.denominator).sort();
- unit.denominator = unit.denominator.concat(other.unit.numerator).sort();
- unit.cancel();
- }
- return new Dimension(value, unit);
- },
- compare: function (other) {
- var a, b;
- if (!(other instanceof Dimension)) {
- return undefined;
- }
- if (this.unit.isEmpty() || other.unit.isEmpty()) {
- a = this;
- b = other;
- }
- else {
- a = this.unify();
- b = other.unify();
- if (a.unit.compare(b.unit) !== 0) {
- return undefined;
- }
- }
- return Node.numericCompare(a.value, b.value);
- },
- unify: function () {
- return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });
- },
- convertTo: function (conversions) {
- var value = this.value;
- var unit = this.unit.clone();
- var i;
- var groupName;
- var group;
- var targetUnit;
- var derivedConversions = {};
- var applyUnit;
- if (typeof conversions === 'string') {
- for (i in unitConversions) {
- if (unitConversions[i].hasOwnProperty(conversions)) {
- derivedConversions = {};
- derivedConversions[i] = conversions;
- }
- }
- conversions = derivedConversions;
- }
- applyUnit = function (atomicUnit, denominator) {
- if (group.hasOwnProperty(atomicUnit)) {
- if (denominator) {
- value = value / (group[atomicUnit] / group[targetUnit]);
- }
- else {
- value = value * (group[atomicUnit] / group[targetUnit]);
- }
- return targetUnit;
- }
- return atomicUnit;
- };
- for (groupName in conversions) {
- if (conversions.hasOwnProperty(groupName)) {
- targetUnit = conversions[groupName];
- group = unitConversions[groupName];
- unit.map(applyUnit);
- }
- }
- unit.cancel();
- return new Dimension(value, unit);
- }
- });
-
- var Expression = function (value, noSpacing) {
- this.value = value;
- this.noSpacing = noSpacing;
- if (!value) {
- throw new Error('Expression requires an array parameter');
- }
- };
- Expression.prototype = Object.assign(new Node(), {
- type: 'Expression',
- accept: function (visitor) {
- this.value = visitor.visitArray(this.value);
- },
- eval: function (context) {
- var noSpacing = this.noSpacing;
- var returnValue;
- var mathOn = context.isMathOn();
- var inParenthesis = this.parens;
- var doubleParen = false;
- if (inParenthesis) {
- context.inParenthesis();
- }
- if (this.value.length > 1) {
- returnValue = new Expression(this.value.map(function (e) {
- if (!e.eval) {
- return e;
- }
- return e.eval(context);
- }), this.noSpacing);
- }
- else if (this.value.length === 1) {
- if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {
- doubleParen = true;
- }
- returnValue = this.value[0].eval(context);
- }
- else {
- returnValue = this;
- }
- if (inParenthesis) {
- context.outOfParenthesis();
- }
- if (this.parens && this.parensInOp && !mathOn && !doubleParen
- && (!(returnValue instanceof Dimension))) {
- returnValue = new Paren(returnValue);
- }
- returnValue.noSpacing = returnValue.noSpacing || noSpacing;
- return returnValue;
- },
- genCSS: function (context, output) {
- for (var i_1 = 0; i_1 < this.value.length; i_1++) {
- this.value[i_1].genCSS(context, output);
- if (!this.noSpacing && i_1 + 1 < this.value.length) {
- if (i_1 + 1 < this.value.length && !(this.value[i_1 + 1] instanceof Anonymous) ||
- this.value[i_1 + 1] instanceof Anonymous && this.value[i_1 + 1].value !== ',') {
- output.add(' ');
- }
- }
- }
- },
- throwAwayComments: function () {
- this.value = this.value.filter(function (v) {
- return !(v instanceof Comment);
- });
- }
- });
-
- var NestableAtRulePrototype = {
- isRulesetLike: function () {
- return true;
- },
- accept: function (visitor) {
- if (this.features) {
- this.features = visitor.visit(this.features);
- }
- if (this.rules) {
- this.rules = visitor.visitArray(this.rules);
- }
- },
- evalFunction: function () {
- if (!this.features || !Array.isArray(this.features.value) || this.features.value.length < 1) {
- return;
- }
- var exprValues = this.features.value;
- var expr, paren;
- for (var index = 0; index < exprValues.length; ++index) {
- expr = exprValues[index];
- if (expr.type === 'Keyword' && index + 1 < exprValues.length && (expr.noSpacing || expr.noSpacing == null)) {
- paren = exprValues[index + 1];
- if (paren.type === 'Paren' && paren.noSpacing) {
- exprValues[index] = new Expression([expr, paren]);
- exprValues.splice(index + 1, 1);
- exprValues[index].noSpacing = true;
- }
- }
- }
- },
- evalTop: function (context) {
- this.evalFunction();
- var result = this;
- // Render all dependent Media blocks.
- if (context.mediaBlocks.length > 1) {
- var selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();
- result = new Ruleset(selectors, context.mediaBlocks);
- result.multiMedia = true;
- result.copyVisibilityInfo(this.visibilityInfo());
- this.setParent(result, this);
- }
- delete context.mediaBlocks;
- delete context.mediaPath;
- return result;
- },
- evalNested: function (context) {
- this.evalFunction();
- var i;
- var value;
- var path = context.mediaPath.concat([this]);
- // Extract the media-query conditions separated with `,` (OR).
- for (i = 0; i < path.length; i++) {
- if (path[i].type !== this.type) {
- context.mediaBlocks.splice(i, 1);
- return this;
- }
- value = path[i].features instanceof Value ?
- path[i].features.value : path[i].features;
- path[i] = Array.isArray(value) ? value : [value];
- }
- // Trace all permutations to generate the resulting media-query.
- //
- // (a, b and c) with nested (d, e) ->
- // a and d
- // a and e
- // b and c and d
- // b and c and e
- this.features = new Value(this.permute(path).map(function (path) {
- path = path.map(function (fragment) { return fragment.toCSS ? fragment : new Anonymous(fragment); });
- for (i = path.length - 1; i > 0; i--) {
- path.splice(i, 0, new Anonymous('and'));
- }
- return new Expression(path);
- }));
- this.setParent(this.features, this);
- // Fake a tree-node that doesn't output anything.
- return new Ruleset([], []);
- },
- permute: function (arr) {
- if (arr.length === 0) {
- return [];
- }
- else if (arr.length === 1) {
- return arr[0];
- }
- else {
- var result = [];
- var rest = this.permute(arr.slice(1));
- for (var i_1 = 0; i_1 < rest.length; i_1++) {
- for (var j = 0; j < arr[0].length; j++) {
- result.push([arr[0][j]].concat(rest[i_1]));
- }
- }
- return result;
- }
- },
- bubbleSelectors: function (selectors) {
- if (!selectors) {
- return;
- }
- this.rules = [new Ruleset(copyArray(selectors), [this.rules[0]])];
- this.setParent(this.rules, this);
- }
- };
-
- var AtRule = function (name, value, rules, index, currentFileInfo, debugInfo, isRooted, visibilityInfo) {
- var _this = this;
- var i;
- var selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();
- this.name = name;
- this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);
- if (rules) {
- if (Array.isArray(rules)) {
- var allDeclarations = this.declarationsBlock(rules);
- var allRulesetDeclarations_1 = true;
- rules.forEach(function (rule) {
- if (rule.type === 'Ruleset' && rule.rules)
- allRulesetDeclarations_1 = allRulesetDeclarations_1 && _this.declarationsBlock(rule.rules, true);
- });
- if (allDeclarations && !isRooted) {
- this.simpleBlock = true;
- this.declarations = rules;
- }
- else if (allRulesetDeclarations_1 && rules.length === 1 && !isRooted && !value) {
- this.simpleBlock = true;
- this.declarations = rules[0].rules ? rules[0].rules : rules;
- }
- else {
- this.rules = rules;
- }
- }
- else {
- var allDeclarations = this.declarationsBlock(rules.rules);
- if (allDeclarations && !isRooted && !value) {
- this.simpleBlock = true;
- this.declarations = rules.rules;
- }
- else {
- this.rules = [rules];
- this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();
- }
- }
- if (!this.simpleBlock) {
- for (i = 0; i < this.rules.length; i++) {
- this.rules[i].allowImports = true;
- }
- }
- this.setParent(selectors, this);
- this.setParent(this.rules, this);
- }
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.debugInfo = debugInfo;
- this.isRooted = isRooted || false;
- this.copyVisibilityInfo(visibilityInfo);
- this.allowRoot = true;
- };
- AtRule.prototype = Object.assign(new Node(), __assign(__assign({ type: 'AtRule' }, NestableAtRulePrototype), { declarationsBlock: function (rules, mergeable) {
- if (mergeable === void 0) { mergeable = false; }
- if (!mergeable) {
- return rules.filter(function (node) { return (node.type === 'Declaration' || node.type === 'Comment') && !node.merge; }).length === rules.length;
- }
- else {
- return rules.filter(function (node) { return (node.type === 'Declaration' || node.type === 'Comment'); }).length === rules.length;
- }
- }, keywordList: function (rules) {
- if (!Array.isArray(rules)) {
- return false;
- }
- else {
- return rules.filter(function (node) { return (node.type === 'Keyword' || node.type === 'Comment'); }).length === rules.length;
- }
- }, accept: function (visitor) {
- var value = this.value, rules = this.rules, declarations = this.declarations;
- if (rules) {
- this.rules = visitor.visitArray(rules);
- }
- else if (declarations) {
- this.declarations = visitor.visitArray(declarations);
- }
- if (value) {
- this.value = visitor.visit(value);
- }
- }, isRulesetLike: function () {
- return this.rules || !this.isCharset();
- }, isCharset: function () {
- return '@charset' === this.name;
- }, genCSS: function (context, output) {
- var value = this.value, rules = this.rules || this.declarations;
- output.add(this.name, this.fileInfo(), this.getIndex());
- if (value) {
- output.add(' ');
- value.genCSS(context, output);
- }
- if (this.simpleBlock) {
- this.outputRuleset(context, output, this.declarations);
- }
- else if (rules) {
- this.outputRuleset(context, output, rules);
- }
- else {
- output.add(';');
- }
- }, eval: function (context) {
- var mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules || this.declarations;
- // media stored inside other atrule should not bubble over it
- // backpup media bubbling information
- mediaPathBackup = context.mediaPath;
- mediaBlocksBackup = context.mediaBlocks;
- // deleted media bubbling information
- context.mediaPath = [];
- context.mediaBlocks = [];
- if (value) {
- value = value.eval(context);
- if (value.value && this.keywordList(value.value)) {
- value = new Anonymous(value.value.map(function (keyword) { return keyword.value; }).join(', '), this.getIndex(), this.fileInfo());
- }
- }
- if (rules) {
- rules = this.evalRoot(context, rules);
- }
- if (Array.isArray(rules) && rules[0].rules && Array.isArray(rules[0].rules) && rules[0].rules.length) {
- var allMergeableDeclarations = this.declarationsBlock(rules[0].rules, true);
- if (allMergeableDeclarations && !this.isRooted && !value) {
- var mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;
- mergeRules(rules[0].rules);
- rules = rules[0].rules;
- rules.forEach(function (rule) { return rule.merge = false; });
- }
- }
- if (this.simpleBlock && rules) {
- rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();
- rules = rules.map(function (rule) { return rule.eval(context); });
- }
- // restore media bubbling information
- context.mediaPath = mediaPathBackup;
- context.mediaBlocks = mediaBlocksBackup;
- return new AtRule(this.name, value, rules, this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());
- }, evalRoot: function (context, rules) {
- var ampersandCount = 0;
- var noAmpersandCount = 0;
- var noAmpersands = true;
- var allAmpersands = false;
- if (!this.simpleBlock) {
- rules = [rules[0].eval(context)];
- }
- var precedingSelectors = [];
- if (context.frames.length > 0) {
- var _loop_1 = function (index) {
- var frame = context.frames[index];
- if (frame.type === 'Ruleset' &&
- frame.rules &&
- frame.rules.length > 0) {
- if (frame && !frame.root && frame.selectors && frame.selectors.length > 0) {
- precedingSelectors = precedingSelectors.concat(frame.selectors);
- }
- }
- if (precedingSelectors.length > 0) {
- var value_1 = '';
- var output = { add: function (s) { value_1 += s; } };
- for (var i_1 = 0; i_1 < precedingSelectors.length; i_1++) {
- precedingSelectors[i_1].genCSS(context, output);
- }
- if (/^&+$/.test(value_1.replace(/\s+/g, ''))) {
- noAmpersands = false;
- noAmpersandCount++;
- }
- else {
- allAmpersands = false;
- ampersandCount++;
- }
- }
- };
- for (var index = 0; index < context.frames.length; index++) {
- _loop_1(index);
- }
- }
- var mixedAmpersands = ampersandCount > 0 && noAmpersandCount > 0 && !allAmpersands && !noAmpersands;
- if ((this.isRooted && ampersandCount > 0 && noAmpersandCount === 0 && !allAmpersands && noAmpersands)
- || !mixedAmpersands) {
- rules[0].root = true;
- }
- return rules;
- }, variable: function (name) {
- if (this.rules) {
- // assuming that there is only one rule at this point - that is how parser constructs the rule
- return Ruleset.prototype.variable.call(this.rules[0], name);
- }
- }, find: function () {
- if (this.rules) {
- // assuming that there is only one rule at this point - that is how parser constructs the rule
- return Ruleset.prototype.find.apply(this.rules[0], arguments);
- }
- }, rulesets: function () {
- if (this.rules) {
- // assuming that there is only one rule at this point - that is how parser constructs the rule
- return Ruleset.prototype.rulesets.apply(this.rules[0]);
- }
- }, outputRuleset: function (context, output, rules) {
- var ruleCnt = rules.length;
- var i;
- context.tabLevel = (context.tabLevel | 0) + 1;
- // Compressed
- if (context.compress) {
- output.add('{');
- for (i = 0; i < ruleCnt; i++) {
- rules[i].genCSS(context, output);
- }
- output.add('}');
- context.tabLevel--;
- return;
- }
- // Non-compressed
- var tabSetStr = "\n".concat(Array(context.tabLevel).join(' ')), tabRuleStr = "".concat(tabSetStr, " ");
- if (!ruleCnt) {
- output.add(" {".concat(tabSetStr, "}"));
- }
- else {
- output.add(" {".concat(tabRuleStr));
- rules[0].genCSS(context, output);
- for (i = 1; i < ruleCnt; i++) {
- output.add(tabRuleStr);
- rules[i].genCSS(context, output);
- }
- output.add("".concat(tabSetStr, "}"));
- }
- context.tabLevel--;
- } }));
-
- var DetachedRuleset = function (ruleset, frames) {
- this.ruleset = ruleset;
- this.frames = frames;
- this.setParent(this.ruleset, this);
- };
- DetachedRuleset.prototype = Object.assign(new Node(), {
- type: 'DetachedRuleset',
- evalFirst: true,
- accept: function (visitor) {
- this.ruleset = visitor.visit(this.ruleset);
- },
- eval: function (context) {
- var frames = this.frames || copyArray(context.frames);
- return new DetachedRuleset(this.ruleset, frames);
- },
- callEval: function (context) {
- return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);
- }
- });
-
- var MATH = Math$1;
- var Operation = function (op, operands, isSpaced) {
- this.op = op.trim();
- this.operands = operands;
- this.isSpaced = isSpaced;
- };
- Operation.prototype = Object.assign(new Node(), {
- type: 'Operation',
- accept: function (visitor) {
- this.operands = visitor.visitArray(this.operands);
- },
- eval: function (context) {
- var a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;
- if (context.isMathOn(this.op)) {
- op = this.op === './' ? '/' : this.op;
- if (a instanceof Dimension && b instanceof Color) {
- a = a.toColor();
- }
- if (b instanceof Dimension && a instanceof Color) {
- b = b.toColor();
- }
- if (!a.operate || !b.operate) {
- if ((a instanceof Operation || b instanceof Operation)
- && a.op === '/' && context.math === MATH.PARENS_DIVISION) {
- return new Operation(this.op, [a, b], this.isSpaced);
- }
- throw { type: 'Operation',
- message: 'Operation on an invalid type' };
- }
- return a.operate(context, op, b);
- }
- else {
- return new Operation(this.op, [a, b], this.isSpaced);
- }
- },
- genCSS: function (context, output) {
- this.operands[0].genCSS(context, output);
- if (this.isSpaced) {
- output.add(' ');
- }
- output.add(this.op);
- if (this.isSpaced) {
- output.add(' ');
- }
- this.operands[1].genCSS(context, output);
- }
- });
-
- var functionCaller = /** @class */ (function () {
- function functionCaller(name, context, index, currentFileInfo) {
- this.name = name.toLowerCase();
- this.index = index;
- this.context = context;
- this.currentFileInfo = currentFileInfo;
- this.func = context.frames[0].functionRegistry.get(this.name);
- }
- functionCaller.prototype.isValid = function () {
- return Boolean(this.func);
- };
- functionCaller.prototype.call = function (args) {
- var _this = this;
- if (!(Array.isArray(args))) {
- args = [args];
- }
- var evalArgs = this.func.evalArgs;
- if (evalArgs !== false) {
- args = args.map(function (a) { return a.eval(_this.context); });
- }
- var commentFilter = function (item) { return !(item.type === 'Comment'); };
- // This code is terrible and should be replaced as per this issue...
- // https://github.com/less/less.js/issues/2477
- args = args
- .filter(commentFilter)
- .map(function (item) {
- if (item.type === 'Expression') {
- var subNodes = item.value.filter(commentFilter);
- if (subNodes.length === 1) {
- // https://github.com/less/less.js/issues/3616
- if (item.parens && subNodes[0].op === '/') {
- return item;
- }
- return subNodes[0];
- }
- else {
- return new Expression(subNodes);
- }
- }
- return item;
- });
- if (evalArgs === false) {
- return this.func.apply(this, __spreadArray([this.context], args, false));
- }
- return this.func.apply(this, args);
- };
- return functionCaller;
- }());
-
- //
- // A function call node.
- //
- var Call = function (name, args, index, currentFileInfo) {
- this.name = name;
- this.args = args;
- this.calc = name === 'calc';
- this._index = index;
- this._fileInfo = currentFileInfo;
- };
- Call.prototype = Object.assign(new Node(), {
- type: 'Call',
- accept: function (visitor) {
- if (this.args) {
- this.args = visitor.visitArray(this.args);
- }
- },
- //
- // When evaluating a function call,
- // we either find the function in the functionRegistry,
- // in which case we call it, passing the evaluated arguments,
- // if this returns null or we cannot find the function, we
- // simply print it out as it appeared originally [2].
- //
- // The reason why we evaluate the arguments, is in the case where
- // we try to pass a variable to a function, like: `saturate(@color)`.
- // The function should receive the value, not the variable.
- //
- eval: function (context) {
- var _this = this;
- /**
- * Turn off math for calc(), and switch back on for evaluating nested functions
- */
- var currentMathContext = context.mathOn;
- context.mathOn = !this.calc;
- if (this.calc || context.inCalc) {
- context.enterCalc();
- }
- var exitCalc = function () {
- if (_this.calc || context.inCalc) {
- context.exitCalc();
- }
- context.mathOn = currentMathContext;
- };
- var result;
- var funcCaller = new functionCaller(this.name, context, this.getIndex(), this.fileInfo());
- if (funcCaller.isValid()) {
- try {
- result = funcCaller.call(this.args);
- exitCalc();
- }
- catch (e) {
- // eslint-disable-next-line no-prototype-builtins
- if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {
- throw e;
- }
- throw {
- type: e.type || 'Runtime',
- message: "Error evaluating function `".concat(this.name, "`").concat(e.message ? ": ".concat(e.message) : ''),
- index: this.getIndex(),
- filename: this.fileInfo().filename,
- line: e.lineNumber,
- column: e.columnNumber
- };
- }
- }
- if (result !== null && result !== undefined) {
- // Results that that are not nodes are cast as Anonymous nodes
- // Falsy values or booleans are returned as empty nodes
- if (!(result instanceof Node)) {
- if (!result || result === true) {
- result = new Anonymous(null);
- }
- else {
- result = new Anonymous(result.toString());
- }
- }
- result._index = this._index;
- result._fileInfo = this._fileInfo;
- return result;
- }
- var args = this.args.map(function (a) { return a.eval(context); });
- exitCalc();
- return new Call(this.name, args, this.getIndex(), this.fileInfo());
- },
- genCSS: function (context, output) {
- output.add("".concat(this.name, "("), this.fileInfo(), this.getIndex());
- for (var i_1 = 0; i_1 < this.args.length; i_1++) {
- this.args[i_1].genCSS(context, output);
- if (i_1 + 1 < this.args.length) {
- output.add(', ');
- }
- }
- output.add(')');
- }
- });
-
- var Variable = function (name, index, currentFileInfo) {
- this.name = name;
- this._index = index;
- this._fileInfo = currentFileInfo;
- };
- Variable.prototype = Object.assign(new Node(), {
- type: 'Variable',
- eval: function (context) {
- var variable, name = this.name;
- if (name.indexOf('@@') === 0) {
- name = "@".concat(new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value);
- }
- if (this.evaluating) {
- throw { type: 'Name',
- message: "Recursive variable definition for ".concat(name),
- filename: this.fileInfo().filename,
- index: this.getIndex() };
- }
- this.evaluating = true;
- variable = this.find(context.frames, function (frame) {
- var v = frame.variable(name);
- if (v) {
- if (v.important) {
- var importantScope = context.importantScope[context.importantScope.length - 1];
- importantScope.important = v.important;
- }
- // If in calc, wrap vars in a function call to cascade evaluate args first
- if (context.inCalc) {
- return (new Call('_SELF', [v.value])).eval(context);
- }
- else {
- return v.value.eval(context);
- }
- }
- });
- if (variable) {
- this.evaluating = false;
- return variable;
- }
- else {
- throw { type: 'Name',
- message: "variable ".concat(name, " is undefined"),
- filename: this.fileInfo().filename,
- index: this.getIndex() };
- }
- },
- find: function (obj, fun) {
- for (var i_1 = 0, r = void 0; i_1 < obj.length; i_1++) {
- r = fun.call(obj, obj[i_1]);
- if (r) {
- return r;
- }
- }
- return null;
- }
- });
-
- var Property = function (name, index, currentFileInfo) {
- this.name = name;
- this._index = index;
- this._fileInfo = currentFileInfo;
- };
- Property.prototype = Object.assign(new Node(), {
- type: 'Property',
- eval: function (context) {
- var property;
- var name = this.name;
- // TODO: shorten this reference
- var mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;
- if (this.evaluating) {
- throw { type: 'Name',
- message: "Recursive property reference for ".concat(name),
- filename: this.fileInfo().filename,
- index: this.getIndex() };
- }
- this.evaluating = true;
- property = this.find(context.frames, function (frame) {
- var v;
- var vArr = frame.property(name);
- if (vArr) {
- for (var i_1 = 0; i_1 < vArr.length; i_1++) {
- v = vArr[i_1];
- vArr[i_1] = new Declaration(v.name, v.value, v.important, v.merge, v.index, v.currentFileInfo, v.inline, v.variable);
- }
- mergeRules(vArr);
- v = vArr[vArr.length - 1];
- if (v.important) {
- var importantScope = context.importantScope[context.importantScope.length - 1];
- importantScope.important = v.important;
- }
- v = v.value.eval(context);
- return v;
- }
- });
- if (property) {
- this.evaluating = false;
- return property;
- }
- else {
- throw { type: 'Name',
- message: "Property '".concat(name, "' is undefined"),
- filename: this.currentFileInfo.filename,
- index: this.index };
- }
- },
- find: function (obj, fun) {
- for (var i_2 = 0, r = void 0; i_2 < obj.length; i_2++) {
- r = fun.call(obj, obj[i_2]);
- if (r) {
- return r;
- }
- }
- return null;
- }
- });
-
- var Attribute = function (key, op, value, cif) {
- this.key = key;
- this.op = op;
- this.value = value;
- this.cif = cif;
- };
- Attribute.prototype = Object.assign(new Node(), {
- type: 'Attribute',
- eval: function (context) {
- return new Attribute(this.key.eval ? this.key.eval(context) : this.key, this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value, this.cif);
- },
- genCSS: function (context, output) {
- output.add(this.toCSS(context));
- },
- toCSS: function (context) {
- var value = this.key.toCSS ? this.key.toCSS(context) : this.key;
- if (this.op) {
- value += this.op;
- value += (this.value.toCSS ? this.value.toCSS(context) : this.value);
- }
- if (this.cif) {
- value = value + ' ' + this.cif;
- }
- return "[".concat(value, "]");
- }
- });
-
- var Quoted = function (str, content, escaped, index, currentFileInfo) {
- this.escaped = (escaped === undefined) ? true : escaped;
- this.value = content || '';
- this.quote = str.charAt(0);
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.variableRegex = /@\{([\w-]+)\}/g;
- this.propRegex = /\$\{([\w-]+)\}/g;
- this.allowRoot = escaped;
- };
- Quoted.prototype = Object.assign(new Node(), {
- type: 'Quoted',
- genCSS: function (context, output) {
- if (!this.escaped) {
- output.add(this.quote, this.fileInfo(), this.getIndex());
- }
- output.add(this.value);
- if (!this.escaped) {
- output.add(this.quote);
- }
- },
- containsVariables: function () {
- return this.value.match(this.variableRegex);
- },
- eval: function (context) {
- var that = this;
- var value = this.value;
- var variableReplacement = function (_, name1, name2) {
- var v = new Variable("@".concat(name1 !== null && name1 !== void 0 ? name1 : name2), that.getIndex(), that.fileInfo()).eval(context, true);
- return (v instanceof Quoted) ? v.value : v.toCSS();
- };
- var propertyReplacement = function (_, name1, name2) {
- var v = new Property("$".concat(name1 !== null && name1 !== void 0 ? name1 : name2), that.getIndex(), that.fileInfo()).eval(context, true);
- return (v instanceof Quoted) ? v.value : v.toCSS();
- };
- function iterativeReplace(value, regexp, replacementFnc) {
- var evaluatedValue = value;
- do {
- value = evaluatedValue.toString();
- evaluatedValue = value.replace(regexp, replacementFnc);
- } while (value !== evaluatedValue);
- return evaluatedValue;
- }
- value = iterativeReplace(value, this.variableRegex, variableReplacement);
- value = iterativeReplace(value, this.propRegex, propertyReplacement);
- return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());
- },
- compare: function (other) {
- // when comparing quoted strings allow the quote to differ
- if (other.type === 'Quoted' && !this.escaped && !other.escaped) {
- return Node.numericCompare(this.value, other.value);
- }
- else {
- return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;
- }
- }
- });
-
- function escapePath(path) {
- return path.replace(/[()'"\s]/g, function (match) { return "\\".concat(match); });
- }
- var URL = function (val, index, currentFileInfo, isEvald) {
- this.value = val;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.isEvald = isEvald;
- };
- URL.prototype = Object.assign(new Node(), {
- type: 'Url',
- accept: function (visitor) {
- this.value = visitor.visit(this.value);
- },
- genCSS: function (context, output) {
- output.add('url(');
- this.value.genCSS(context, output);
- output.add(')');
- },
- eval: function (context) {
- var val = this.value.eval(context);
- var rootpath;
- if (!this.isEvald) {
- // Add the rootpath if the URL requires a rewrite
- rootpath = this.fileInfo() && this.fileInfo().rootpath;
- if (typeof rootpath === 'string' &&
- typeof val.value === 'string' &&
- context.pathRequiresRewrite(val.value)) {
- if (!val.quote) {
- rootpath = escapePath(rootpath);
- }
- val.value = context.rewritePath(val.value, rootpath);
- }
- else {
- val.value = context.normalizePath(val.value);
- }
- // Add url args if enabled
- if (context.urlArgs) {
- if (!val.value.match(/^\s*data:/)) {
- var delimiter = val.value.indexOf('?') === -1 ? '?' : '&';
- var urlArgs = delimiter + context.urlArgs;
- if (val.value.indexOf('#') !== -1) {
- val.value = val.value.replace('#', "".concat(urlArgs, "#"));
- }
- else {
- val.value += urlArgs;
- }
- }
- }
- }
- return new URL(val, this.getIndex(), this.fileInfo(), true);
- }
- });
-
- var Media = function (value, features, index, currentFileInfo, visibilityInfo) {
- this._index = index;
- this._fileInfo = currentFileInfo;
- var selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();
- this.features = new Value(features);
- this.rules = [new Ruleset(selectors, value)];
- this.rules[0].allowImports = true;
- this.copyVisibilityInfo(visibilityInfo);
- this.allowRoot = true;
- this.setParent(selectors, this);
- this.setParent(this.features, this);
- this.setParent(this.rules, this);
- };
- Media.prototype = Object.assign(new AtRule(), __assign(__assign({ type: 'Media' }, NestableAtRulePrototype), { genCSS: function (context, output) {
- output.add('@media ', this._fileInfo, this._index);
- this.features.genCSS(context, output);
- this.outputRuleset(context, output, this.rules);
- }, eval: function (context) {
- if (!context.mediaBlocks) {
- context.mediaBlocks = [];
- context.mediaPath = [];
- }
- var media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());
- if (this.debugInfo) {
- this.rules[0].debugInfo = this.debugInfo;
- media.debugInfo = this.debugInfo;
- }
- media.features = this.features.eval(context);
- context.mediaPath.push(media);
- context.mediaBlocks.push(media);
- this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();
- context.frames.unshift(this.rules[0]);
- media.rules = [this.rules[0].eval(context)];
- context.frames.shift();
- context.mediaPath.pop();
- return context.mediaPath.length === 0 ? media.evalTop(context) :
- media.evalNested(context);
- } }));
-
- //
- // CSS @import node
- //
- // The general strategy here is that we don't want to wait
- // for the parsing to be completed, before we start importing
- // the file. That's because in the context of a browser,
- // most of the time will be spent waiting for the server to respond.
- //
- // On creation, we push the import path to our import queue, though
- // `import,push`, we also pass it a callback, which it'll call once
- // the file has been fetched, and parsed.
- //
- var Import = function (path, features, options, index, currentFileInfo, visibilityInfo) {
- this.options = options;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.path = path;
- this.features = features;
- this.allowRoot = true;
- if (this.options.less !== undefined || this.options.inline) {
- this.css = !this.options.less || this.options.inline;
- }
- else {
- var pathValue = this.getPath();
- if (pathValue && /[#.&?]css([?;].*)?$/.test(pathValue)) {
- this.css = true;
- }
- }
- this.copyVisibilityInfo(visibilityInfo);
- this.setParent(this.features, this);
- this.setParent(this.path, this);
- };
- Import.prototype = Object.assign(new Node(), {
- type: 'Import',
- accept: function (visitor) {
- if (this.features) {
- this.features = visitor.visit(this.features);
- }
- this.path = visitor.visit(this.path);
- if (!this.options.isPlugin && !this.options.inline && this.root) {
- this.root = visitor.visit(this.root);
- }
- },
- genCSS: function (context, output) {
- if (this.css && this.path._fileInfo.reference === undefined) {
- output.add('@import ', this._fileInfo, this._index);
- this.path.genCSS(context, output);
- if (this.features) {
- output.add(' ');
- this.features.genCSS(context, output);
- }
- output.add(';');
- }
- },
- getPath: function () {
- return (this.path instanceof URL) ?
- this.path.value.value : this.path.value;
- },
- isVariableImport: function () {
- var path = this.path;
- if (path instanceof URL) {
- path = path.value;
- }
- if (path instanceof Quoted) {
- return path.containsVariables();
- }
- return true;
- },
- evalForImport: function (context) {
- var path = this.path;
- if (path instanceof URL) {
- path = path.value;
- }
- return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());
- },
- evalPath: function (context) {
- var path = this.path.eval(context);
- var fileInfo = this._fileInfo;
- if (!(path instanceof URL)) {
- // Add the rootpath if the URL requires a rewrite
- var pathValue = path.value;
- if (fileInfo &&
- pathValue &&
- context.pathRequiresRewrite(pathValue)) {
- path.value = context.rewritePath(pathValue, fileInfo.rootpath);
- }
- else {
- path.value = context.normalizePath(path.value);
- }
- }
- return path;
- },
- eval: function (context) {
- var result = this.doEval(context);
- if (this.options.reference || this.blocksVisibility()) {
- if (result.length || result.length === 0) {
- result.forEach(function (node) {
- node.addVisibilityBlock();
- });
- }
- else {
- result.addVisibilityBlock();
- }
- }
- return result;
- },
- doEval: function (context) {
- var ruleset;
- var registry;
- var features = this.features && this.features.eval(context);
- if (this.options.isPlugin) {
- if (this.root && this.root.eval) {
- try {
- this.root.eval(context);
- }
- catch (e) {
- e.message = 'Plugin error during evaluation';
- throw new LessError(e, this.root.imports, this.root.filename);
- }
- }
- registry = context.frames[0] && context.frames[0].functionRegistry;
- if (registry && this.root && this.root.functions) {
- registry.addMultiple(this.root.functions);
- }
- return [];
- }
- if (this.skip) {
- if (typeof this.skip === 'function') {
- this.skip = this.skip();
- }
- if (this.skip) {
- return [];
- }
- }
- if (this.features) {
- var featureValue = this.features.value;
- if (Array.isArray(featureValue) && featureValue.length >= 1) {
- var expr = featureValue[0];
- if (expr.type === 'Expression' && Array.isArray(expr.value) && expr.value.length >= 2) {
- featureValue = expr.value;
- var isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'
- && featureValue[1].type === 'Paren';
- if (isLayer) {
- this.css = false;
- }
- }
- }
- }
- if (this.options.inline) {
- var contents = new Anonymous(this.root, 0, {
- filename: this.importedFilename,
- reference: this.path._fileInfo && this.path._fileInfo.reference
- }, true, true);
- return this.features ? new Media([contents], this.features.value) : [contents];
- }
- else if (this.css || this.layerCss) {
- var newImport = new Import(this.evalPath(context), features, this.options, this._index);
- if (this.layerCss) {
- newImport.css = this.layerCss;
- newImport.path._fileInfo = this._fileInfo;
- }
- if (!newImport.css && this.error) {
- throw this.error;
- }
- return newImport;
- }
- else if (this.root) {
- if (this.features) {
- var featureValue = this.features.value;
- if (Array.isArray(featureValue) && featureValue.length === 1) {
- var expr = featureValue[0];
- if (expr.type === 'Expression' && Array.isArray(expr.value) && expr.value.length >= 2) {
- featureValue = expr.value;
- var isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'
- && featureValue[1].type === 'Paren';
- if (isLayer) {
- this.layerCss = true;
- featureValue[0] = new Expression(featureValue.slice(0, 2));
- featureValue.splice(1, 1);
- featureValue[0].noSpacing = true;
- return this;
- }
- }
- }
- }
- ruleset = new Ruleset(null, copyArray(this.root.rules));
- ruleset.evalImports(context);
- return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;
- }
- else {
- if (this.features) {
- var featureValue = this.features.value;
- if (Array.isArray(featureValue) && featureValue.length >= 1) {
- featureValue = featureValue[0].value;
- if (Array.isArray(featureValue) && featureValue.length >= 2) {
- var isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'
- && featureValue[1].type === 'Paren';
- if (isLayer) {
- this.css = true;
- featureValue[0] = new Expression(featureValue.slice(0, 2));
- featureValue.splice(1, 1);
- featureValue[0].noSpacing = true;
- return this;
- }
- }
- }
- }
- return [];
- }
- }
- });
-
- var JsEvalNode = function () { };
- JsEvalNode.prototype = Object.assign(new Node(), {
- evaluateJavaScript: function (expression, context) {
- var result;
- var that = this;
- var evalContext = {};
- if (!context.javascriptEnabled) {
- throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',
- filename: this.fileInfo().filename,
- index: this.getIndex() };
- }
- expression = expression.replace(/@\{([\w-]+)\}/g, function (_, name) {
- return that.jsify(new Variable("@".concat(name), that.getIndex(), that.fileInfo()).eval(context));
- });
- try {
- expression = new Function("return (".concat(expression, ")"));
- }
- catch (e) {
- throw { message: "JavaScript evaluation error: ".concat(e.message, " from `").concat(expression, "`"),
- filename: this.fileInfo().filename,
- index: this.getIndex() };
- }
- var variables = context.frames[0].variables();
- for (var k in variables) {
- // eslint-disable-next-line no-prototype-builtins
- if (variables.hasOwnProperty(k)) {
- evalContext[k.slice(1)] = {
- value: variables[k].value,
- toJS: function () {
- return this.value.eval(context).toCSS();
- }
- };
- }
- }
- try {
- result = expression.call(evalContext);
- }
- catch (e) {
- throw { message: "JavaScript evaluation error: '".concat(e.name, ": ").concat(e.message.replace(/["]/g, '\''), "'"),
- filename: this.fileInfo().filename,
- index: this.getIndex() };
- }
- return result;
- },
- jsify: function (obj) {
- if (Array.isArray(obj.value) && (obj.value.length > 1)) {
- return "[".concat(obj.value.map(function (v) { return v.toCSS(); }).join(', '), "]");
- }
- else {
- return obj.toCSS();
- }
- }
- });
-
- var JavaScript = function (string, escaped, index, currentFileInfo) {
- this.escaped = escaped;
- this.expression = string;
- this._index = index;
- this._fileInfo = currentFileInfo;
- };
- JavaScript.prototype = Object.assign(new JsEvalNode(), {
- type: 'JavaScript',
- eval: function (context) {
- var result = this.evaluateJavaScript(this.expression, context);
- var type = typeof result;
- if (type === 'number' && !isNaN(result)) {
- return new Dimension(result);
- }
- else if (type === 'string') {
- return new Quoted("\"".concat(result, "\""), result, this.escaped, this._index);
- }
- else if (Array.isArray(result)) {
- return new Anonymous(result.join(', '));
- }
- else {
- return new Anonymous(result);
- }
- }
- });
-
- var Assignment = function (key, val) {
- this.key = key;
- this.value = val;
- };
- Assignment.prototype = Object.assign(new Node(), {
- type: 'Assignment',
- accept: function (visitor) {
- this.value = visitor.visit(this.value);
- },
- eval: function (context) {
- if (this.value.eval) {
- return new Assignment(this.key, this.value.eval(context));
- }
- return this;
- },
- genCSS: function (context, output) {
- output.add("".concat(this.key, "="));
- if (this.value.genCSS) {
- this.value.genCSS(context, output);
- }
- else {
- output.add(this.value);
- }
- }
- });
-
- var Condition = function (op, l, r, i, negate) {
- this.op = op.trim();
- this.lvalue = l;
- this.rvalue = r;
- this._index = i;
- this.negate = negate;
- };
- Condition.prototype = Object.assign(new Node(), {
- type: 'Condition',
- accept: function (visitor) {
- this.lvalue = visitor.visit(this.lvalue);
- this.rvalue = visitor.visit(this.rvalue);
- },
- eval: function (context) {
- var result = (function (op, a, b) {
- switch (op) {
- case 'and': return a && b;
- case 'or': return a || b;
- default:
- switch (Node.compare(a, b)) {
- case -1:
- return op === '<' || op === '=<' || op === '<=';
- case 0:
- return op === '=' || op === '>=' || op === '=<' || op === '<=';
- case 1:
- return op === '>' || op === '>=';
- default:
- return false;
- }
- }
- })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));
- return this.negate ? !result : result;
- }
- });
-
- var QueryInParens = function (op, l, m, op2, r, i) {
- this.op = op.trim();
- this.lvalue = l;
- this.mvalue = m;
- this.op2 = op2 ? op2.trim() : null;
- this.rvalue = r;
- this._index = i;
- this.mvalues = [];
- };
- QueryInParens.prototype = Object.assign(new Node(), {
- type: 'QueryInParens',
- accept: function (visitor) {
- this.lvalue = visitor.visit(this.lvalue);
- this.mvalue = visitor.visit(this.mvalue);
- if (this.rvalue) {
- this.rvalue = visitor.visit(this.rvalue);
- }
- },
- eval: function (context) {
- this.lvalue = this.lvalue.eval(context);
- var variableDeclaration;
- var rule;
- for (var i_1 = 0; (rule = context.frames[i_1]); i_1++) {
- if (rule.type === 'Ruleset') {
- variableDeclaration = rule.rules.find(function (r) {
- if ((r instanceof Declaration) && r.variable) {
- return true;
- }
- return false;
- });
- if (variableDeclaration) {
- break;
- }
- }
- }
- if (!this.mvalueCopy) {
- this.mvalueCopy = copy(this.mvalue);
- }
- if (variableDeclaration) {
- this.mvalue = this.mvalueCopy;
- this.mvalue = this.mvalue.eval(context);
- this.mvalues.push(this.mvalue);
- }
- else {
- this.mvalue = this.mvalue.eval(context);
- }
- if (this.rvalue) {
- this.rvalue = this.rvalue.eval(context);
- }
- return this;
- },
- genCSS: function (context, output) {
- this.lvalue.genCSS(context, output);
- output.add(' ' + this.op + ' ');
- if (this.mvalues.length > 0) {
- this.mvalue = this.mvalues.shift();
- }
- this.mvalue.genCSS(context, output);
- if (this.rvalue) {
- output.add(' ' + this.op2 + ' ');
- this.rvalue.genCSS(context, output);
- }
- },
- });
-
- var Container = function (value, features, index, currentFileInfo, visibilityInfo) {
- this._index = index;
- this._fileInfo = currentFileInfo;
- var selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();
- this.features = new Value(features);
- this.rules = [new Ruleset(selectors, value)];
- this.rules[0].allowImports = true;
- this.copyVisibilityInfo(visibilityInfo);
- this.allowRoot = true;
- this.setParent(selectors, this);
- this.setParent(this.features, this);
- this.setParent(this.rules, this);
- };
- Container.prototype = Object.assign(new AtRule(), __assign(__assign({ type: 'Container' }, NestableAtRulePrototype), { genCSS: function (context, output) {
- output.add('@container ', this._fileInfo, this._index);
- this.features.genCSS(context, output);
- this.outputRuleset(context, output, this.rules);
- }, eval: function (context) {
- if (!context.mediaBlocks) {
- context.mediaBlocks = [];
- context.mediaPath = [];
- }
- var media = new Container(null, [], this._index, this._fileInfo, this.visibilityInfo());
- if (this.debugInfo) {
- this.rules[0].debugInfo = this.debugInfo;
- media.debugInfo = this.debugInfo;
- }
- media.features = this.features.eval(context);
- context.mediaPath.push(media);
- context.mediaBlocks.push(media);
- this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();
- context.frames.unshift(this.rules[0]);
- media.rules = [this.rules[0].eval(context)];
- context.frames.shift();
- context.mediaPath.pop();
- return context.mediaPath.length === 0 ? media.evalTop(context) :
- media.evalNested(context);
- } }));
-
- var UnicodeDescriptor = function (value) {
- this.value = value;
- };
- UnicodeDescriptor.prototype = Object.assign(new Node(), {
- type: 'UnicodeDescriptor'
- });
-
- var Negative = function (node) {
- this.value = node;
- };
- Negative.prototype = Object.assign(new Node(), {
- type: 'Negative',
- genCSS: function (context, output) {
- output.add('-');
- this.value.genCSS(context, output);
- },
- eval: function (context) {
- if (context.isMathOn()) {
- return (new Operation('*', [new Dimension(-1), this.value])).eval(context);
- }
- return new Negative(this.value.eval(context));
- }
- });
-
- var Extend = function (selector, option, index, currentFileInfo, visibilityInfo) {
- this.selector = selector;
- this.option = option;
- this.object_id = Extend.next_id++;
- this.parent_ids = [this.object_id];
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.copyVisibilityInfo(visibilityInfo);
- this.allowRoot = true;
- switch (option) {
- case '!all':
- case 'all':
- this.allowBefore = true;
- this.allowAfter = true;
- break;
- default:
- this.allowBefore = false;
- this.allowAfter = false;
- break;
- }
- this.setParent(this.selector, this);
- };
- Extend.prototype = Object.assign(new Node(), {
- type: 'Extend',
- accept: function (visitor) {
- this.selector = visitor.visit(this.selector);
- },
- eval: function (context) {
- return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());
- },
- // remove when Nodes have JSDoc types
- // eslint-disable-next-line no-unused-vars
- clone: function (context) {
- return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());
- },
- // it concatenates (joins) all selectors in selector array
- findSelfSelectors: function (selectors) {
- var selfElements = [], i, selectorElements;
- for (i = 0; i < selectors.length; i++) {
- selectorElements = selectors[i].elements;
- // duplicate the logic in genCSS function inside the selector node.
- // future TODO - move both logics into the selector joiner visitor
- if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {
- selectorElements[0].combinator.value = ' ';
- }
- selfElements = selfElements.concat(selectors[i].elements);
- }
- this.selfSelectors = [new Selector(selfElements)];
- this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());
- }
- });
- Extend.next_id = 0;
-
- var VariableCall = function (variable, index, currentFileInfo) {
- this.variable = variable;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.allowRoot = true;
- };
- VariableCall.prototype = Object.assign(new Node(), {
- type: 'VariableCall',
- eval: function (context) {
- var rules;
- var detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);
- var error = new LessError({ message: "Could not evaluate variable call ".concat(this.variable) });
- if (!detachedRuleset.ruleset) {
- if (detachedRuleset.rules) {
- rules = detachedRuleset;
- }
- else if (Array.isArray(detachedRuleset)) {
- rules = new Ruleset('', detachedRuleset);
- }
- else if (Array.isArray(detachedRuleset.value)) {
- rules = new Ruleset('', detachedRuleset.value);
- }
- else {
- throw error;
- }
- detachedRuleset = new DetachedRuleset(rules);
- }
- if (detachedRuleset.ruleset) {
- return detachedRuleset.callEval(context);
- }
- throw error;
- }
- });
-
- var NamespaceValue = function (ruleCall, lookups, index, fileInfo) {
- this.value = ruleCall;
- this.lookups = lookups;
- this._index = index;
- this._fileInfo = fileInfo;
- };
- NamespaceValue.prototype = Object.assign(new Node(), {
- type: 'NamespaceValue',
- eval: function (context) {
- var i, name, rules = this.value.eval(context);
- for (i = 0; i < this.lookups.length; i++) {
- name = this.lookups[i];
- /**
- * Eval'd DRs return rulesets.
- * Eval'd mixins return rules, so let's make a ruleset if we need it.
- * We need to do this because of late parsing of values
- */
- if (Array.isArray(rules)) {
- rules = new Ruleset([new Selector()], rules);
- }
- if (name === '') {
- rules = rules.lastDeclaration();
- }
- else if (name.charAt(0) === '@') {
- if (name.charAt(1) === '@') {
- name = "@".concat(new Variable(name.substr(1)).eval(context).value);
- }
- if (rules.variables) {
- rules = rules.variable(name);
- }
- if (!rules) {
- throw { type: 'Name',
- message: "variable ".concat(name, " not found"),
- filename: this.fileInfo().filename,
- index: this.getIndex() };
- }
- }
- else {
- if (name.substring(0, 2) === '$@') {
- name = "$".concat(new Variable(name.substr(1)).eval(context).value);
- }
- else {
- name = name.charAt(0) === '$' ? name : "$".concat(name);
- }
- if (rules.properties) {
- rules = rules.property(name);
- }
- if (!rules) {
- throw { type: 'Name',
- message: "property \"".concat(name.substr(1), "\" not found"),
- filename: this.fileInfo().filename,
- index: this.getIndex() };
- }
- // Properties are an array of values, since a ruleset can have multiple props.
- // We pick the last one (the "cascaded" value)
- rules = rules[rules.length - 1];
- }
- if (rules.value) {
- rules = rules.eval(context).value;
- }
- if (rules.ruleset) {
- rules = rules.ruleset.eval(context);
- }
- }
- return rules;
- }
- });
-
- var Definition = function (name, params, rules, condition, variadic, frames, visibilityInfo) {
- this.name = name || 'anonymous mixin';
- this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];
- this.params = params;
- this.condition = condition;
- this.variadic = variadic;
- this.arity = params.length;
- this.rules = rules;
- this._lookups = {};
- var optionalParameters = [];
- this.required = params.reduce(function (count, p) {
- if (!p.name || (p.name && !p.value)) {
- return count + 1;
- }
- else {
- optionalParameters.push(p.name);
- return count;
- }
- }, 0);
- this.optionalParameters = optionalParameters;
- this.frames = frames;
- this.copyVisibilityInfo(visibilityInfo);
- this.allowRoot = true;
- };
- Definition.prototype = Object.assign(new Ruleset(), {
- type: 'MixinDefinition',
- evalFirst: true,
- accept: function (visitor) {
- if (this.params && this.params.length) {
- this.params = visitor.visitArray(this.params);
- }
- this.rules = visitor.visitArray(this.rules);
- if (this.condition) {
- this.condition = visitor.visit(this.condition);
- }
- },
- evalParams: function (context, mixinEnv, args, evaldArguments) {
- /* jshint boss:true */
- var frame = new Ruleset(null, null);
- var varargs;
- var arg;
- var params = copyArray(this.params);
- var i;
- var j;
- var val;
- var name;
- var isNamedFound;
- var argIndex;
- var argsLength = 0;
- if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {
- frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();
- }
- mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));
- if (args) {
- args = copyArray(args);
- argsLength = args.length;
- for (i = 0; i < argsLength; i++) {
- arg = args[i];
- if (name = (arg && arg.name)) {
- isNamedFound = false;
- for (j = 0; j < params.length; j++) {
- if (!evaldArguments[j] && name === params[j].name) {
- evaldArguments[j] = arg.value.eval(context);
- frame.prependRule(new Declaration(name, arg.value.eval(context)));
- isNamedFound = true;
- break;
- }
- }
- if (isNamedFound) {
- args.splice(i, 1);
- i--;
- continue;
- }
- else {
- throw { type: 'Runtime', message: "Named argument for ".concat(this.name, " ").concat(args[i].name, " not found") };
- }
- }
- }
- }
- argIndex = 0;
- for (i = 0; i < params.length; i++) {
- if (evaldArguments[i]) {
- continue;
- }
- arg = args && args[argIndex];
- if (name = params[i].name) {
- if (params[i].variadic) {
- varargs = [];
- for (j = argIndex; j < argsLength; j++) {
- varargs.push(args[j].value.eval(context));
- }
- frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));
- }
- else {
- val = arg && arg.value;
- if (val) {
- // This was a mixin call, pass in a detached ruleset of it's eval'd rules
- if (Array.isArray(val)) {
- val = new DetachedRuleset(new Ruleset('', val));
- }
- else {
- val = val.eval(context);
- }
- }
- else if (params[i].value) {
- val = params[i].value.eval(mixinEnv);
- frame.resetCache();
- }
- else {
- throw { type: 'Runtime', message: "wrong number of arguments for ".concat(this.name, " (").concat(argsLength, " for ").concat(this.arity, ")") };
- }
- frame.prependRule(new Declaration(name, val));
- evaldArguments[i] = val;
- }
- }
- if (params[i].variadic && args) {
- for (j = argIndex; j < argsLength; j++) {
- evaldArguments[j] = args[j].value.eval(context);
- }
- }
- argIndex++;
- }
- return frame;
- },
- makeImportant: function () {
- var rules = !this.rules ? this.rules : this.rules.map(function (r) {
- if (r.makeImportant) {
- return r.makeImportant(true);
- }
- else {
- return r;
- }
- });
- var result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);
- return result;
- },
- eval: function (context) {
- return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || copyArray(context.frames));
- },
- evalCall: function (context, args, important) {
- var _arguments = [];
- var mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;
- var frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);
- var rules;
- var ruleset;
- frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));
- rules = copyArray(this.rules);
- ruleset = new Ruleset(null, rules);
- ruleset.originalRuleset = this;
- ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));
- if (important) {
- ruleset = ruleset.makeImportant();
- }
- return ruleset;
- },
- matchCondition: function (args, context) {
- if (this.condition && !this.condition.eval(new contexts.Eval(context, [this.evalParams(context, /* the parameter variables */ new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]
- .concat(this.frames || []) // the parent namespace/mixin frames
- .concat(context.frames)))) { // the current environment frames
- return false;
- }
- return true;
- },
- matchArgs: function (args, context) {
- var allArgsCnt = (args && args.length) || 0;
- var len;
- var optionalParameters = this.optionalParameters;
- var requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {
- if (optionalParameters.indexOf(p.name) < 0) {
- return count + 1;
- }
- else {
- return count;
- }
- }, 0);
- if (!this.variadic) {
- if (requiredArgsCnt < this.required) {
- return false;
- }
- if (allArgsCnt > this.params.length) {
- return false;
- }
- }
- else {
- if (requiredArgsCnt < (this.required - 1)) {
- return false;
- }
- }
- // check patterns
- len = Math.min(requiredArgsCnt, this.arity);
- for (var i_1 = 0; i_1 < len; i_1++) {
- if (!this.params[i_1].name && !this.params[i_1].variadic) {
- if (args[i_1].value.eval(context).toCSS() != this.params[i_1].value.eval(context).toCSS()) {
- return false;
- }
- }
- }
- return true;
- }
- });
-
- var MixinCall = function (elements, args, index, currentFileInfo, important) {
- this.selector = new Selector(elements);
- this.arguments = args || [];
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.important = important;
- this.allowRoot = true;
- this.setParent(this.selector, this);
- };
- MixinCall.prototype = Object.assign(new Node(), {
- type: 'MixinCall',
- accept: function (visitor) {
- if (this.selector) {
- this.selector = visitor.visit(this.selector);
- }
- if (this.arguments.length) {
- this.arguments = visitor.visitArray(this.arguments);
- }
- },
- eval: function (context) {
- var mixins;
- var mixin;
- var mixinPath;
- var args = [];
- var arg;
- var argValue;
- var rules = [];
- var match = false;
- var i;
- var m;
- var f;
- var isRecursive;
- var isOneFound;
- var candidates = [];
- var candidate;
- var conditionResult = [];
- var defaultResult;
- var defFalseEitherCase = -1;
- var defNone = 0;
- var defTrue = 1;
- var defFalse = 2;
- var count;
- var originalRuleset;
- var noArgumentsFilter;
- this.selector = this.selector.eval(context);
- function calcDefGroup(mixin, mixinPath) {
- var f, p, namespace;
- for (f = 0; f < 2; f++) {
- conditionResult[f] = true;
- defaultFunc.value(f);
- for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {
- namespace = mixinPath[p];
- if (namespace.matchCondition) {
- conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);
- }
- }
- if (mixin.matchCondition) {
- conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);
- }
- }
- if (conditionResult[0] || conditionResult[1]) {
- if (conditionResult[0] != conditionResult[1]) {
- return conditionResult[1] ?
- defTrue : defFalse;
- }
- return defNone;
- }
- return defFalseEitherCase;
- }
- for (i = 0; i < this.arguments.length; i++) {
- arg = this.arguments[i];
- argValue = arg.value.eval(context);
- if (arg.expand && Array.isArray(argValue.value)) {
- argValue = argValue.value;
- for (m = 0; m < argValue.length; m++) {
- args.push({ value: argValue[m] });
- }
- }
- else {
- args.push({ name: arg.name, value: argValue });
- }
- }
- noArgumentsFilter = function (rule) { return rule.matchArgs(null, context); };
- for (i = 0; i < context.frames.length; i++) {
- if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {
- isOneFound = true;
- // To make `default()` function independent of definition order we have two "subpasses" here.
- // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),
- // and build candidate list with corresponding flags. Then, when we know all possible matches,
- // we make a final decision.
- for (m = 0; m < mixins.length; m++) {
- mixin = mixins[m].rule;
- mixinPath = mixins[m].path;
- isRecursive = false;
- for (f = 0; f < context.frames.length; f++) {
- if ((!(mixin instanceof Definition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {
- isRecursive = true;
- break;
- }
- }
- if (isRecursive) {
- continue;
- }
- if (mixin.matchArgs(args, context)) {
- candidate = { mixin: mixin, group: calcDefGroup(mixin, mixinPath) };
- if (candidate.group !== defFalseEitherCase) {
- candidates.push(candidate);
- }
- match = true;
- }
- }
- defaultFunc.reset();
- count = [0, 0, 0];
- for (m = 0; m < candidates.length; m++) {
- count[candidates[m].group]++;
- }
- if (count[defNone] > 0) {
- defaultResult = defFalse;
- }
- else {
- defaultResult = defTrue;
- if ((count[defTrue] + count[defFalse]) > 1) {
- throw { type: 'Runtime',
- message: "Ambiguous use of `default()` found when matching for `".concat(this.format(args), "`"),
- index: this.getIndex(), filename: this.fileInfo().filename };
- }
- }
- for (m = 0; m < candidates.length; m++) {
- candidate = candidates[m].group;
- if ((candidate === defNone) || (candidate === defaultResult)) {
- try {
- mixin = candidates[m].mixin;
- if (!(mixin instanceof Definition)) {
- originalRuleset = mixin.originalRuleset || mixin;
- mixin = new Definition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());
- mixin.originalRuleset = originalRuleset;
- }
- var newRules = mixin.evalCall(context, args, this.important).rules;
- this._setVisibilityToReplacement(newRules);
- Array.prototype.push.apply(rules, newRules);
- }
- catch (e) {
- throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };
- }
- }
- }
- if (match) {
- return rules;
- }
- }
- }
- if (isOneFound) {
- throw { type: 'Runtime',
- message: "No matching definition was found for `".concat(this.format(args), "`"),
- index: this.getIndex(), filename: this.fileInfo().filename };
- }
- else {
- throw { type: 'Name',
- message: "".concat(this.selector.toCSS().trim(), " is undefined"),
- index: this.getIndex(), filename: this.fileInfo().filename };
- }
- },
- _setVisibilityToReplacement: function (replacement) {
- var i, rule;
- if (this.blocksVisibility()) {
- for (i = 0; i < replacement.length; i++) {
- rule = replacement[i];
- rule.addVisibilityBlock();
- }
- }
- },
- format: function (args) {
- return "".concat(this.selector.toCSS().trim(), "(").concat(args ? args.map(function (a) {
- var argValue = '';
- if (a.name) {
- argValue += "".concat(a.name, ":");
- }
- if (a.value.toCSS) {
- argValue += a.value.toCSS();
- }
- else {
- argValue += '???';
- }
- return argValue;
- }).join(', ') : '', ")");
- }
- });
-
- var tree = {
- Node: Node,
- Color: Color,
- AtRule: AtRule,
- DetachedRuleset: DetachedRuleset,
- Operation: Operation,
- Dimension: Dimension,
- Unit: Unit,
- Keyword: Keyword,
- Variable: Variable,
- Property: Property,
- Ruleset: Ruleset,
- Element: Element,
- Attribute: Attribute,
- Combinator: Combinator,
- Selector: Selector,
- Quoted: Quoted,
- Expression: Expression,
- Declaration: Declaration,
- Call: Call,
- URL: URL,
- Import: Import,
- Comment: Comment,
- Anonymous: Anonymous,
- Value: Value,
- JavaScript: JavaScript,
- Assignment: Assignment,
- Condition: Condition,
- Paren: Paren,
- Media: Media,
- Container: Container,
- QueryInParens: QueryInParens,
- UnicodeDescriptor: UnicodeDescriptor,
- Negative: Negative,
- Extend: Extend,
- VariableCall: VariableCall,
- NamespaceValue: NamespaceValue,
- mixin: {
- Call: MixinCall,
- Definition: Definition
- }
- };
-
- var AbstractFileManager = /** @class */ (function () {
- function AbstractFileManager() {
- }
- AbstractFileManager.prototype.getPath = function (filename) {
- var j = filename.lastIndexOf('?');
- if (j > 0) {
- filename = filename.slice(0, j);
- }
- j = filename.lastIndexOf('/');
- if (j < 0) {
- j = filename.lastIndexOf('\\');
- }
- if (j < 0) {
- return '';
- }
- return filename.slice(0, j + 1);
- };
- AbstractFileManager.prototype.tryAppendExtension = function (path, ext) {
- return /(\.[a-z]*$)|([?;].*)$/.test(path) ? path : path + ext;
- };
- AbstractFileManager.prototype.tryAppendLessExtension = function (path) {
- return this.tryAppendExtension(path, '.less');
- };
- AbstractFileManager.prototype.supportsSync = function () {
- return false;
- };
- AbstractFileManager.prototype.alwaysMakePathsAbsolute = function () {
- return false;
- };
- AbstractFileManager.prototype.isPathAbsolute = function (filename) {
- return (/^(?:[a-z-]+:|\/|\\|#)/i).test(filename);
- };
- // TODO: pull out / replace?
- AbstractFileManager.prototype.join = function (basePath, laterPath) {
- if (!basePath) {
- return laterPath;
- }
- return basePath + laterPath;
- };
- AbstractFileManager.prototype.pathDiff = function (url, baseUrl) {
- // diff between two paths to create a relative path
- var urlParts = this.extractUrlParts(url);
- var baseUrlParts = this.extractUrlParts(baseUrl);
- var i;
- var max;
- var urlDirectories;
- var baseUrlDirectories;
- var diff = '';
- if (urlParts.hostPart !== baseUrlParts.hostPart) {
- return '';
- }
- max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);
- for (i = 0; i < max; i++) {
- if (baseUrlParts.directories[i] !== urlParts.directories[i]) {
- break;
- }
- }
- baseUrlDirectories = baseUrlParts.directories.slice(i);
- urlDirectories = urlParts.directories.slice(i);
- for (i = 0; i < baseUrlDirectories.length - 1; i++) {
- diff += '../';
- }
- for (i = 0; i < urlDirectories.length - 1; i++) {
- diff += "".concat(urlDirectories[i], "/");
- }
- return diff;
- };
- /**
- * Helper function, not part of API.
- * This should be replaceable by newer Node / Browser APIs
- *
- * @param {string} url
- * @param {string} baseUrl
- */
- AbstractFileManager.prototype.extractUrlParts = function (url, baseUrl) {
- // urlParts[1] = protocol://hostname/ OR /
- // urlParts[2] = / if path relative to host base
- // urlParts[3] = directories
- // urlParts[4] = filename
- // urlParts[5] = parameters
- var urlPartsRegex = /^((?:[a-z-]+:)?\/{2}(?:[^/?#]*\/)|([/\\]))?((?:[^/\\?#]*[/\\])*)([^/\\?#]*)([#?].*)?$/i;
- var urlParts = url.match(urlPartsRegex);
- var returner = {};
- var rawDirectories = [];
- var directories = [];
- var i;
- var baseUrlParts;
- if (!urlParts) {
- throw new Error("Could not parse sheet href - '".concat(url, "'"));
- }
- // Stylesheets in IE don't always return the full path
- if (baseUrl && (!urlParts[1] || urlParts[2])) {
- baseUrlParts = baseUrl.match(urlPartsRegex);
- if (!baseUrlParts) {
- throw new Error("Could not parse page url - '".concat(baseUrl, "'"));
- }
- urlParts[1] = urlParts[1] || baseUrlParts[1] || '';
- if (!urlParts[2]) {
- urlParts[3] = baseUrlParts[3] + urlParts[3];
- }
- }
- if (urlParts[3]) {
- rawDirectories = urlParts[3].replace(/\\/g, '/').split('/');
- // collapse '..' and skip '.'
- for (i = 0; i < rawDirectories.length; i++) {
- if (rawDirectories[i] === '..') {
- directories.pop();
- }
- else if (rawDirectories[i] !== '.') {
- directories.push(rawDirectories[i]);
- }
- }
- }
- returner.hostPart = urlParts[1];
- returner.directories = directories;
- returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');
- returner.path = (urlParts[1] || '') + directories.join('/');
- returner.filename = urlParts[4];
- returner.fileUrl = returner.path + (urlParts[4] || '');
- returner.url = returner.fileUrl + (urlParts[5] || '');
- return returner;
- };
- return AbstractFileManager;
- }());
-
- var AbstractPluginLoader = /** @class */ (function () {
- function AbstractPluginLoader() {
- // Implemented by Node.js plugin loader
- this.require = function () {
- return null;
- };
- }
- AbstractPluginLoader.prototype.evalPlugin = function (contents, context, imports, pluginOptions, fileInfo) {
- var loader, registry, pluginObj, localModule, pluginManager, filename, result;
- pluginManager = context.pluginManager;
- if (fileInfo) {
- if (typeof fileInfo === 'string') {
- filename = fileInfo;
- }
- else {
- filename = fileInfo.filename;
- }
- }
- var shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;
- if (filename) {
- pluginObj = pluginManager.get(filename);
- if (pluginObj) {
- result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);
- if (result) {
- return result;
- }
- try {
- if (pluginObj.use) {
- pluginObj.use.call(this.context, pluginObj);
- }
- }
- catch (e) {
- e.message = e.message || 'Error during @plugin call';
- return new LessError(e, imports, filename);
- }
- return pluginObj;
- }
- }
- localModule = {
- exports: {},
- pluginManager: pluginManager,
- fileInfo: fileInfo
- };
- registry = functionRegistry.create();
- var registerPlugin = function (obj) {
- pluginObj = obj;
- };
- try {
- loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);
- loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);
- }
- catch (e) {
- return new LessError(e, imports, filename);
- }
- if (!pluginObj) {
- pluginObj = localModule.exports;
- }
- pluginObj = this.validatePlugin(pluginObj, filename, shortname);
- if (pluginObj instanceof LessError) {
- return pluginObj;
- }
- if (pluginObj) {
- pluginObj.imports = imports;
- pluginObj.filename = filename;
- // For < 3.x (or unspecified minVersion) - setOptions() before install()
- if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {
- result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);
- if (result) {
- return result;
- }
- }
- // Run on first load
- pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);
- pluginObj.functions = registry.getLocalFunctions();
- // Need to call setOptions again because the pluginObj might have functions
- result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);
- if (result) {
- return result;
- }
- // Run every @plugin call
- try {
- if (pluginObj.use) {
- pluginObj.use.call(this.context, pluginObj);
- }
- }
- catch (e) {
- e.message = e.message || 'Error during @plugin call';
- return new LessError(e, imports, filename);
- }
- }
- else {
- return new LessError({ message: 'Not a valid plugin' }, imports, filename);
- }
- return pluginObj;
- };
- AbstractPluginLoader.prototype.trySetOptions = function (plugin, filename, name, options) {
- if (options && !plugin.setOptions) {
- return new LessError({
- message: "Options have been provided but the plugin ".concat(name, " does not support any options.")
- });
- }
- try {
- plugin.setOptions && plugin.setOptions(options);
- }
- catch (e) {
- return new LessError(e);
- }
- };
- AbstractPluginLoader.prototype.validatePlugin = function (plugin, filename, name) {
- if (plugin) {
- // support plugins being a function
- // so that the plugin can be more usable programmatically
- if (typeof plugin === 'function') {
- plugin = new plugin();
- }
- if (plugin.minVersion) {
- if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {
- return new LessError({
- message: "Plugin ".concat(name, " requires version ").concat(this.versionToString(plugin.minVersion))
- });
- }
- }
- return plugin;
- }
- return null;
- };
- AbstractPluginLoader.prototype.compareVersion = function (aVersion, bVersion) {
- if (typeof aVersion === 'string') {
- aVersion = aVersion.match(/^(\d+)\.?(\d+)?\.?(\d+)?/);
- aVersion.shift();
- }
- for (var i_1 = 0; i_1 < aVersion.length; i_1++) {
- if (aVersion[i_1] !== bVersion[i_1]) {
- return parseInt(aVersion[i_1]) > parseInt(bVersion[i_1]) ? -1 : 1;
- }
- }
- return 0;
- };
- AbstractPluginLoader.prototype.versionToString = function (version) {
- var versionString = '';
- for (var i_2 = 0; i_2 < version.length; i_2++) {
- versionString += (versionString ? '.' : '') + version[i_2];
- }
- return versionString;
- };
- AbstractPluginLoader.prototype.printUsage = function (plugins) {
- for (var i_3 = 0; i_3 < plugins.length; i_3++) {
- var plugin = plugins[i_3];
- if (plugin.printUsage) {
- plugin.printUsage();
- }
- }
- };
- return AbstractPluginLoader;
- }());
-
- function boolean(condition) {
- return condition ? Keyword.True : Keyword.False;
- }
- /**
- * Functions with evalArgs set to false are sent context
- * as the first argument.
- */
- function If(context, condition, trueValue, falseValue) {
- return condition.eval(context) ? trueValue.eval(context)
- : (falseValue ? falseValue.eval(context) : new Anonymous);
- }
- If.evalArgs = false;
- function isdefined(context, variable) {
- try {
- variable.eval(context);
- return Keyword.True;
- }
- catch (e) {
- return Keyword.False;
- }
- }
- isdefined.evalArgs = false;
- var boolean$1 = { isdefined: isdefined, boolean: boolean, 'if': If };
-
- var colorFunctions;
- function clamp(val) {
- return Math.min(1, Math.max(0, val));
- }
- function hsla(origColor, hsl) {
- var color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);
- if (color) {
- if (origColor.value &&
- /^(rgb|hsl)/.test(origColor.value)) {
- color.value = origColor.value;
- }
- else {
- color.value = 'rgb';
- }
- return color;
- }
- }
- function toHSL(color) {
- if (color.toHSL) {
- return color.toHSL();
- }
- else {
- throw new Error('Argument cannot be evaluated to a color');
- }
- }
- function toHSV(color) {
- if (color.toHSV) {
- return color.toHSV();
- }
- else {
- throw new Error('Argument cannot be evaluated to a color');
- }
- }
- function number$1(n) {
- if (n instanceof Dimension) {
- return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);
- }
- else if (typeof n === 'number') {
- return n;
- }
- else {
- throw {
- type: 'Argument',
- message: 'color functions take numbers as parameters'
- };
- }
- }
- function scaled(n, size) {
- if (n instanceof Dimension && n.unit.is('%')) {
- return parseFloat(n.value * size / 100);
- }
- else {
- return number$1(n);
- }
- }
- colorFunctions = {
- rgb: function (r, g, b) {
- var a = 1;
- /**
- * Comma-less syntax
- * e.g. rgb(0 128 255 / 50%)
- */
- if (r instanceof Expression) {
- var val = r.value;
- r = val[0];
- g = val[1];
- b = val[2];
- /**
- * @todo - should this be normalized in
- * function caller? Or parsed differently?
- */
- if (b instanceof Operation) {
- var op = b;
- b = op.operands[0];
- a = op.operands[1];
- }
- }
- var color = colorFunctions.rgba(r, g, b, a);
- if (color) {
- color.value = 'rgb';
- return color;
- }
- },
- rgba: function (r, g, b, a) {
- try {
- if (r instanceof Color) {
- if (g) {
- a = number$1(g);
- }
- else {
- a = r.alpha;
- }
- return new Color(r.rgb, a, 'rgba');
- }
- var rgb = [r, g, b].map(function (c) { return scaled(c, 255); });
- a = number$1(a);
- return new Color(rgb, a, 'rgba');
- }
- catch (e) { }
- },
- hsl: function (h, s, l) {
- var a = 1;
- if (h instanceof Expression) {
- var val = h.value;
- h = val[0];
- s = val[1];
- l = val[2];
- if (l instanceof Operation) {
- var op = l;
- l = op.operands[0];
- a = op.operands[1];
- }
- }
- var color = colorFunctions.hsla(h, s, l, a);
- if (color) {
- color.value = 'hsl';
- return color;
- }
- },
- hsla: function (h, s, l, a) {
- var m1;
- var m2;
- function hue(h) {
- h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);
- if (h * 6 < 1) {
- return m1 + (m2 - m1) * h * 6;
- }
- else if (h * 2 < 1) {
- return m2;
- }
- else if (h * 3 < 2) {
- return m1 + (m2 - m1) * (2 / 3 - h) * 6;
- }
- else {
- return m1;
- }
- }
- try {
- if (h instanceof Color) {
- if (s) {
- a = number$1(s);
- }
- else {
- a = h.alpha;
- }
- return new Color(h.rgb, a, 'hsla');
- }
- h = (number$1(h) % 360) / 360;
- s = clamp(number$1(s));
- l = clamp(number$1(l));
- a = clamp(number$1(a));
- m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;
- m1 = l * 2 - m2;
- var rgb = [
- hue(h + 1 / 3) * 255,
- hue(h) * 255,
- hue(h - 1 / 3) * 255
- ];
- a = number$1(a);
- return new Color(rgb, a, 'hsla');
- }
- catch (e) { }
- },
- hsv: function (h, s, v) {
- return colorFunctions.hsva(h, s, v, 1.0);
- },
- hsva: function (h, s, v, a) {
- h = ((number$1(h) % 360) / 360) * 360;
- s = number$1(s);
- v = number$1(v);
- a = number$1(a);
- var i;
- var f;
- i = Math.floor((h / 60) % 6);
- f = (h / 60) - i;
- var vs = [v,
- v * (1 - s),
- v * (1 - f * s),
- v * (1 - (1 - f) * s)];
- var perm = [[0, 3, 1],
- [2, 0, 1],
- [1, 0, 3],
- [1, 2, 0],
- [3, 1, 0],
- [0, 1, 2]];
- return colorFunctions.rgba(vs[perm[i][0]] * 255, vs[perm[i][1]] * 255, vs[perm[i][2]] * 255, a);
- },
- hue: function (color) {
- return new Dimension(toHSL(color).h);
- },
- saturation: function (color) {
- return new Dimension(toHSL(color).s * 100, '%');
- },
- lightness: function (color) {
- return new Dimension(toHSL(color).l * 100, '%');
- },
- hsvhue: function (color) {
- return new Dimension(toHSV(color).h);
- },
- hsvsaturation: function (color) {
- return new Dimension(toHSV(color).s * 100, '%');
- },
- hsvvalue: function (color) {
- return new Dimension(toHSV(color).v * 100, '%');
- },
- red: function (color) {
- return new Dimension(color.rgb[0]);
- },
- green: function (color) {
- return new Dimension(color.rgb[1]);
- },
- blue: function (color) {
- return new Dimension(color.rgb[2]);
- },
- alpha: function (color) {
- return new Dimension(toHSL(color).a);
- },
- luma: function (color) {
- return new Dimension(color.luma() * color.alpha * 100, '%');
- },
- luminance: function (color) {
- var luminance = (0.2126 * color.rgb[0] / 255) +
- (0.7152 * color.rgb[1] / 255) +
- (0.0722 * color.rgb[2] / 255);
- return new Dimension(luminance * color.alpha * 100, '%');
- },
- saturate: function (color, amount, method) {
- // filter: saturate(3.2);
- // should be kept as is, so check for color
- if (!color.rgb) {
- return null;
- }
- var hsl = toHSL(color);
- if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.s += hsl.s * amount.value / 100;
- }
- else {
- hsl.s += amount.value / 100;
- }
- hsl.s = clamp(hsl.s);
- return hsla(color, hsl);
- },
- desaturate: function (color, amount, method) {
- var hsl = toHSL(color);
- if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.s -= hsl.s * amount.value / 100;
- }
- else {
- hsl.s -= amount.value / 100;
- }
- hsl.s = clamp(hsl.s);
- return hsla(color, hsl);
- },
- lighten: function (color, amount, method) {
- var hsl = toHSL(color);
- if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.l += hsl.l * amount.value / 100;
- }
- else {
- hsl.l += amount.value / 100;
- }
- hsl.l = clamp(hsl.l);
- return hsla(color, hsl);
- },
- darken: function (color, amount, method) {
- var hsl = toHSL(color);
- if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.l -= hsl.l * amount.value / 100;
- }
- else {
- hsl.l -= amount.value / 100;
- }
- hsl.l = clamp(hsl.l);
- return hsla(color, hsl);
- },
- fadein: function (color, amount, method) {
- var hsl = toHSL(color);
- if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.a += hsl.a * amount.value / 100;
- }
- else {
- hsl.a += amount.value / 100;
- }
- hsl.a = clamp(hsl.a);
- return hsla(color, hsl);
- },
- fadeout: function (color, amount, method) {
- var hsl = toHSL(color);
- if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.a -= hsl.a * amount.value / 100;
- }
- else {
- hsl.a -= amount.value / 100;
- }
- hsl.a = clamp(hsl.a);
- return hsla(color, hsl);
- },
- fade: function (color, amount) {
- var hsl = toHSL(color);
- hsl.a = amount.value / 100;
- hsl.a = clamp(hsl.a);
- return hsla(color, hsl);
- },
- spin: function (color, amount) {
- var hsl = toHSL(color);
- var hue = (hsl.h + amount.value) % 360;
- hsl.h = hue < 0 ? 360 + hue : hue;
- return hsla(color, hsl);
- },
- //
- // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein
- // http://sass-lang.com
- //
- mix: function (color1, color2, weight) {
- if (!weight) {
- weight = new Dimension(50);
- }
- var p = weight.value / 100.0;
- var w = p * 2 - 1;
- var a = toHSL(color1).a - toHSL(color2).a;
- var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;
- var w2 = 1 - w1;
- var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,
- color1.rgb[1] * w1 + color2.rgb[1] * w2,
- color1.rgb[2] * w1 + color2.rgb[2] * w2];
- var alpha = color1.alpha * p + color2.alpha * (1 - p);
- return new Color(rgb, alpha);
- },
- greyscale: function (color) {
- return colorFunctions.desaturate(color, new Dimension(100));
- },
- contrast: function (color, dark, light, threshold) {
- // filter: contrast(3.2);
- // should be kept as is, so check for color
- if (!color.rgb) {
- return null;
- }
- if (typeof light === 'undefined') {
- light = colorFunctions.rgba(255, 255, 255, 1.0);
- }
- if (typeof dark === 'undefined') {
- dark = colorFunctions.rgba(0, 0, 0, 1.0);
- }
- // Figure out which is actually light and dark:
- if (dark.luma() > light.luma()) {
- var t = light;
- light = dark;
- dark = t;
- }
- if (typeof threshold === 'undefined') {
- threshold = 0.43;
- }
- else {
- threshold = number$1(threshold);
- }
- if (color.luma() < threshold) {
- return light;
- }
- else {
- return dark;
- }
- },
- // Changes made in 2.7.0 - Reverted in 3.0.0
- // contrast: function (color, color1, color2, threshold) {
- // // Return which of `color1` and `color2` has the greatest contrast with `color`
- // // according to the standard WCAG contrast ratio calculation.
- // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef
- // // The threshold param is no longer used, in line with SASS.
- // // filter: contrast(3.2);
- // // should be kept as is, so check for color
- // if (!color.rgb) {
- // return null;
- // }
- // if (typeof color1 === 'undefined') {
- // color1 = colorFunctions.rgba(0, 0, 0, 1.0);
- // }
- // if (typeof color2 === 'undefined') {
- // color2 = colorFunctions.rgba(255, 255, 255, 1.0);
- // }
- // var contrast1, contrast2;
- // var luma = color.luma();
- // var luma1 = color1.luma();
- // var luma2 = color2.luma();
- // // Calculate contrast ratios for each color
- // if (luma > luma1) {
- // contrast1 = (luma + 0.05) / (luma1 + 0.05);
- // } else {
- // contrast1 = (luma1 + 0.05) / (luma + 0.05);
- // }
- // if (luma > luma2) {
- // contrast2 = (luma + 0.05) / (luma2 + 0.05);
- // } else {
- // contrast2 = (luma2 + 0.05) / (luma + 0.05);
- // }
- // if (contrast1 > contrast2) {
- // return color1;
- // } else {
- // return color2;
- // }
- // },
- argb: function (color) {
- return new Anonymous(color.toARGB());
- },
- color: function (c) {
- if ((c instanceof Quoted) &&
- (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {
- var val = c.value.slice(1);
- return new Color(val, undefined, "#".concat(val));
- }
- if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {
- c.value = undefined;
- return c;
- }
- throw {
- type: 'Argument',
- message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'
- };
- },
- tint: function (color, amount) {
- return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);
- },
- shade: function (color, amount) {
- return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);
- }
- };
- var color = colorFunctions;
-
- // Color Blending
- // ref: http://www.w3.org/TR/compositing-1
- function colorBlend(mode, color1, color2) {
- var ab = color1.alpha; // result
- var // backdrop
- cb;
- var as = color2.alpha;
- var // source
- cs;
- var ar;
- var cr;
- var r = [];
- ar = as + ab * (1 - as);
- for (var i_1 = 0; i_1 < 3; i_1++) {
- cb = color1.rgb[i_1] / 255;
- cs = color2.rgb[i_1] / 255;
- cr = mode(cb, cs);
- if (ar) {
- cr = (as * cs + ab * (cb -
- as * (cb + cs - cr))) / ar;
- }
- r[i_1] = cr * 255;
- }
- return new Color(r, ar);
- }
- var colorBlendModeFunctions = {
- multiply: function (cb, cs) {
- return cb * cs;
- },
- screen: function (cb, cs) {
- return cb + cs - cb * cs;
- },
- overlay: function (cb, cs) {
- cb *= 2;
- return (cb <= 1) ?
- colorBlendModeFunctions.multiply(cb, cs) :
- colorBlendModeFunctions.screen(cb - 1, cs);
- },
- softlight: function (cb, cs) {
- var d = 1;
- var e = cb;
- if (cs > 0.5) {
- e = 1;
- d = (cb > 0.25) ? Math.sqrt(cb)
- : ((16 * cb - 12) * cb + 4) * cb;
- }
- return cb - (1 - 2 * cs) * e * (d - cb);
- },
- hardlight: function (cb, cs) {
- return colorBlendModeFunctions.overlay(cs, cb);
- },
- difference: function (cb, cs) {
- return Math.abs(cb - cs);
- },
- exclusion: function (cb, cs) {
- return cb + cs - 2 * cb * cs;
- },
- // non-w3c functions:
- average: function (cb, cs) {
- return (cb + cs) / 2;
- },
- negation: function (cb, cs) {
- return 1 - Math.abs(cb + cs - 1);
- }
- };
- for (var f$1 in colorBlendModeFunctions) {
- // eslint-disable-next-line no-prototype-builtins
- if (colorBlendModeFunctions.hasOwnProperty(f$1)) {
- colorBlend[f$1] = colorBlend.bind(null, colorBlendModeFunctions[f$1]);
- }
- }
-
- var dataUri = (function (environment) {
- var fallback = function (functionThis, node) { return new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); };
- return { 'data-uri': function (mimetypeNode, filePathNode) {
- if (!filePathNode) {
- filePathNode = mimetypeNode;
- mimetypeNode = null;
- }
- var mimetype = mimetypeNode && mimetypeNode.value;
- var filePath = filePathNode.value;
- var currentFileInfo = this.currentFileInfo;
- var currentDirectory = currentFileInfo.rewriteUrls ?
- currentFileInfo.currentDirectory : currentFileInfo.entryPath;
- var fragmentStart = filePath.indexOf('#');
- var fragment = '';
- if (fragmentStart !== -1) {
- fragment = filePath.slice(fragmentStart);
- filePath = filePath.slice(0, fragmentStart);
- }
- var context = clone(this.context);
- context.rawBuffer = true;
- var fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);
- if (!fileManager) {
- return fallback(this, filePathNode);
- }
- var useBase64 = false;
- // detect the mimetype if not given
- if (!mimetypeNode) {
- mimetype = environment.mimeLookup(filePath);
- if (mimetype === 'image/svg+xml') {
- useBase64 = false;
- }
- else {
- // use base 64 unless it's an ASCII or UTF-8 format
- var charset = environment.charsetLookup(mimetype);
- useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;
- }
- if (useBase64) {
- mimetype += ';base64';
- }
- }
- else {
- useBase64 = /;base64$/.test(mimetype);
- }
- var fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);
- if (!fileSync.contents) {
- logger$1.warn("Skipped data-uri embedding of ".concat(filePath, " because file not found"));
- return fallback(this, filePathNode || mimetypeNode);
- }
- var buf = fileSync.contents;
- if (useBase64 && !environment.encodeBase64) {
- return fallback(this, filePathNode);
- }
- buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);
- var uri = "data:".concat(mimetype, ",").concat(buf).concat(fragment);
- return new URL(new Quoted("\"".concat(uri, "\""), uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);
- } };
- });
-
- var getItemsFromNode = function (node) {
- // handle non-array values as an array of length 1
- // return 'undefined' if index is invalid
- var items = Array.isArray(node.value) ?
- node.value : Array(node);
- return items;
- };
- var list = {
- _SELF: function (n) {
- return n;
- },
- '~': function () {
- var expr = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- expr[_i] = arguments[_i];
- }
- if (expr.length === 1) {
- return expr[0];
- }
- return new Value(expr);
- },
- extract: function (values, index) {
- // (1-based index)
- index = index.value - 1;
- return getItemsFromNode(values)[index];
- },
- length: function (values) {
- return new Dimension(getItemsFromNode(values).length);
- },
- /**
- * Creates a Less list of incremental values.
- * Modeled after Lodash's range function, also exists natively in PHP
- *
- * @param {Dimension} [start=1]
- * @param {Dimension} end - e.g. 10 or 10px - unit is added to output
- * @param {Dimension} [step=1]
- */
- range: function (start, end, step) {
- var from;
- var to;
- var stepValue = 1;
- var list = [];
- if (end) {
- to = end;
- from = start.value;
- if (step) {
- stepValue = step.value;
- }
- }
- else {
- from = 1;
- to = start;
- }
- for (var i_1 = from; i_1 <= to.value; i_1 += stepValue) {
- list.push(new Dimension(i_1, to.unit));
- }
- return new Expression(list);
- },
- each: function (list, rs) {
- var _this = this;
- var rules = [];
- var newRules;
- var iterator;
- var tryEval = function (val) {
- if (val instanceof Node) {
- return val.eval(_this.context);
- }
- return val;
- };
- if (list.value && !(list instanceof Quoted)) {
- if (Array.isArray(list.value)) {
- iterator = list.value.map(tryEval);
- }
- else {
- iterator = [tryEval(list.value)];
- }
- }
- else if (list.ruleset) {
- iterator = tryEval(list.ruleset).rules;
- }
- else if (list.rules) {
- iterator = list.rules.map(tryEval);
- }
- else if (Array.isArray(list)) {
- iterator = list.map(tryEval);
- }
- else {
- iterator = [tryEval(list)];
- }
- var valueName = '@value';
- var keyName = '@key';
- var indexName = '@index';
- if (rs.params) {
- valueName = rs.params[0] && rs.params[0].name;
- keyName = rs.params[1] && rs.params[1].name;
- indexName = rs.params[2] && rs.params[2].name;
- rs = rs.rules;
- }
- else {
- rs = rs.ruleset;
- }
- for (var i_2 = 0; i_2 < iterator.length; i_2++) {
- var key = void 0;
- var value = void 0;
- var item = iterator[i_2];
- if (item instanceof Declaration) {
- key = typeof item.name === 'string' ? item.name : item.name[0].value;
- value = item.value;
- }
- else {
- key = new Dimension(i_2 + 1);
- value = item;
- }
- if (item instanceof Comment) {
- continue;
- }
- newRules = rs.rules.slice(0);
- if (valueName) {
- newRules.push(new Declaration(valueName, value, false, false, this.index, this.currentFileInfo));
- }
- if (indexName) {
- newRules.push(new Declaration(indexName, new Dimension(i_2 + 1), false, false, this.index, this.currentFileInfo));
- }
- if (keyName) {
- newRules.push(new Declaration(keyName, key, false, false, this.index, this.currentFileInfo));
- }
- rules.push(new Ruleset([new (Selector)([new Element('', '&')])], newRules, rs.strictImports, rs.visibilityInfo()));
- }
- return new Ruleset([new (Selector)([new Element('', '&')])], rules, rs.strictImports, rs.visibilityInfo()).eval(this.context);
- }
- };
-
- var MathHelper = function (fn, unit, n) {
- if (!(n instanceof Dimension)) {
- throw { type: 'Argument', message: 'argument must be a number' };
- }
- if (unit === null) {
- unit = n.unit;
- }
- else {
- n = n.unify();
- }
- return new Dimension(fn(parseFloat(n.value)), unit);
- };
-
- var mathFunctions = {
- // name, unit
- ceil: null,
- floor: null,
- sqrt: null,
- abs: null,
- tan: '',
- sin: '',
- cos: '',
- atan: 'rad',
- asin: 'rad',
- acos: 'rad'
- };
- for (var f in mathFunctions) {
- // eslint-disable-next-line no-prototype-builtins
- if (mathFunctions.hasOwnProperty(f)) {
- mathFunctions[f] = MathHelper.bind(null, Math[f], mathFunctions[f]);
- }
- }
- mathFunctions.round = function (n, f) {
- var fraction = typeof f === 'undefined' ? 0 : f.value;
- return MathHelper(function (num) { return num.toFixed(fraction); }, null, n);
- };
-
- var minMax = function (isMin, args) {
- var _this = this;
- args = Array.prototype.slice.call(args);
- switch (args.length) {
- case 0: throw { type: 'Argument', message: 'one or more arguments required' };
- }
- var i; // key is the unit.toString() for unified Dimension values,
- var j;
- var current;
- var currentUnified;
- var referenceUnified;
- var unit;
- var unitStatic;
- var unitClone;
- var // elems only contains original argument values.
- order = [];
- var values = {};
- // value is the index into the order array.
- for (i = 0; i < args.length; i++) {
- current = args[i];
- if (!(current instanceof Dimension)) {
- if (Array.isArray(args[i].value)) {
- Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));
- continue;
- }
- else {
- throw { type: 'Argument', message: 'incompatible types' };
- }
- }
- currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();
- unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();
- unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;
- unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;
- j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];
- if (j === undefined) {
- if (unitStatic !== undefined && unit !== unitStatic) {
- throw { type: 'Argument', message: 'incompatible types' };
- }
- values[unit] = order.length;
- order.push(current);
- continue;
- }
- referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();
- if (isMin && currentUnified.value < referenceUnified.value ||
- !isMin && currentUnified.value > referenceUnified.value) {
- order[j] = current;
- }
- }
- if (order.length == 1) {
- return order[0];
- }
- args = order.map(function (a) { return a.toCSS(_this.context); }).join(this.context.compress ? ',' : ', ');
- return new Anonymous("".concat(isMin ? 'min' : 'max', "(").concat(args, ")"));
- };
- var number = {
- min: function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- try {
- return minMax.call(this, true, args);
- }
- catch (e) { }
- },
- max: function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- try {
- return minMax.call(this, false, args);
- }
- catch (e) { }
- },
- convert: function (val, unit) {
- return val.convertTo(unit.value);
- },
- pi: function () {
- return new Dimension(Math.PI);
- },
- mod: function (a, b) {
- return new Dimension(a.value % b.value, a.unit);
- },
- pow: function (x, y) {
- if (typeof x === 'number' && typeof y === 'number') {
- x = new Dimension(x);
- y = new Dimension(y);
- }
- else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {
- throw { type: 'Argument', message: 'arguments must be numbers' };
- }
- return new Dimension(Math.pow(x.value, y.value), x.unit);
- },
- percentage: function (n) {
- var result = MathHelper(function (num) { return num * 100; }, '%', n);
- return result;
- }
- };
-
- var string = {
- e: function (str) {
- return new Quoted('"', str instanceof JavaScript ? str.evaluated : str.value, true);
- },
- escape: function (str) {
- return new Anonymous(encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')
- .replace(/\(/g, '%28').replace(/\)/g, '%29'));
- },
- replace: function (string, pattern, replacement, flags) {
- var result = string.value;
- replacement = (replacement.type === 'Quoted') ?
- replacement.value : replacement.toCSS();
- result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);
- return new Quoted(string.quote || '', result, string.escaped);
- },
- '%': function (string /* arg, arg, ... */) {
- var args = Array.prototype.slice.call(arguments, 1);
- var result = string.value;
- var _loop_1 = function (i_1) {
- /* jshint loopfunc:true */
- result = result.replace(/%[sda]/i, function (token) {
- var value = ((args[i_1].type === 'Quoted') &&
- token.match(/s/i)) ? args[i_1].value : args[i_1].toCSS();
- return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;
- });
- };
- for (var i_1 = 0; i_1 < args.length; i_1++) {
- _loop_1(i_1);
- }
- result = result.replace(/%%/g, '%');
- return new Quoted(string.quote || '', result, string.escaped);
- }
- };
-
- var svg = (function () {
- return { 'svg-gradient': function (direction) {
- var stops;
- var gradientDirectionSvg;
- var gradientType = 'linear';
- var rectangleDimension = 'x="0" y="0" width="1" height="1"';
- var renderEnv = { compress: false };
- var returner;
- var directionValue = direction.toCSS(renderEnv);
- var i;
- var color;
- var position;
- var positionValue;
- var alpha;
- function throwArgumentDescriptor() {
- throw { type: 'Argument',
- message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +
- ' end_color [end_position] or direction, color list' };
- }
- if (arguments.length == 2) {
- if (arguments[1].value.length < 2) {
- throwArgumentDescriptor();
- }
- stops = arguments[1].value;
- }
- else if (arguments.length < 3) {
- throwArgumentDescriptor();
- }
- else {
- stops = Array.prototype.slice.call(arguments, 1);
- }
- switch (directionValue) {
- case 'to bottom':
- gradientDirectionSvg = 'x1="0%" y1="0%" x2="0%" y2="100%"';
- break;
- case 'to right':
- gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="0%"';
- break;
- case 'to bottom right':
- gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="100%"';
- break;
- case 'to top right':
- gradientDirectionSvg = 'x1="0%" y1="100%" x2="100%" y2="0%"';
- break;
- case 'ellipse':
- case 'ellipse at center':
- gradientType = 'radial';
- gradientDirectionSvg = 'cx="50%" cy="50%" r="75%"';
- rectangleDimension = 'x="-50" y="-50" width="101" height="101"';
- break;
- default:
- throw { type: 'Argument', message: 'svg-gradient direction must be \'to bottom\', \'to right\',' +
- ' \'to bottom right\', \'to top right\' or \'ellipse at center\'' };
- }
- returner = "<".concat(gradientType, "Gradient id=\"g\" ").concat(gradientDirectionSvg, ">");
- for (i = 0; i < stops.length; i += 1) {
- if (stops[i] instanceof Expression) {
- color = stops[i].value[0];
- position = stops[i].value[1];
- }
- else {
- color = stops[i];
- position = undefined;
- }
- if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {
- throwArgumentDescriptor();
- }
- positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';
- alpha = color.alpha;
- returner += "");
- }
- returner += "".concat(gradientType, "Gradient>");
- returner = encodeURIComponent(returner);
- returner = "data:image/svg+xml,".concat(returner);
- return new URL(new Quoted("'".concat(returner, "'"), returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);
- } };
- });
-
- var isa = function (n, Type) { return (n instanceof Type) ? Keyword.True : Keyword.False; };
- var isunit = function (n, unit) {
- if (unit === undefined) {
- throw { type: 'Argument', message: 'missing the required second argument to isunit.' };
- }
- unit = typeof unit.value === 'string' ? unit.value : unit;
- if (typeof unit !== 'string') {
- throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };
- }
- return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;
- };
- var types = {
- isruleset: function (n) {
- return isa(n, DetachedRuleset);
- },
- iscolor: function (n) {
- return isa(n, Color);
- },
- isnumber: function (n) {
- return isa(n, Dimension);
- },
- isstring: function (n) {
- return isa(n, Quoted);
- },
- iskeyword: function (n) {
- return isa(n, Keyword);
- },
- isurl: function (n) {
- return isa(n, URL);
- },
- ispixel: function (n) {
- return isunit(n, 'px');
- },
- ispercentage: function (n) {
- return isunit(n, '%');
- },
- isem: function (n) {
- return isunit(n, 'em');
- },
- isunit: isunit,
- unit: function (val, unit) {
- if (!(val instanceof Dimension)) {
- throw { type: 'Argument',
- message: "the first argument to unit must be a number".concat(val instanceof Operation ? '. Have you forgotten parenthesis?' : '') };
- }
- if (unit) {
- if (unit instanceof Keyword) {
- unit = unit.value;
- }
- else {
- unit = unit.toCSS();
- }
- }
- else {
- unit = '';
- }
- return new Dimension(val.value, unit);
- },
- 'get-unit': function (n) {
- return new Anonymous(n.unit);
- }
- };
-
- var styleExpression = function (args) {
- var _this = this;
- args = Array.prototype.slice.call(args);
- switch (args.length) {
- case 0: throw { type: 'Argument', message: 'one or more arguments required' };
- }
- var entityList = [new Variable(args[0].value, this.index, this.currentFileInfo).eval(this.context)];
- args = entityList.map(function (a) { return a.toCSS(_this.context); }).join(this.context.compress ? ',' : ', ');
- return new Variable("style(".concat(args, ")"));
- };
- var style$1 = {
- style: function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- try {
- return styleExpression.call(this, args);
- }
- catch (e) { }
- },
- };
-
- var functions = (function (environment) {
- var functions = { functionRegistry: functionRegistry, functionCaller: functionCaller };
- // register functions
- functionRegistry.addMultiple(boolean$1);
- functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));
- functionRegistry.addMultiple(color);
- functionRegistry.addMultiple(colorBlend);
- functionRegistry.addMultiple(dataUri(environment));
- functionRegistry.addMultiple(list);
- functionRegistry.addMultiple(mathFunctions);
- functionRegistry.addMultiple(number);
- functionRegistry.addMultiple(string);
- functionRegistry.addMultiple(svg());
- functionRegistry.addMultiple(types);
- functionRegistry.addMultiple(style$1);
- return functions;
- });
-
- function transformTree (root, options) {
- options = options || {};
- var evaldRoot;
- var variables = options.variables;
- var evalEnv = new contexts.Eval(options);
- //
- // Allows setting variables with a hash, so:
- //
- // `{ color: new tree.Color('#f01') }` will become:
- //
- // new tree.Declaration('@color',
- // new tree.Value([
- // new tree.Expression([
- // new tree.Color('#f01')
- // ])
- // ])
- // )
- //
- if (typeof variables === 'object' && !Array.isArray(variables)) {
- variables = Object.keys(variables).map(function (k) {
- var value = variables[k];
- if (!(value instanceof tree.Value)) {
- if (!(value instanceof tree.Expression)) {
- value = new tree.Expression([value]);
- }
- value = new tree.Value([value]);
- }
- return new tree.Declaration("@".concat(k), value, false, null, 0);
- });
- evalEnv.frames = [new tree.Ruleset(null, variables)];
- }
- var visitors$1 = [
- new visitors.JoinSelectorVisitor(),
- new visitors.MarkVisibleSelectorsVisitor(true),
- new visitors.ExtendVisitor(),
- new visitors.ToCSSVisitor({ compress: Boolean(options.compress) })
- ];
- var preEvalVisitors = [];
- var v;
- var visitorIterator;
- /**
- * first() / get() allows visitors to be added while visiting
- *
- * @todo Add scoping for visitors just like functions for @plugin; right now they're global
- */
- if (options.pluginManager) {
- visitorIterator = options.pluginManager.visitor();
- for (var i_1 = 0; i_1 < 2; i_1++) {
- visitorIterator.first();
- while ((v = visitorIterator.get())) {
- if (v.isPreEvalVisitor) {
- if (i_1 === 0 || preEvalVisitors.indexOf(v) === -1) {
- preEvalVisitors.push(v);
- v.run(root);
- }
- }
- else {
- if (i_1 === 0 || visitors$1.indexOf(v) === -1) {
- if (v.isPreVisitor) {
- visitors$1.unshift(v);
- }
- else {
- visitors$1.push(v);
- }
- }
- }
- }
- }
- }
- evaldRoot = root.eval(evalEnv);
- for (var i_2 = 0; i_2 < visitors$1.length; i_2++) {
- visitors$1[i_2].run(evaldRoot);
- }
- // Run any remaining visitors added after eval pass
- if (options.pluginManager) {
- visitorIterator.first();
- while ((v = visitorIterator.get())) {
- if (visitors$1.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {
- v.run(evaldRoot);
- }
- }
- }
- return evaldRoot;
- }
-
- /**
- * Plugin Manager
- */
- var PluginManager = /** @class */ (function () {
- function PluginManager(less) {
- this.less = less;
- this.visitors = [];
- this.preProcessors = [];
- this.postProcessors = [];
- this.installedPlugins = [];
- this.fileManagers = [];
- this.iterator = -1;
- this.pluginCache = {};
- this.Loader = new less.PluginLoader(less);
- }
- /**
- * Adds all the plugins in the array
- * @param {Array} plugins
- */
- PluginManager.prototype.addPlugins = function (plugins) {
- if (plugins) {
- for (var i_1 = 0; i_1 < plugins.length; i_1++) {
- this.addPlugin(plugins[i_1]);
- }
- }
- };
- /**
- *
- * @param plugin
- * @param {String} filename
- */
- PluginManager.prototype.addPlugin = function (plugin, filename, functionRegistry) {
- this.installedPlugins.push(plugin);
- if (filename) {
- this.pluginCache[filename] = plugin;
- }
- if (plugin.install) {
- plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);
- }
- };
- /**
- *
- * @param filename
- */
- PluginManager.prototype.get = function (filename) {
- return this.pluginCache[filename];
- };
- /**
- * Adds a visitor. The visitor object has options on itself to determine
- * when it should run.
- * @param visitor
- */
- PluginManager.prototype.addVisitor = function (visitor) {
- this.visitors.push(visitor);
- };
- /**
- * Adds a pre processor object
- * @param {object} preProcessor
- * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import
- */
- PluginManager.prototype.addPreProcessor = function (preProcessor, priority) {
- var indexToInsertAt;
- for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {
- if (this.preProcessors[indexToInsertAt].priority >= priority) {
- break;
- }
- }
- this.preProcessors.splice(indexToInsertAt, 0, { preProcessor: preProcessor, priority: priority });
- };
- /**
- * Adds a post processor object
- * @param {object} postProcessor
- * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression
- */
- PluginManager.prototype.addPostProcessor = function (postProcessor, priority) {
- var indexToInsertAt;
- for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {
- if (this.postProcessors[indexToInsertAt].priority >= priority) {
- break;
- }
- }
- this.postProcessors.splice(indexToInsertAt, 0, { postProcessor: postProcessor, priority: priority });
- };
- /**
- *
- * @param manager
- */
- PluginManager.prototype.addFileManager = function (manager) {
- this.fileManagers.push(manager);
- };
- /**
- *
- * @returns {Array}
- * @private
- */
- PluginManager.prototype.getPreProcessors = function () {
- var preProcessors = [];
- for (var i_2 = 0; i_2 < this.preProcessors.length; i_2++) {
- preProcessors.push(this.preProcessors[i_2].preProcessor);
- }
- return preProcessors;
- };
- /**
- *
- * @returns {Array}
- * @private
- */
- PluginManager.prototype.getPostProcessors = function () {
- var postProcessors = [];
- for (var i_3 = 0; i_3 < this.postProcessors.length; i_3++) {
- postProcessors.push(this.postProcessors[i_3].postProcessor);
- }
- return postProcessors;
- };
- /**
- *
- * @returns {Array}
- * @private
- */
- PluginManager.prototype.getVisitors = function () {
- return this.visitors;
- };
- PluginManager.prototype.visitor = function () {
- var self = this;
- return {
- first: function () {
- self.iterator = -1;
- return self.visitors[self.iterator];
- },
- get: function () {
- self.iterator += 1;
- return self.visitors[self.iterator];
- }
- };
- };
- /**
- *
- * @returns {Array}
- * @private
- */
- PluginManager.prototype.getFileManagers = function () {
- return this.fileManagers;
- };
- return PluginManager;
- }());
- var pm;
- var PluginManagerFactory = function (less, newFactory) {
- if (newFactory || !pm) {
- pm = new PluginManager(less);
- }
- return pm;
- };
-
- function SourceMapOutput (environment) {
- var SourceMapOutput = /** @class */ (function () {
- function SourceMapOutput(options) {
- this._css = [];
- this._rootNode = options.rootNode;
- this._contentsMap = options.contentsMap;
- this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;
- if (options.sourceMapFilename) {
- this._sourceMapFilename = options.sourceMapFilename.replace(/\\/g, '/');
- }
- this._outputFilename = options.outputFilename;
- this.sourceMapURL = options.sourceMapURL;
- if (options.sourceMapBasepath) {
- this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\/g, '/');
- }
- if (options.sourceMapRootpath) {
- this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\/g, '/');
- if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {
- this._sourceMapRootpath += '/';
- }
- }
- else {
- this._sourceMapRootpath = '';
- }
- this._outputSourceFiles = options.outputSourceFiles;
- this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();
- this._lineNumber = 0;
- this._column = 0;
- }
- SourceMapOutput.prototype.removeBasepath = function (path) {
- if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {
- path = path.substring(this._sourceMapBasepath.length);
- if (path.charAt(0) === '\\' || path.charAt(0) === '/') {
- path = path.substring(1);
- }
- }
- return path;
- };
- SourceMapOutput.prototype.normalizeFilename = function (filename) {
- filename = filename.replace(/\\/g, '/');
- filename = this.removeBasepath(filename);
- return (this._sourceMapRootpath || '') + filename;
- };
- SourceMapOutput.prototype.add = function (chunk, fileInfo, index, mapLines) {
- // ignore adding empty strings
- if (!chunk) {
- return;
- }
- var lines, sourceLines, columns, sourceColumns, i;
- if (fileInfo && fileInfo.filename) {
- var inputSource = this._contentsMap[fileInfo.filename];
- // remove vars/banner added to the top of the file
- if (this._contentsIgnoredCharsMap[fileInfo.filename]) {
- // adjust the index
- index -= this._contentsIgnoredCharsMap[fileInfo.filename];
- if (index < 0) {
- index = 0;
- }
- // adjust the source
- inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);
- }
- /**
- * ignore empty content, or failsafe
- * if contents map is incorrect
- */
- if (inputSource === undefined) {
- this._css.push(chunk);
- return;
- }
- inputSource = inputSource.substring(0, index);
- sourceLines = inputSource.split('\n');
- sourceColumns = sourceLines[sourceLines.length - 1];
- }
- lines = chunk.split('\n');
- columns = lines[lines.length - 1];
- if (fileInfo && fileInfo.filename) {
- if (!mapLines) {
- this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column },
- original: { line: sourceLines.length, column: sourceColumns.length },
- source: this.normalizeFilename(fileInfo.filename) });
- }
- else {
- for (i = 0; i < lines.length; i++) {
- this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0 },
- original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0 },
- source: this.normalizeFilename(fileInfo.filename) });
- }
- }
- }
- if (lines.length === 1) {
- this._column += columns.length;
- }
- else {
- this._lineNumber += lines.length - 1;
- this._column = columns.length;
- }
- this._css.push(chunk);
- };
- SourceMapOutput.prototype.isEmpty = function () {
- return this._css.length === 0;
- };
- SourceMapOutput.prototype.toCSS = function (context) {
- this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });
- if (this._outputSourceFiles) {
- for (var filename in this._contentsMap) {
- // eslint-disable-next-line no-prototype-builtins
- if (this._contentsMap.hasOwnProperty(filename)) {
- var source = this._contentsMap[filename];
- if (this._contentsIgnoredCharsMap[filename]) {
- source = source.slice(this._contentsIgnoredCharsMap[filename]);
- }
- this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);
- }
- }
- }
- this._rootNode.genCSS(context, this);
- if (this._css.length > 0) {
- var sourceMapURL = void 0;
- var sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());
- if (this.sourceMapURL) {
- sourceMapURL = this.sourceMapURL;
- }
- else if (this._sourceMapFilename) {
- sourceMapURL = this._sourceMapFilename;
- }
- this.sourceMapURL = sourceMapURL;
- this.sourceMap = sourceMapContent;
- }
- return this._css.join('');
- };
- return SourceMapOutput;
- }());
- return SourceMapOutput;
- }
-
- function SourceMapBuilder (SourceMapOutput, environment) {
- var SourceMapBuilder = /** @class */ (function () {
- function SourceMapBuilder(options) {
- this.options = options;
- }
- SourceMapBuilder.prototype.toCSS = function (rootNode, options, imports) {
- var sourceMapOutput = new SourceMapOutput({
- contentsIgnoredCharsMap: imports.contentsIgnoredChars,
- rootNode: rootNode,
- contentsMap: imports.contents,
- sourceMapFilename: this.options.sourceMapFilename,
- sourceMapURL: this.options.sourceMapURL,
- outputFilename: this.options.sourceMapOutputFilename,
- sourceMapBasepath: this.options.sourceMapBasepath,
- sourceMapRootpath: this.options.sourceMapRootpath,
- outputSourceFiles: this.options.outputSourceFiles,
- sourceMapGenerator: this.options.sourceMapGenerator,
- sourceMapFileInline: this.options.sourceMapFileInline,
- disableSourcemapAnnotation: this.options.disableSourcemapAnnotation
- });
- var css = sourceMapOutput.toCSS(options);
- this.sourceMap = sourceMapOutput.sourceMap;
- this.sourceMapURL = sourceMapOutput.sourceMapURL;
- if (this.options.sourceMapInputFilename) {
- this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);
- }
- if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {
- this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);
- }
- return css + this.getCSSAppendage();
- };
- SourceMapBuilder.prototype.getCSSAppendage = function () {
- var sourceMapURL = this.sourceMapURL;
- if (this.options.sourceMapFileInline) {
- if (this.sourceMap === undefined) {
- return '';
- }
- sourceMapURL = "data:application/json;base64,".concat(environment.encodeBase64(this.sourceMap));
- }
- if (this.options.disableSourcemapAnnotation) {
- return '';
- }
- if (sourceMapURL) {
- return "/*# sourceMappingURL=".concat(sourceMapURL, " */");
- }
- return '';
- };
- SourceMapBuilder.prototype.getExternalSourceMap = function () {
- return this.sourceMap;
- };
- SourceMapBuilder.prototype.setExternalSourceMap = function (sourceMap) {
- this.sourceMap = sourceMap;
- };
- SourceMapBuilder.prototype.isInline = function () {
- return this.options.sourceMapFileInline;
- };
- SourceMapBuilder.prototype.getSourceMapURL = function () {
- return this.sourceMapURL;
- };
- SourceMapBuilder.prototype.getOutputFilename = function () {
- return this.options.sourceMapOutputFilename;
- };
- SourceMapBuilder.prototype.getInputFilename = function () {
- return this.sourceMapInputFilename;
- };
- return SourceMapBuilder;
- }());
- return SourceMapBuilder;
- }
-
- function ParseTree (SourceMapBuilder) {
- var ParseTree = /** @class */ (function () {
- function ParseTree(root, imports) {
- this.root = root;
- this.imports = imports;
- }
- ParseTree.prototype.toCSS = function (options) {
- var evaldRoot;
- var result = {};
- var sourceMapBuilder;
- try {
- evaldRoot = transformTree(this.root, options);
- }
- catch (e) {
- throw new LessError(e, this.imports);
- }
- try {
- var compress = Boolean(options.compress);
- if (compress) {
- logger$1.warn('The compress option has been deprecated. ' +
- 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');
- }
- var toCSSOptions = {
- compress: compress,
- dumpLineNumbers: options.dumpLineNumbers,
- strictUnits: Boolean(options.strictUnits),
- numPrecision: 8
- };
- if (options.sourceMap) {
- sourceMapBuilder = new SourceMapBuilder(options.sourceMap);
- result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);
- }
- else {
- result.css = evaldRoot.toCSS(toCSSOptions);
- }
- }
- catch (e) {
- throw new LessError(e, this.imports);
- }
- if (options.pluginManager) {
- var postProcessors = options.pluginManager.getPostProcessors();
- for (var i_1 = 0; i_1 < postProcessors.length; i_1++) {
- result.css = postProcessors[i_1].process(result.css, { sourceMap: sourceMapBuilder, options: options, imports: this.imports });
- }
- }
- if (options.sourceMap) {
- result.map = sourceMapBuilder.getExternalSourceMap();
- }
- result.imports = [];
- for (var file_1 in this.imports.files) {
- if (Object.prototype.hasOwnProperty.call(this.imports.files, file_1) && file_1 !== this.imports.rootFilename) {
- result.imports.push(file_1);
- }
- }
- return result;
- };
- return ParseTree;
- }());
- return ParseTree;
- }
-
- function ImportManager (environment) {
- // FileInfo = {
- // 'rewriteUrls' - option - whether to adjust URL's to be relative
- // 'filename' - full resolved filename of current file
- // 'rootpath' - path to append to normal URLs for this node
- // 'currentDirectory' - path to the current file, absolute
- // 'rootFilename' - filename of the base file
- // 'entryPath' - absolute path to the entry file
- // 'reference' - whether the file should not be output and only output parts that are referenced
- var ImportManager = /** @class */ (function () {
- function ImportManager(less, context, rootFileInfo) {
- this.less = less;
- this.rootFilename = rootFileInfo.filename;
- this.paths = context.paths || []; // Search paths, when importing
- this.contents = {}; // map - filename to contents of all the files
- this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore
- this.mime = context.mime;
- this.error = null;
- this.context = context;
- // Deprecated? Unused outside of here, could be useful.
- this.queue = []; // Files which haven't been imported yet
- this.files = {}; // Holds the imported parse trees.
- }
- /**
- * Add an import to be imported
- * @param path - the raw path
- * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)
- * @param currentFileInfo - the current file info (used for instance to work out relative paths)
- * @param importOptions - import options
- * @param callback - callback for when it is imported
- */
- ImportManager.prototype.push = function (path, tryAppendExtension, currentFileInfo, importOptions, callback) {
- var importManager = this, pluginLoader = this.context.pluginManager.Loader;
- this.queue.push(path);
- var fileParsedFunc = function (e, root, fullPath) {
- importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue
- var importedEqualsRoot = fullPath === importManager.rootFilename;
- if (importOptions.optional && e) {
- callback(null, { rules: [] }, false, null);
- logger$1.info("The file ".concat(fullPath, " was skipped because it was not found and the import was marked optional."));
- }
- else {
- // Inline imports aren't cached here.
- // If we start to cache them, please make sure they won't conflict with non-inline imports of the
- // same name as they used to do before this comment and the condition below have been added.
- if (!importManager.files[fullPath] && !importOptions.inline) {
- importManager.files[fullPath] = { root: root, options: importOptions };
- }
- if (e && !importManager.error) {
- importManager.error = e;
- }
- callback(e, root, importedEqualsRoot, fullPath);
- }
- };
- var newFileInfo = {
- rewriteUrls: this.context.rewriteUrls,
- entryPath: currentFileInfo.entryPath,
- rootpath: currentFileInfo.rootpath,
- rootFilename: currentFileInfo.rootFilename
- };
- var fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);
- if (!fileManager) {
- fileParsedFunc({ message: "Could not find a file-manager for ".concat(path) });
- return;
- }
- var loadFileCallback = function (loadedFile) {
- var plugin;
- var resolvedFilename = loadedFile.filename;
- var contents = loadedFile.contents.replace(/^\uFEFF/, '');
- // Pass on an updated rootpath if path of imported file is relative and file
- // is in a (sub|sup) directory
- //
- // Examples:
- // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',
- // then rootpath should become 'less/module/nav/'
- // - If path of imported file is '../mixins.less' and rootpath is 'less/',
- // then rootpath should become 'less/../'
- newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);
- if (newFileInfo.rewriteUrls) {
- newFileInfo.rootpath = fileManager.join((importManager.context.rootpath || ''), fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));
- if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {
- newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);
- }
- }
- newFileInfo.filename = resolvedFilename;
- var newEnv = new contexts.Parse(importManager.context);
- newEnv.processImports = false;
- importManager.contents[resolvedFilename] = contents;
- if (currentFileInfo.reference || importOptions.reference) {
- newFileInfo.reference = true;
- }
- if (importOptions.isPlugin) {
- plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);
- if (plugin instanceof LessError) {
- fileParsedFunc(plugin, null, resolvedFilename);
- }
- else {
- fileParsedFunc(null, plugin, resolvedFilename);
- }
- }
- else if (importOptions.inline) {
- fileParsedFunc(null, contents, resolvedFilename);
- }
- else {
- // import (multiple) parse trees apparently get altered and can't be cached.
- // TODO: investigate why this is
- if (importManager.files[resolvedFilename]
- && !importManager.files[resolvedFilename].options.multiple
- && !importOptions.multiple) {
- fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);
- }
- else {
- new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {
- fileParsedFunc(e, root, resolvedFilename);
- });
- }
- }
- };
- var loadedFile;
- var promise;
- var context = clone(this.context);
- if (tryAppendExtension) {
- context.ext = importOptions.isPlugin ? '.js' : '.less';
- }
- if (importOptions.isPlugin) {
- context.mime = 'application/javascript';
- if (context.syncImport) {
- loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);
- }
- else {
- promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);
- }
- }
- else {
- if (context.syncImport) {
- loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);
- }
- else {
- promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment, function (err, loadedFile) {
- if (err) {
- fileParsedFunc(err);
- }
- else {
- loadFileCallback(loadedFile);
- }
- });
- }
- }
- if (loadedFile) {
- if (!loadedFile.filename) {
- fileParsedFunc(loadedFile);
- }
- else {
- loadFileCallback(loadedFile);
- }
- }
- else if (promise) {
- promise.then(loadFileCallback, fileParsedFunc);
- }
- };
- return ImportManager;
- }());
- return ImportManager;
- }
-
- function Parse (environment, ParseTree, ImportManager) {
- var parse = function (input, options, callback) {
- if (typeof options === 'function') {
- callback = options;
- options = copyOptions(this.options, {});
- }
- else {
- options = copyOptions(this.options, options || {});
- }
- if (!callback) {
- var self_1 = this;
- return new Promise(function (resolve, reject) {
- parse.call(self_1, input, options, function (err, output) {
- if (err) {
- reject(err);
- }
- else {
- resolve(output);
- }
- });
- });
- }
- else {
- var context_1;
- var rootFileInfo = void 0;
- var pluginManager_1 = new PluginManagerFactory(this, !options.reUsePluginManager);
- options.pluginManager = pluginManager_1;
- context_1 = new contexts.Parse(options);
- if (options.rootFileInfo) {
- rootFileInfo = options.rootFileInfo;
- }
- else {
- var filename = options.filename || 'input';
- var entryPath = filename.replace(/[^/\\]*$/, '');
- rootFileInfo = {
- filename: filename,
- rewriteUrls: context_1.rewriteUrls,
- rootpath: context_1.rootpath || '',
- currentDirectory: entryPath,
- entryPath: entryPath,
- rootFilename: filename
- };
- // add in a missing trailing slash
- if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {
- rootFileInfo.rootpath += '/';
- }
- }
- var imports_1 = new ImportManager(this, context_1, rootFileInfo);
- this.importManager = imports_1;
- // TODO: allow the plugins to be just a list of paths or names
- // Do an async plugin queue like lessc
- if (options.plugins) {
- options.plugins.forEach(function (plugin) {
- var evalResult, contents;
- if (plugin.fileContent) {
- contents = plugin.fileContent.replace(/^\uFEFF/, '');
- evalResult = pluginManager_1.Loader.evalPlugin(contents, context_1, imports_1, plugin.options, plugin.filename);
- if (evalResult instanceof LessError) {
- return callback(evalResult);
- }
- }
- else {
- pluginManager_1.addPlugin(plugin);
- }
- });
- }
- new Parser(context_1, imports_1, rootFileInfo)
- .parse(input, function (e, root) {
- if (e) {
- return callback(e);
- }
- callback(null, root, imports_1, options);
- }, options);
- }
- };
- return parse;
- }
-
- function Render (environment, ParseTree) {
- var render = function (input, options, callback) {
- if (typeof options === 'function') {
- callback = options;
- options = copyOptions(this.options, {});
- }
- else {
- options = copyOptions(this.options, options || {});
- }
- if (!callback) {
- var self_1 = this;
- return new Promise(function (resolve, reject) {
- render.call(self_1, input, options, function (err, output) {
- if (err) {
- reject(err);
- }
- else {
- resolve(output);
- }
- });
- });
- }
- else {
- this.parse(input, options, function (err, root, imports, options) {
- if (err) {
- return callback(err);
- }
- var result;
- try {
- var parseTree = new ParseTree(root, imports);
- result = parseTree.toCSS(options);
- }
- catch (err) {
- return callback(err);
- }
- callback(null, result);
- });
- }
- };
- return render;
- }
-
- var version = "4.4.2";
-
- function parseNodeVersion(version) {
- var match = version.match(/^v(\d{1,2})\.(\d{1,2})\.(\d{1,2})(?:-([0-9A-Za-z-.]+))?(?:\+([0-9A-Za-z-.]+))?$/); // eslint-disable-line max-len
- if (!match) {
- throw new Error('Unable to parse: ' + version);
- }
-
- var res = {
- major: parseInt(match[1], 10),
- minor: parseInt(match[2], 10),
- patch: parseInt(match[3], 10),
- pre: match[4] || '',
- build: match[5] || '',
- };
-
- return res;
- }
-
- var parseNodeVersion_1 = parseNodeVersion;
-
- function lessRoot (environment, fileManagers) {
- var sourceMapOutput, sourceMapBuilder, parseTree, importManager;
- environment = new Environment(environment, fileManagers);
- sourceMapOutput = SourceMapOutput(environment);
- sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);
- parseTree = ParseTree(sourceMapBuilder);
- importManager = ImportManager(environment);
- var render = Render(environment, parseTree);
- var parse = Parse(environment, parseTree, importManager);
- var v = parseNodeVersion_1("v".concat(version));
- var initial = {
- version: [v.major, v.minor, v.patch],
- data: data,
- tree: tree,
- Environment: Environment,
- AbstractFileManager: AbstractFileManager,
- AbstractPluginLoader: AbstractPluginLoader,
- environment: environment,
- visitors: visitors,
- Parser: Parser,
- functions: functions(environment),
- contexts: contexts,
- SourceMapOutput: sourceMapOutput,
- SourceMapBuilder: sourceMapBuilder,
- ParseTree: parseTree,
- ImportManager: importManager,
- render: render,
- parse: parse,
- LessError: LessError,
- transformTree: transformTree,
- utils: utils,
- PluginManager: PluginManagerFactory,
- logger: logger$1
- };
- // Create a public API
- var ctor = function (t) {
- return function () {
- var obj = Object.create(t.prototype);
- t.apply(obj, Array.prototype.slice.call(arguments, 0));
- return obj;
- };
- };
- var t;
- var api = Object.create(initial);
- for (var n in initial.tree) {
- /* eslint guard-for-in: 0 */
- t = initial.tree[n];
- if (typeof t === 'function') {
- api[n.toLowerCase()] = ctor(t);
- }
- else {
- api[n] = Object.create(null);
- for (var o in t) {
- /* eslint guard-for-in: 0 */
- api[n][o.toLowerCase()] = ctor(t[o]);
- }
- }
- }
- /**
- * Some of the functions assume a `this` context of the API object,
- * which causes it to fail when wrapped for ES6 imports.
- *
- * An assumed `this` should be removed in the future.
- */
- initial.parse = initial.parse.bind(api);
- initial.render = initial.render.bind(api);
- return api;
- }
-
- var options$1;
- var logger;
- var fileCache = {};
- // TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load
- var FileManager = function () { };
- FileManager.prototype = Object.assign(new AbstractFileManager(), {
- alwaysMakePathsAbsolute: function () {
- return true;
- },
- join: function (basePath, laterPath) {
- if (!basePath) {
- return laterPath;
- }
- return this.extractUrlParts(laterPath, basePath).path;
- },
- doXHR: function (url, type, callback, errback) {
- var xhr = new XMLHttpRequest();
- var async = options$1.isFileProtocol ? options$1.fileAsync : true;
- if (typeof xhr.overrideMimeType === 'function') {
- xhr.overrideMimeType('text/css');
- }
- logger.debug("XHR: Getting '".concat(url, "'"));
- xhr.open('GET', url, async);
- xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');
- xhr.send(null);
- function handleResponse(xhr, callback, errback) {
- if (xhr.status >= 200 && xhr.status < 300) {
- callback(xhr.responseText, xhr.getResponseHeader('Last-Modified'));
- }
- else if (typeof errback === 'function') {
- errback(xhr.status, url);
- }
- }
- if (options$1.isFileProtocol && !options$1.fileAsync) {
- if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {
- callback(xhr.responseText);
- }
- else {
- errback(xhr.status, url);
- }
- }
- else if (async) {
- xhr.onreadystatechange = function () {
- if (xhr.readyState == 4) {
- handleResponse(xhr, callback, errback);
- }
- };
- }
- else {
- handleResponse(xhr, callback, errback);
- }
- },
- supports: function () {
- return true;
- },
- clearFileCache: function () {
- fileCache = {};
- },
- loadFile: function (filename, currentDirectory, options) {
- // TODO: Add prefix support like less-node?
- // What about multiple paths?
- if (currentDirectory && !this.isPathAbsolute(filename)) {
- filename = currentDirectory + filename;
- }
- filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;
- options = options || {};
- // sheet may be set to the stylesheet for the initial load or a collection of properties including
- // some context variables for imports
- var hrefParts = this.extractUrlParts(filename, window.location.href);
- var href = hrefParts.url;
- var self = this;
- return new Promise(function (resolve, reject) {
- if (options.useFileCache && fileCache[href]) {
- try {
- var lessText_1 = fileCache[href];
- return resolve({ contents: lessText_1, filename: href, webInfo: { lastModified: new Date() } });
- }
- catch (e) {
- return reject({ filename: href, message: "Error loading file ".concat(href, " error was ").concat(e.message) });
- }
- }
- self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {
- // per file cache
- fileCache[href] = data;
- // Use remote copy (re-parse)
- resolve({ contents: data, filename: href, webInfo: { lastModified: lastModified } });
- }, function doXHRError(status, url) {
- reject({ type: 'File', message: "'".concat(url, "' wasn't found (").concat(status, ")"), href: href });
- });
- });
- }
- });
- var FM = (function (opts, log) {
- options$1 = opts;
- logger = log;
- return FileManager;
- });
-
- /**
- * @todo Add tests for browser `@plugin`
- */
- /**
- * Browser Plugin Loader
- */
- var PluginLoader = function (less) {
- this.less = less;
- // Should we shim this.require for browser? Probably not?
- };
- PluginLoader.prototype = Object.assign(new AbstractPluginLoader(), {
- loadPlugin: function (filename, basePath, context, environment, fileManager) {
- return new Promise(function (fulfill, reject) {
- fileManager.loadFile(filename, basePath, context, environment)
- .then(fulfill).catch(reject);
- });
- }
- });
-
- var LogListener = (function (less, options) {
- var logLevel_debug = 4;
- var logLevel_info = 3;
- var logLevel_warn = 2;
- var logLevel_error = 1;
- // The amount of logging in the javascript console.
- // 3 - Debug, information and errors
- // 2 - Information and errors
- // 1 - Errors
- // 0 - None
- // Defaults to 2
- options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);
- if (!options.loggers) {
- options.loggers = [{
- debug: function (msg) {
- if (options.logLevel >= logLevel_debug) {
- console.log(msg);
- }
- },
- info: function (msg) {
- if (options.logLevel >= logLevel_info) {
- console.log(msg);
- }
- },
- warn: function (msg) {
- if (options.logLevel >= logLevel_warn) {
- console.warn(msg);
- }
- },
- error: function (msg) {
- if (options.logLevel >= logLevel_error) {
- console.error(msg);
- }
- }
- }];
- }
- for (var i_1 = 0; i_1 < options.loggers.length; i_1++) {
- less.logger.addListener(options.loggers[i_1]);
- }
- });
-
- var ErrorReporting = (function (window, less, options) {
- function errorHTML(e, rootHref) {
- var id = "less-error-message:".concat(extractId(rootHref || ''));
- var template = '{content}';
- var elem = window.document.createElement('div');
- var timer;
- var content;
- var errors = [];
- var filename = e.filename || rootHref;
- var filenameNoPath = filename.match(/([^/]+(\?.*)?)$/)[1];
- elem.id = id;
- elem.className = 'less-error-message';
- content = "".concat(e.type || 'Syntax', "Error: ").concat(e.message || 'There is an error in your .less file') +
- "
in ").concat(filenameNoPath, " ");
- var errorline = function (e, i, classname) {
- if (e.extract[i] !== undefined) {
- errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1))
- .replace(/\{class\}/, classname)
- .replace(/\{content\}/, e.extract[i]));
- }
- };
- if (e.line) {
- errorline(e, 0, '');
- errorline(e, 1, 'line');
- errorline(e, 2, '');
- content += "on line ".concat(e.line, ", column ").concat(e.column + 1, ":
").concat(errors.join(''), "
");
- }
- if (e.stack && (e.extract || options.logLevel >= 4)) {
- content += "
Stack Trace".concat(e.stack.split('\n').slice(1).join('
'));
- }
- elem.innerHTML = content;
- // CSS for error messages
- browser.createCSS(window.document, [
- '.less-error-message ul, .less-error-message li {',
- 'list-style-type: none;',
- 'margin-right: 15px;',
- 'padding: 4px 0;',
- 'margin: 0;',
- '}',
- '.less-error-message label {',
- 'font-size: 12px;',
- 'margin-right: 15px;',
- 'padding: 4px 0;',
- 'color: #cc7777;',
- '}',
- '.less-error-message pre {',
- 'color: #dd6666;',
- 'padding: 4px 0;',
- 'margin: 0;',
- 'display: inline-block;',
- '}',
- '.less-error-message pre.line {',
- 'color: #ff0000;',
- '}',
- '.less-error-message h3 {',
- 'font-size: 20px;',
- 'font-weight: bold;',
- 'padding: 15px 0 5px 0;',
- 'margin: 0;',
- '}',
- '.less-error-message a {',
- 'color: #10a',
- '}',
- '.less-error-message .error {',
- 'color: red;',
- 'font-weight: bold;',
- 'padding-bottom: 2px;',
- 'border-bottom: 1px dashed red;',
- '}'
- ].join('\n'), { title: 'error-message' });
- elem.style.cssText = [
- 'font-family: Arial, sans-serif',
- 'border: 1px solid #e00',
- 'background-color: #eee',
- 'border-radius: 5px',
- '-webkit-border-radius: 5px',
- '-moz-border-radius: 5px',
- 'color: #e00',
- 'padding: 15px',
- 'margin-bottom: 15px'
- ].join(';');
- if (options.env === 'development') {
- timer = setInterval(function () {
- var document = window.document;
- var body = document.body;
- if (body) {
- if (document.getElementById(id)) {
- body.replaceChild(elem, document.getElementById(id));
- }
- else {
- body.insertBefore(elem, body.firstChild);
- }
- clearInterval(timer);
- }
- }, 10);
- }
- }
- function removeErrorHTML(path) {
- var node = window.document.getElementById("less-error-message:".concat(extractId(path)));
- if (node) {
- node.parentNode.removeChild(node);
- }
- }
- function removeError(path) {
- if (!options.errorReporting || options.errorReporting === 'html') {
- removeErrorHTML(path);
- }
- else if (options.errorReporting === 'console') ;
- else if (typeof options.errorReporting === 'function') {
- options.errorReporting('remove', path);
- }
- }
- function errorConsole(e, rootHref) {
- var template = '{line} {content}';
- var filename = e.filename || rootHref;
- var errors = [];
- var content = "".concat(e.type || 'Syntax', "Error: ").concat(e.message || 'There is an error in your .less file', " in ").concat(filename);
- var errorline = function (e, i, classname) {
- if (e.extract[i] !== undefined) {
- errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1))
- .replace(/\{class\}/, classname)
- .replace(/\{content\}/, e.extract[i]));
- }
- };
- if (e.line) {
- errorline(e, 0, '');
- errorline(e, 1, 'line');
- errorline(e, 2, '');
- content += " on line ".concat(e.line, ", column ").concat(e.column + 1, ":\n").concat(errors.join('\n'));
- }
- if (e.stack && (e.extract || options.logLevel >= 4)) {
- content += "\nStack Trace\n".concat(e.stack);
- }
- less.logger.error(content);
- }
- function error(e, rootHref) {
- if (!options.errorReporting || options.errorReporting === 'html') {
- errorHTML(e, rootHref);
- }
- else if (options.errorReporting === 'console') {
- errorConsole(e, rootHref);
- }
- else if (typeof options.errorReporting === 'function') {
- options.errorReporting('add', e, rootHref);
- }
- }
- return {
- add: error,
- remove: removeError
- };
- });
-
- // Cache system is a bit outdated and could do with work
- var Cache = (function (window, options, logger) {
- var cache = null;
- if (options.env !== 'development') {
- try {
- cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;
- }
- catch (_) { }
- }
- return {
- setCSS: function (path, lastModified, modifyVars, styles) {
- if (cache) {
- logger.info("saving ".concat(path, " to cache."));
- try {
- cache.setItem(path, styles);
- cache.setItem("".concat(path, ":timestamp"), lastModified);
- if (modifyVars) {
- cache.setItem("".concat(path, ":vars"), JSON.stringify(modifyVars));
- }
- }
- catch (e) {
- // TODO - could do with adding more robust error handling
- logger.error("failed to save \"".concat(path, "\" to local storage for caching."));
- }
- }
- },
- getCSS: function (path, webInfo, modifyVars) {
- var css = cache && cache.getItem(path);
- var timestamp = cache && cache.getItem("".concat(path, ":timestamp"));
- var vars = cache && cache.getItem("".concat(path, ":vars"));
- modifyVars = modifyVars || {};
- vars = vars || '{}'; // if not set, treat as the JSON representation of an empty object
- if (timestamp && webInfo.lastModified &&
- (new Date(webInfo.lastModified).valueOf() ===
- new Date(timestamp).valueOf()) &&
- JSON.stringify(modifyVars) === vars) {
- // Use local copy
- return css;
- }
- }
- };
- });
-
- var ImageSize = (function () {
- function imageSize() {
- throw {
- type: 'Runtime',
- message: 'Image size functions are not supported in browser version of less'
- };
- }
- var imageFunctions = {
- 'image-size': function (filePathNode) {
- imageSize();
- return -1;
- },
- 'image-width': function (filePathNode) {
- imageSize();
- return -1;
- },
- 'image-height': function (filePathNode) {
- imageSize();
- return -1;
- }
- };
- functionRegistry.addMultiple(imageFunctions);
- });
-
- //
- var root = (function (window, options) {
- var document = window.document;
- var less = lessRoot();
- less.options = options;
- var environment = less.environment;
- var FileManager = FM(options, less.logger);
- var fileManager = new FileManager();
- environment.addFileManager(fileManager);
- less.FileManager = FileManager;
- less.PluginLoader = PluginLoader;
- LogListener(less, options);
- var errors = ErrorReporting(window, less, options);
- var cache = less.cache = options.cache || Cache(window, options, less.logger);
- ImageSize(less.environment);
- // Setup user functions - Deprecate?
- if (options.functions) {
- less.functions.functionRegistry.addMultiple(options.functions);
- }
- var typePattern = /^text\/(x-)?less$/;
- function clone(obj) {
- var cloned = {};
- for (var prop in obj) {
- if (Object.prototype.hasOwnProperty.call(obj, prop)) {
- cloned[prop] = obj[prop];
- }
- }
- return cloned;
- }
- // only really needed for phantom
- function bind(func, thisArg) {
- var curryArgs = Array.prototype.slice.call(arguments, 2);
- return function () {
- var args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));
- return func.apply(thisArg, args);
- };
- }
- function loadStyles(modifyVars) {
- var styles = document.getElementsByTagName('style');
- var style;
- for (var i_1 = 0; i_1 < styles.length; i_1++) {
- style = styles[i_1];
- if (style.type.match(typePattern)) {
- var instanceOptions = clone(options);
- instanceOptions.modifyVars = modifyVars;
- var lessText_1 = style.innerHTML || '';
- instanceOptions.filename = document.location.href.replace(/#.*$/, '');
- /* jshint loopfunc:true */
- // use closure to store current style
- less.render(lessText_1, instanceOptions, bind(function (style, e, result) {
- if (e) {
- errors.add(e, 'inline');
- }
- else {
- style.type = 'text/css';
- if (style.styleSheet) {
- style.styleSheet.cssText = result.css;
- }
- else {
- style.innerHTML = result.css;
- }
- }
- }, null, style));
- }
- }
- }
- function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {
- var instanceOptions = clone(options);
- addDataAttr(instanceOptions, sheet);
- instanceOptions.mime = sheet.type;
- if (modifyVars) {
- instanceOptions.modifyVars = modifyVars;
- }
- function loadInitialFileCallback(loadedFile) {
- var data = loadedFile.contents;
- var path = loadedFile.filename;
- var webInfo = loadedFile.webInfo;
- var newFileInfo = {
- currentDirectory: fileManager.getPath(path),
- filename: path,
- rootFilename: path,
- rewriteUrls: instanceOptions.rewriteUrls
- };
- newFileInfo.entryPath = newFileInfo.currentDirectory;
- newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;
- if (webInfo) {
- webInfo.remaining = remaining;
- var css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);
- if (!reload && css) {
- webInfo.local = true;
- callback(null, css, data, sheet, webInfo, path);
- return;
- }
- }
- // TODO add tests around how this behaves when reloading
- errors.remove(path);
- instanceOptions.rootFileInfo = newFileInfo;
- less.render(data, instanceOptions, function (e, result) {
- if (e) {
- e.href = path;
- callback(e);
- }
- else {
- cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);
- callback(null, result.css, data, sheet, webInfo, path);
- }
- });
- }
- fileManager.loadFile(sheet.href, null, instanceOptions, environment)
- .then(function (loadedFile) {
- loadInitialFileCallback(loadedFile);
- }).catch(function (err) {
- console.log(err);
- callback(err);
- });
- }
- function loadStyleSheets(callback, reload, modifyVars) {
- for (var i_2 = 0; i_2 < less.sheets.length; i_2++) {
- loadStyleSheet(less.sheets[i_2], callback, reload, less.sheets.length - (i_2 + 1), modifyVars);
- }
- }
- function initRunningMode() {
- if (less.env === 'development') {
- less.watchTimer = setInterval(function () {
- if (less.watchMode) {
- fileManager.clearFileCache();
- /**
- * @todo remove when this is typed with JSDoc
- */
- // eslint-disable-next-line no-unused-vars
- loadStyleSheets(function (e, css, _, sheet, webInfo) {
- if (e) {
- errors.add(e, e.href || sheet.href);
- }
- else if (css) {
- browser.createCSS(window.document, css, sheet);
- }
- });
- }
- }, options.poll);
- }
- }
- //
- // Watch mode
- //
- less.watch = function () {
- if (!less.watchMode) {
- less.env = 'development';
- initRunningMode();
- }
- this.watchMode = true;
- return true;
- };
- less.unwatch = function () { clearInterval(less.watchTimer); this.watchMode = false; return false; };
- //
- // Synchronously get all tags with the 'rel' attribute set to
- // "stylesheet/less".
- //
- less.registerStylesheetsImmediately = function () {
- var links = document.getElementsByTagName('link');
- less.sheets = [];
- for (var i_3 = 0; i_3 < links.length; i_3++) {
- if (links[i_3].rel === 'stylesheet/less' || (links[i_3].rel.match(/stylesheet/) &&
- (links[i_3].type.match(typePattern)))) {
- less.sheets.push(links[i_3]);
- }
- }
- };
- //
- // Asynchronously get all tags with the 'rel' attribute set to
- // "stylesheet/less", returning a Promise.
- //
- less.registerStylesheets = function () { return new Promise(function (resolve) {
- less.registerStylesheetsImmediately();
- resolve();
- }); };
- //
- // With this function, it's possible to alter variables and re-render
- // CSS without reloading less-files
- //
- less.modifyVars = function (record) { return less.refresh(true, record, false); };
- less.refresh = function (reload, modifyVars, clearFileCache) {
- if ((reload || clearFileCache) && clearFileCache !== false) {
- fileManager.clearFileCache();
- }
- return new Promise(function (resolve, reject) {
- var startTime;
- var endTime;
- var totalMilliseconds;
- var remainingSheets;
- startTime = endTime = new Date();
- // Set counter for remaining unprocessed sheets
- remainingSheets = less.sheets.length;
- if (remainingSheets === 0) {
- endTime = new Date();
- totalMilliseconds = endTime - startTime;
- less.logger.info('Less has finished and no sheets were loaded.');
- resolve({
- startTime: startTime,
- endTime: endTime,
- totalMilliseconds: totalMilliseconds,
- sheets: less.sheets.length
- });
- }
- else {
- // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array
- loadStyleSheets(function (e, css, _, sheet, webInfo) {
- if (e) {
- errors.add(e, e.href || sheet.href);
- reject(e);
- return;
- }
- if (webInfo.local) {
- less.logger.info("Loading ".concat(sheet.href, " from cache."));
- }
- else {
- less.logger.info("Rendered ".concat(sheet.href, " successfully."));
- }
- browser.createCSS(window.document, css, sheet);
- less.logger.info("CSS for ".concat(sheet.href, " generated in ").concat(new Date() - endTime, "ms"));
- // Count completed sheet
- remainingSheets--;
- // Check if the last remaining sheet was processed and then call the promise
- if (remainingSheets === 0) {
- totalMilliseconds = new Date() - startTime;
- less.logger.info("Less has finished. CSS generated in ".concat(totalMilliseconds, "ms"));
- resolve({
- startTime: startTime,
- endTime: endTime,
- totalMilliseconds: totalMilliseconds,
- sheets: less.sheets.length
- });
- }
- endTime = new Date();
- }, reload, modifyVars);
- }
- loadStyles(modifyVars);
- });
- };
- less.refreshStyles = loadStyles;
- return less;
- });
-
- /**
- * Kicks off less and compiles any stylesheets
- * used in the browser distributed version of less
- * to kick-start less using the browser api
- */
- var options = defaultOptions();
- if (window.less) {
- for (var key in window.less) {
- if (Object.prototype.hasOwnProperty.call(window.less, key)) {
- options[key] = window.less[key];
- }
- }
- }
- addDefaultOptions(window, options);
- options.plugins = options.plugins || [];
- if (window.LESS_PLUGINS) {
- options.plugins = options.plugins.concat(window.LESS_PLUGINS);
- }
- var less = root(window, options);
- window.less = less;
- var css;
- var head;
- var style;
- // Always restore page visibility
- function resolveOrReject(data) {
- if (data.filename) {
- console.warn(data);
- }
- if (!options.async) {
- head.removeChild(style);
- }
- }
- if (options.onReady) {
- if (/!watch/.test(window.location.hash)) {
- less.watch();
- }
- // Simulate synchronous stylesheet loading by hiding page rendering
- if (!options.async) {
- css = 'body { display: none !important }';
- head = document.head || document.getElementsByTagName('head')[0];
- style = document.createElement('style');
- style.type = 'text/css';
- if (style.styleSheet) {
- style.styleSheet.cssText = css;
- }
- else {
- style.appendChild(document.createTextNode(css));
- }
- head.appendChild(style);
- }
- less.registerStylesheetsImmediately();
- less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);
- }
-
- return less;
-
-}));
diff --git a/dist/less.min.js b/dist/less.min.js
deleted file mode 100644
index fb7147a09..000000000
--- a/dist/less.min.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * Less - Leaner CSS v4.4.2
- * http://lesscss.org
- *
- * Copyright (c) 2009-2025, Alexis Sellier
- * Licensed under the Apache-2.0 License.
- *
- * @license Apache-2.0
- */
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).less=t()}(this,(function(){"use strict";function e(e){return e.replace(/^[a-z-]+:\/+?[^/]+/,"").replace(/[?&]livereload=\w+/,"").replace(/^\//,"").replace(/\.[a-zA-Z]+$/,"").replace(/[^.\w-]+/g,"-").replace(/\./g,":")}function t(e,t){if(t)for(var n in t.dataset)if(Object.prototype.hasOwnProperty.call(t.dataset,n))if("env"===n||"dumpLineNumbers"===n||"rootpath"===n||"errorReporting"===n)e[n]=t.dataset[n];else try{e[n]=JSON.parse(t.dataset[n])}catch(e){}}var n=function(t,n,i){var r=i.href||"",s="less:".concat(i.title||e(r)),a=t.getElementById(s),o=!1,l=t.createElement("style");l.setAttribute("type","text/css"),i.media&&l.setAttribute("media",i.media),l.id=s,l.styleSheet||(l.appendChild(t.createTextNode(n)),o=null!==a&&a.childNodes.length>0&&l.childNodes.length>0&&a.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===a||!1===o){var c=i&&i.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(a&&!1===o&&a.parentNode.removeChild(a),l.styleSheet)try{l.styleSheet.cssText=n}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},i=function(e){var t,n=e.document;return n.currentScript||(t=n.getElementsByTagName("script"))[t.length-1]},r={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(var t=0;t=0;o--){var l=a[o];if(l[s?"supportsSync":"supports"](e,t,n,i))return l}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),a={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},o={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:a,unitConversions:o},u=function(){function e(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null}return Object.defineProperty(e.prototype,"currentFileInfo",{get:function(){return this.fileInfo()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){return this.getIndex()},enumerable:!1,configurable:!0}),e.prototype.setParent=function(t,n){function i(t){t&&t instanceof e&&(t.parent=n)}Array.isArray(t)?t.forEach(i):i(t)},e.prototype.getIndex=function(){return this._index||this.parent&&this.parent.getIndex()||0},e.prototype.fileInfo=function(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}},e.prototype.isRulesetLike=function(){return!1},e.prototype.toCSS=function(e){var t=[];return this.genCSS(e,{add:function(e,n,i){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")},e.prototype.genCSS=function(e,t){t.add(this.value)},e.prototype.accept=function(e){this.value=e.visit(this.value)},e.prototype.eval=function(){return this},e.prototype._operate=function(e,t,n,i){switch(t){case"+":return n+i;case"-":return n-i;case"*":return n*i;case"/":return n/i}},e.prototype.fround=function(e,t){var n=e&&e.numPrecision;return n?Number((t+2e-16).toFixed(n)):t},e.compare=function(t,n){if(t.compare&&"Quoted"!==n.type&&"Anonymous"!==n.type)return t.compare(n);if(n.compare)return-n.compare(t);if(t.type===n.type){if(t=t.value,n=n.value,!Array.isArray(t))return t===n?0:void 0;if(t.length===n.length){for(var i=0;it?1:void 0},e.prototype.blocksVisibility=function(){return void 0===this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks},e.prototype.addVisibilityBlock=function(){void 0===this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1},e.prototype.removeVisibilityBlock=function(){void 0===this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1},e.prototype.ensureVisibility=function(){this.nodeVisible=!0},e.prototype.ensureInvisibility=function(){this.nodeVisible=!1},e.prototype.isVisible=function(){return this.nodeVisible},e.prototype.visibilityInfo=function(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}},e.prototype.copyVisibilityInfo=function(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)},e}(),c=function(e,t,n){var i=this;Array.isArray(e)?this.rgb=e:e.length>=6?(this.rgb=[],e.match(/.{2}/g).map((function(e,t){t<3?i.rgb.push(parseInt(e,16)):i.alpha=parseInt(e,16)/255}))):(this.rgb=[],e.split("").map((function(e,t){t<3?i.rgb.push(parseInt(e+e,16)):i.alpha=parseInt(e+e,16)/255}))),this.alpha=this.alpha||("number"==typeof t?t:1),void 0!==n&&(this.value=n)};function h(e,t){return Math.min(Math.max(e,0),t)}function f(e){return"#".concat(e.map((function(e){return((e=h(Math.round(e),255))<16?"0":"")+e.toString(16)})).join(""))}c.prototype=Object.assign(new u,{type:"Color",luma:function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,n=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(n=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))},genCSS:function(e,t){t.add(this.toCSS(e))},toCSS:function(e,t){var n,i,r,s=e&&e.compress&&!t,a=[];if(i=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))i<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=i<1?"hsla":"hsl"}else i<1&&(r="rgba");switch(r){case"rgba":a=this.rgb.map((function(e){return h(Math.round(e),255)})).concat(h(i,1));break;case"hsla":a.push(h(i,1));case"hsl":n=this.toHSL(),a=[this.fround(e,n.h),"".concat(this.fround(e,100*n.s),"%"),"".concat(this.fround(e,100*n.l),"%")].concat(a)}if(r)return"".concat(r,"(").concat(a.join(",".concat(s?"":" ")),")");if(n=this.toRGB(),s){var o=n.split("");o[1]===o[2]&&o[3]===o[4]&&o[5]===o[6]&&(n="#".concat(o[1]).concat(o[3]).concat(o[5]))}return n},operate:function(e,t,n){for(var i=new Array(3),r=this.alpha*(1-n.alpha)+n.alpha,s=0;s<3;s++)i[s]=this._operate(e,t,this.rgb[s],n.rgb[s]);return new c(i,r)},toRGB:function(){return f(this.rgb)},toHSL:function(){var e,t,n=this.rgb[0]/255,i=this.rgb[1]/255,r=this.rgb[2]/255,s=this.alpha,a=Math.max(n,i,r),o=Math.min(n,i,r),l=(a+o)/2,u=a-o;if(a===o)e=t=0;else{switch(t=l>.5?u/(2-a-o):u/(a+o),a){case n:e=(i-r)/u+(iC(e,t));if("Object"!==S(n=e)||n.constructor!==Object||Object.getPrototypeOf(n)!==Object.prototype)return e;var n;return[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)].reduce((n,i)=>{if(I(t.props)&&!t.props.includes(i))return n;return function(e,t,n,i,r){const s={}.propertyIsEnumerable.call(i,t)?"enumerable":"nonenumerable";"enumerable"===s&&(e[t]=n),r&&"nonenumerable"===s&&Object.defineProperty(e,t,{value:n,enumerable:!1,writable:!0,configurable:!0})}(n,i,C(e[i],t),e,t.nonenumerable),n},{})}function k(e,t){for(var n=e+1,i=null,r=-1;--n>=0&&"\n"!==t.charAt(n);)r++;return"number"==typeof e&&(i=(t.slice(0,e).match(/\n/g)||"").length),{line:i,column:r}}function A(e){var t,n=e.length,i=new Array(n);for(t=0;t|Function):(\d+):(\d+)/,F=function(e,t,n){Error.call(this);var i=e.filename||n;if(this.message=e.message,this.stack=e.stack,t&&i){var r=t.contents[i],s=k(e.index,r),a=s.line,o=s.column,l=e.call&&k(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=i,this.index=e.index,this.line="number"==typeof a?a+1:null,this.column=o,!this.line&&this.stack){var c=this.stack.match($),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match($);f=1-parseInt(p[2])}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var V=function(){};V.prototype=Error.prototype,F.prototype=new V}else F.prototype=Object.create(Error.prototype);F.prototype.constructor=F,F.prototype.toString=function(e){var t;e=e||{};var n=(null!==(t=this.type)&&void 0!==t?t:"").toLowerCase().includes("warning"),i=n?this.type:"".concat(this.type,"Error"),r=n?"yellow":"red",s="",a=this.extract||[],o=[],l=function(e){return e};if(e.stylize){var u=typeof e.stylize;if("function"!==u)throw Error("options.stylize should be a function, got a ".concat(u,"!"));l=e.stylize}if(null!==this.line){if(n||"string"!=typeof a[0]||o.push(l("".concat(this.line-1," ").concat(a[0]),"grey")),"string"==typeof a[1]){var c="".concat(this.line," ");a[1]&&(c+=a[1].slice(0,this.column)+l(l(l(a[1].substr(this.column,1),"bold")+a[1].slice(this.column+1),"red"),"inverse")),o.push(c)}n||"string"!=typeof a[2]||o.push(l("".concat(this.line+1," ").concat(a[2]),"grey")),o="".concat(o.join("\n")+l("","reset"),"\n")}return s+=l("".concat(i,": ").concat(this.message),r),this.filename&&(s+=l(" in ",r)+this.filename),this.line&&(s+=l(" on line ".concat(this.line,", column ").concat(this.column+1,":"),"grey")),s+="\n".concat(o),this.callLine&&(s+="".concat(l("from ",r)+(this.filename||""),"/n"),s+="".concat(l(this.callLine,"grey")," ").concat(this.callExtract,"/n")),s};var L={visitDeeper:!0},j=!1;function D(e){return e}var N=function(){function e(e){this._implementation=e,this._visitInCache={},this._visitOutCache={},j||(!function e(t,n){var i,r;for(i in t)switch(typeof(r=t[i])){case"function":r.prototype&&r.prototype.type&&(r.prototype.typeIndex=n++);break;case"object":n=e(r,n)}return n}(Ke,1),j=!0)}return e.prototype.visit=function(e){if(!e)return e;var t=e.typeIndex;if(!t)return e.value&&e.value.typeIndex&&this.visit(e.value),e;var n,i=this._implementation,r=this._visitInCache[t],s=this._visitOutCache[t],a=L;if(a.visitDeeper=!0,r||(r=i[n="visit".concat(e.type)]||D,s=i["".concat(n,"Out")]||D,this._visitInCache[t]=r,this._visitOutCache[t]=s),r!==D){var o=r.call(i,e,a);e&&i.isReplacing&&(e=o)}if(a.visitDeeper&&e)if(e.length)for(var l=0,u=e.length;ly.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},B.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===w?G:z)(e)},B.Eval.prototype.rewritePath=function(e,t){var n;return t=t||"",n=this.normalizePath(t+e),G(e)&&z(t)&&!1===G(n)&&(n="./".concat(n)),n},B.Eval.prototype.normalizePath=function(e){var t,n=e.split("/").reverse();for(e=[];0!==n.length;)switch(t=n.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")};var W=function(){function e(e){this.imports=[],this.variableImports=[],this._onSequencerEmpty=e,this._currentDepth=0}return e.prototype.addImport=function(e){var t=this,n={callback:e,args:null,isReady:!1};return this.imports.push(n),function(){n.args=Array.prototype.slice.call(arguments,0),n.isReady=!0,t.tryRun()}},e.prototype.addVariableImport=function(e){this.variableImports.push(e)},e.prototype.tryRun=function(){this._currentDepth++;try{for(;;){for(;this.imports.length>0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),J=function(e,t){this._visitor=new N(this),this._importer=e,this._finish=t,this.context=new B.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new W(this._onSequencerEmpty.bind(this))};J.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var n=e.options.inline;if(!e.css||n){var i=new B.Eval(this.context,A(this.context.frames)),r=i.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,i,r)):this.processImportNode(e,i,r)}t.visitDeeper=!1},processImportNode:function(e,t,n){var i,r=e.options.inline;try{i=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!i||i.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{i.options.multiple&&(t.importMultiple=!0);for(var s=void 0===i.css,a=0;a=0||(o=[u.selfSelectors[0]],(s=f.findMatch(l,o)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();a=f.extendSelector(s,o,e,l.isVisible()),(c=new Ke.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=a,a[a.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(a))}))));if(h.length){if(this.extendChainCount++,n>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:".concat(p,":extend(").concat(v,")")}}return h.concat(f.doExtendChaining(h,t,n+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var n,i,r,s,a=this.allExtendsStack[this.allExtendsStack.length-1],o=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==a?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=s.elements.slice(c,o.index).concat([a]).concat(n.elements.slice(1)),u===o.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,o.pathIndex))).push(new Ke.Selector(l)),u=o.endPathIndex,(c=o.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return i?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),Z=function(){function e(){this.contexts=[[]],this._visitor=new N(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var n,i=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((n=e.selectors)&&(n=n.filter((function(e){return e.getIsOutput()})),e.selectors=n.length?n:n=null,n&&e.joinSelectors(r,i,n)),n||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules[0].root=0===n.length||n[0].multiMedia},e.prototype.visitAtRule=function(e,t){var n=this.contexts[this.contexts.length-1];e.declarations&&e.declarations.length?e.declarations[0].root=0===n.length||n[0].multiMedia:e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===n.length||null)},e}(),X=function(){function e(e){this._visitor=new N(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var n=0;n0},e.prototype.resolveVisibility=function(e){if(!e.blocksVisibility()){if(this.isEmpty(e))return;return e}var t=e.rules[0];if(this.keepOnlyVisibleChilds(t),!this.isEmpty(t))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Y=function(e){this._visitor=new N(this),this._context=e,this.utils=new X(e)};Y.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var n=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,n)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var n=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,n)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var n=new Ke.Comment("/* ".concat(e.toCSS(this._context).replace(/\n/g,"")," */\n"));return n.debugInfo=e.debugInfo,this._visitor.visit(n)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var n=0;n0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),i.splice(0,0,e)),1===i.length?i[0]:i},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Ke.Combinator("")),t=0;t=0;i--)if((n=e[i])instanceof Ke.Declaration)if(r[n.name]){(t=r[n.name])instanceof Ke.Declaration&&(t=r[n.name]=[r[n.name].toCSS(this._context)]);var s=n.toCSS(this._context);-1!==t.indexOf(s)?e.splice(i,1):t.push(s)}else r[n.name]=n}},_mergeRules:function(e){if(e){for(var t={},n=[],i=0;i0){var t=e[0],n=[],i=[new Ke.Expression(n)];e.forEach((function(e){"+"===e.merge&&n.length>0&&i.push(new Ke.Expression(n=[])),n.push(e.value),t.important=t.important||e.important})),t.value=new Ke.Value(i)}}))}}};var ee={Visitor:N,ImportVisitor:J,MarkVisibleSelectorsVisitor:K,ExtendVisitor:Q,JoinSelectorVisitor:Z,ToCSSVisitor:Y};var te=function(){var e,t,n,i,r,s,a,o=[],l={};function u(n){for(var i,o,c,h=l.i,f=t,p=l.i-a,v=l.i+s.length-p,d=l.i+=n,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==i&&10!==i&&9!==i&&13!==i)break}if(s=s.slice(n+l.i-d+p),a=l.i,!s.length){if(tn||l.i===n&&e&&!i)&&(n=l.i,i=e);var r=o.pop();s=r.current,a=l.i=r.i,t=r.j},l.forget=function(){o.pop()},l.isWhitespace=function(t){var n=l.i+(t||0),i=e.charCodeAt(n);return 32===i||13===i||9===i||10===i},l.$re=function(e){l.i>a&&(s=s.slice(l.i-a),a=l.i);var t=e.exec(s);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$peekChar=function(t){return e.charAt(l.i)!==t?null:t},l.$str=function(t){for(var n=t.length,i=0;ih&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var n=0;n57||t<43||47===t||44===t},l.start=function(i,o,c){e=i,l.i=t=a=n=0,r=o?function(e,t){var n,i,r,s,a,o,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var n=a-d;n<512&&!t||!n||(v.push(e.slice(d,a+1)),d=a+1)}for(a=0;a=97&&l<=122||l<34))switch(l){case 40:p++,i=a;continue;case 41:if(--p<0)return t("missing opening `(`",a);continue;case 59:p||m();continue;case 123:f++,n=a;continue;case 125:if(--f<0)return t("missing opening `{`",a);f||p||m();continue;case 92:if(a96)){if(u==l){c=1;break}if(92==u){if(a==h-1)return t("unescaped `\\`",a);a++}}if(c)continue;return t("unmatched `".concat(String.fromCharCode(l),"`"),o);case 47:if(p||a==h-1)continue;if(47==(u=e.charCodeAt(a+1)))for(a+=2;an&&s>r?"missing closing `}` or `*/`":"missing closing `}`",n):0!==p?t("missing closing `)`",i):(m(!0),v)}(i,c):[i],s=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l};var ne=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(n){t.add(n,e[n])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),ie={queryInParens:!0},re={queryInParens:!0},se=function(e,t,n,i,r,s){this.value=e,this._index=t,this._fileInfo=n,this.mapLines=i,this.rulesetLike=void 0!==r&&r,this.allowRoot=!0,this.copyVisibilityInfo(s)};se.prototype=Object.assign(new u,{type:"Anonymous",eval:function(){return new se(this.value,this._index,this._fileInfo,this.mapLines,this.rulesetLike,this.visibilityInfo())},compare:function(e){return e.toCSS&&this.toCSS()===e.toCSS()?0:void 0},isRulesetLike:function(){return this.rulesetLike},genCSS:function(e,t){this.nodeVisible=Boolean(this.value),this.nodeVisible&&t.add(this.value,this._fileInfo,this._index,this.mapLines)}});var ae=function e(t,n,i,s){var a;s=s||0;var o=te();function l(e,t){throw new F({index:o.i,filename:i.filename,type:t||"Syntax",message:e},n)}function u(e,s,a){t.quiet||r.warn(new F({index:null!=s?s:o.i,filename:i.filename,type:a?"".concat(a.toUpperCase()," WARNING"):"WARNING",message:e},n).toString())}function c(e,t){var n=e instanceof Function?e.call(a):o.$re(e);if(n)return n;l(t||("string"==typeof e?"expected '".concat(e,"' got '").concat(o.currentChar(),"'"):"unexpected token"))}function h(e,t){if(o.$char(e))return e;l(t||"expected '".concat(e,"' got '").concat(o.currentChar(),"'"))}function f(e){var t=i.filename;return{lineNumber:k(e,o.getInput()).line+1,fileName:t}}return{parserInput:o,imports:n,fileInfo:i,parseNode:function(e,t,r){var l,u=[],c=o;try{c.start(e,!1,(function(e,t){r({message:e,index:t+s})}));for(var h=0,f=void 0;f=t[h];h++)l=a[f](),u.push(l||null);c.end().isFinished?r(null,u):r(!0,null)}catch(e){throw new F({index:e.index+s,message:e.message},n,i.filename)}},parse:function(r,s,u){var c,h,f,p,v=null,d="";if(u&&u.disablePluginRule&&(a.plugin=function(){o.$re(/^@plugin?\s+/)&&l("@plugin statements are not allowed when disablePluginRule is set to true")}),h=u&&u.globalVars?"".concat(e.serializeVars(u.globalVars),"\n"):"",f=u&&u.modifyVars?"\n".concat(e.serializeVars(u.modifyVars)):"",t.pluginManager)for(var m=t.pluginManager.getPreProcessors(),g=0;g");return e},args:function(e){var t,n,i,r,s,u,c,h=a.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(o.save();;){if(e)u=a.detachedRuleset()||a.expression();else{if(o.commentStore.length=0,o.$str("...")){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;r=null,u.throwAwayComments&&u.throwAwayComments(),s=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Ke.Variable||g instanceof Ke.Property))if(o.$char(":")){if(p.length>0&&(t&&l("Cannot mix ; and , as delimiter types"),n=!0),!(s=a.detachedRuleset()||a.expression())){if(!e)return o.restore(),f.args=[],f;l("could not understand value for named argument")}r=i=g.name}else if(o.$str("...")){if(!e){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(i=r=g.name,s=null);s&&p.push(s),d.push({name:r,value:s,expand:c}),o.$char(",")?m=!0:((m=";"===o.$char(";"))||t)&&(n&&l("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(s=new Ke.Value(p)),v.push({name:i,value:s,expand:c}),i=null,p=[],n=!1)}return o.forget(),f.args=t?v:d,f},definition:function(){var e,t,n,i,r=[],s=!1;if(!("."!==o.currentChar()&&"#"!==o.currentChar()||o.peek(/^[^{]*\}/)))if(o.save(),t=o.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var l=this.args(!1);if(r=l.args,s=l.variadic,!o.$char(")"))return void o.restore("Missing closing ')'");if(o.commentStore.length=0,o.$str("when")&&(i=c(a.conditions,"expected condition")),n=a.block())return o.forget(),new Ke.mixin.Definition(e,r,n,i,s);o.restore()}else o.restore()},ruleLookups:function(){var e,t=[];if("["===o.currentChar()){for(;;){if(o.save(),!(e=this.lookupValue())&&""!==e){o.restore();break}t.push(e),o.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(o.save(),o.$char("[")){var e=o.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(o.$char("]"))return e||""===e?(o.forget(),e):void o.restore();o.restore()}else o.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return o.$char(";")||o.peek("}")},ieAlpha:function(){var e;if(o.$re(/^opacity=/i))return(e=o.$re(/^\d+/))||(e=c(a.entities.variable,"Could not parse alpha"),e="@{".concat(e.name.slice(1),"}")),h(")"),new Ke.Quoted("","alpha(opacity=".concat(e,")"))},element:function(){var e,t,n,r=o.i;if(t=this.combinator(),!(e=o.$re(/^(?:\d+\.\d+|\d+)%/)||o.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||o.$char("*")||o.$char("&")||this.attribute()||o.$re(/^\([^&()@]+\)/)||o.$re(/^[.#:](?=@)/)||this.entities.variableCurly()))if(o.save(),o.$char("("))if(n=this.selector(!1)){for(var a=[];o.$char(",");)a.push(n),a.push(new se(",")),n=this.selector(!1);a.push(n),o.$char(")")?(e=a.length>1?new Ke.Paren(new oe(a)):new Ke.Paren(n),o.forget()):o.restore("Missing closing ')'")}else o.restore("Missing closing ')'");else o.forget();if(e)return new Ke.Element(t,e,e instanceof Ke.Variable,r+s,i)},combinator:function(){var e=o.currentChar();if("/"===e){o.save();var t=o.$re(/^\/[a-z]+\//i);if(t)return o.forget(),new Ke.Combinator(t);o.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(o.i++,"^"===e&&"^"===o.currentChar()&&(e="^^",o.i++);o.isWhitespace();)o.i++;return new Ke.Combinator(e)}return o.isWhitespace(-1)?new Ke.Combinator(" "):new Ke.Combinator(null)},selector:function(e){var t,n,r,a,u,h,f,p=o.i;for(e=!1!==e;(e&&(n=this.extend())||e&&(h=o.$str("when"))||(a=this.element()))&&(h?f=c(this.conditions,"expected condition"):f?l("CSS guard can only be used at the end of selector"):n?u=u?u.concat(n):n:(u&&l("Extend can only be used at the end of selector"),r=o.currentChar(),Array.isArray(a)&&a.forEach((function(e){return t.push(e)})),t?t.push(a):t=[a],a=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Ke.Selector(t,u,f,p+s,i);u&&l("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],o.commentStore.length=0,e.condition&&t.length>1&&l("Guards are only currently allowed on a single selector."),o.$char(","));)e.condition&&l("Guards are only currently allowed on a single selector."),o.commentStore.length=0;return t},attribute:function(){if(o.$char("[")){var e,t,n,i,r=this.entities;return(e=r.variableCurly())||(e=c(/^(?:[_A-Za-z0-9-*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(n=o.$re(/^[|~*$^]?=/))&&(t=r.quoted()||o.$re(/^[0-9]+%/)||o.$re(/^[\w-]+/)||r.variableCurly())&&(i=o.$re(/^[iIsS]/)),h("]"),new Ke.Attribute(e,n,t,i)}},block:function(){var e;if(o.$char("{")&&(e=this.primary())&&o.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Ke.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,n;if(o.save(),!o.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,n=e.variadic,o.$char(")"))){var i=this.blockRuleset();if(i)return o.forget(),t?new Ke.mixin.Definition(null,t,i,null,n):new Ke.DetachedRuleset(i);o.restore()}else o.restore()},ruleset:function(){var e,n,i;if(o.save(),t.dumpLineNumbers&&(i=f(o.i)),(e=this.selectors())&&(n=this.block())){o.forget();var r=new Ke.Ruleset(e,n,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=i),r}o.restore()},declaration:function(){var e,t,n,r,a,l,u=o.i,c=o.currentChar();if("."!==c&&"#"!==c&&"&"!==c&&":"!==c)if(o.save(),e=this.variable()||this.ruleProperty()){if((l="string"==typeof e)&&(t=this.detachedRuleset())&&(n=!0),o.commentStore.length=0,!t){if(a=!l&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?o.$char(";")?new se(""):this.permissiveValue(/[;}]/,!0):this.anonymousValue())return o.forget(),new Ke.Declaration(e,t,!1,a,u+s,i);t||(t=this.value()),t?r=this.important():l&&(t=this.permissiveValue())}if(t&&(this.end()||n))return o.forget(),new Ke.Declaration(e,t,r,a,u+s,i);o.restore()}else o.restore()},anonymousValue:function(){var e=o.i,t=o.$re(/^([^.#@$+/'"*`(;{}-]*);/);if(t)return new Ke.Anonymous(t[1],e+s)},permissiveValue:function(e){var t,n,r,s,a=e||";",c=o.i,h=[];function f(){var e=o.currentChar();return"string"==typeof a?e===a:a.test(e)}if(!f()){s=[];do{(n=this.comment())?s.push(n):((n=this.entity())&&s.push(n),o.peek(",")&&(s.push(new Ke.Anonymous(",",o.i)),o.$char(",")))}while(n);if(r=f(),s.length>0){if(s=new Ke.Expression(s),r)return s;h.push(s)," "===o.prevChar()&&h.push(new Ke.Anonymous(" ",c))}if(o.save(),s=o.$parseUntil(a)){if("string"==typeof s&&l("Expected '".concat(s,"'"),"Parse"),1===s.length&&" "===s[0])return o.forget(),new Ke.Anonymous("",c);var p=void 0;for(t=0;t]=|<=|>=|[<>]|=)/)?(o.restore(),n=this.condition(),o.save(),(r=this.atomicCondition(null,n.rvalue))||o.restore()):(o.restore(),t=this.value()),o.$char(")")?n&&!t?(u.push(new Ke.Paren(new Ke.QueryInParens(n.op,n.lvalue,n.rvalue,r?r.op:null,r?r.rvalue:null,n._index))),t=n):n&&t?(u.push(new Ke.Paren(new Ke.Declaration(n,t,null,null,o.i+s,i,!0))),c||(u[u.length-1].noSpacing=!0),c=!1):t?(u.push(new Ke.Paren(t)),c=!1):l("badly formed media feature definition"):l("Missing closing ')'","Parse"))}while(t);if(o.forget(),u.length>0)return new Ke.Expression(u)},mediaFeatures:function(e){var t,n=this.entities,i=[];do{if(t=this.mediaFeature(e)){if(i.push(t),!o.$char(","))break;i[i.length-1].noSpacing||(i[i.length-1].noSpacing=!1)}else if(t=n.variable()||n.mixinLookup()){if(i.push(t),!o.$char(","))break;i[i.length-1].noSpacing||(i[i.length-1].noSpacing=!1)}}while(t);return i.length>0?i:null},prepareAndGetNestableAtRule:function(e,n,r,a){var u=this.mediaFeatures(a),c=this.block();c||l("media definitions require block statements after any features"),o.forget();var h=new e(c,u,n+s,i);return t.dumpLineNumbers&&(h.debugInfo=r),h},nestableAtRule:function(){var e,n=o.i;if(t.dumpLineNumbers&&(e=f(n)),o.save(),o.$peekChar("@")){if(o.$str("@media"))return this.prepareAndGetNestableAtRule(Ke.Media,n,e,ie);if(o.$str("@container"))return this.prepareAndGetNestableAtRule(Ke.Container,n,e,re)}o.restore()},plugin:function(){var e,t,n,r=o.i;if(o.$re(/^@plugin\s+/)){if(n=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return o.$char(";")||(o.i=r,l("missing semi-colon on @plugin")),new Ke.Import(e,null,n,r+s,i);o.i=r,l("malformed @plugin statement")}},pluginArgs:function(){if(o.save(),!o.$char("("))return o.restore(),null;var e=o.$re(/^\s*([^);]+)\)\s*/);return e[1]?(o.forget(),e[1].trim()):(o.restore(),null)},atruleUnknown:function(e,t,n){return e=this.permissiveValue(/^[{;]/),n="{"===o.currentChar(),e?e.value||(e=null):n||";"===o.currentChar()||l("".concat(t," rule is missing block or ending semi-colon")),[e,n]},atruleBlock:function(e,t,n,i){if(e=this.blockRuleset(),o.save(),e||n||(t=this.entity(),e=this.blockRuleset()),e||n)o.forget();else{o.restore();var r=[];for(t=this.entity();o.$char(",");)r.push(t),t=this.entity();t&&r.length>0?(r.push(t),t=r,i=!0):e=this.blockRuleset()}return[e,t,i]},atrule:function(){var e,n,r,a,u,c,h,p=o.i,v=!0,d=!0,m=!1;if("@"===o.currentChar()){if(n=this.import()||this.plugin()||this.nestableAtRule())return n;if(o.save(),e=o.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@".concat(e.slice(e.indexOf("-",2)+1))),a){case"@charset":u=!0,v=!1;break;case"@namespace":c=!0,v=!1;break;case"@keyframes":case"@counter-style":u=!0;break;case"@document":case"@supports":h=!0,d=!1;break;case"@starting-style":case"@layer":d=!1;break;default:h=!0}if(o.commentStore.length=0,u)(n=this.entity())||l("expected ".concat(e," identifier"));else if(c)(n=this.expression())||l("expected ".concat(e," expression"));else if(h){n=(g=this.atruleUnknown(n,e,v))[0],v=g[1]}if(v){var g,y=this.atruleBlock(r,n,d,m);if(r=y[0],n=y[1],m=y[2],!r&&!h)o.restore(),e=o.$re(/^@[a-z-]+/),n=(g=this.atruleUnknown(n,e,v))[0],(v=g[1])&&(r=(y=this.atruleBlock(r,n,d,m))[0],n=y[1],m=y[2])}if(r||m||!v&&n&&o.$char(";"))return o.forget(),new Ke.AtRule(e,n,r,p+s,i,t.dumpLineNumbers?f(p):null,d);o.restore("at-rule options not recognised")}}},value:function(){var e,t=[],n=o.i;do{if((e=this.expression())&&(t.push(e),!o.$char(",")))break}while(e);if(t.length>0)return new Ke.Value(t,n+s)},important:function(){if("!"===o.currentChar())return o.$re(/^! *important/)},sub:function(){var e,t;if(o.save(),o.$char("("))return(e=this.addition())&&o.$char(")")?(o.forget(),(t=new Ke.Expression([e])).parens=!0,t):void o.restore("Expected ')'");o.restore()},colorOperand:function(){o.save();var e=o.$re(/^[lchrgbs]\s+/);if(e)return new Ke.Keyword(e[0]);o.restore()},multiplication:function(){var e,t,n,i,r;if(e=this.operand()){for(r=o.isWhitespace(-1);!o.peek(/^\/[*/]/);){if(o.save(),!(n=o.$char("/")||o.$char("*"))){var s=o.i;(n=o.$str("./"))&&u("./ operator is deprecated",s,"DEPRECATED")}if(!n){o.forget();break}if(!(t=this.operand())){o.restore();break}o.forget(),e.parensInOp=!0,t.parensInOp=!0,i=new Ke.Operation(n,[i||e,t],r),r=o.isWhitespace(-1)}return i||e}},addition:function(){var e,t,n,i,r;if(e=this.multiplication()){for(r=o.isWhitespace(-1);(n=o.$re(/^[-+]\s+/)||!r&&(o.$char("+")||o.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,i=new Ke.Operation(n,[i||e,t],r),r=o.isWhitespace(-1);return i||e}},conditions:function(){var e,t,n,i=o.i;if(e=this.condition(!0)){for(;o.peek(/^,\s*(not\s*)?\(/)&&o.$char(",")&&(t=this.condition(!0));)n=new Ke.Condition("or",n||e,t,i+s);return n||e}},condition:function(e){var t,n,i;if(t=this.conditionAnd(e)){if(n=o.$str("or")){if(!(i=this.condition(e)))return;t=new Ke.Condition(n,t,i)}return t}},conditionAnd:function(e){var t,n,i,r,s=this;if(t=(r=s.negatedCondition(e)||s.parenthesisCondition(e))||e?r:s.atomicCondition(e)){if(n=o.$str("and")){if(!(i=this.conditionAnd(e)))return;t=new Ke.Condition(n,t,i)}return t}},negatedCondition:function(e){if(o.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(o.save(),o.$str("(")){if(t=function(t){var n;if(o.save(),n=t.condition(e)){if(o.$char(")"))return o.forget(),n;o.restore()}else o.restore()}(this))return o.forget(),t;if(t=this.atomicCondition(e)){if(o.$char(")"))return o.forget(),t;o.restore("expected ')' got '".concat(o.currentChar(),"'"))}else o.restore()}else o.restore()},atomicCondition:function(e,t){var n,i,r,a,u=this.entities,c=o.i,h=function(){return this.addition()||u.keyword()||u.quoted()||u.mixinLookup()}.bind(this);if(n=t||h())return o.$char(">")?a=o.$char("=")?">=":">":o.$char("<")?a=o.$char("=")?"<=":"<":o.$char("=")&&(a=o.$char(">")?"=>":o.$char("<")?"=<":"="),a?(i=h())?r=new Ke.Condition(a,n,i,c+s,!1):l("expected expression"):t||(r=new Ke.Condition("=",n,new Ke.Keyword("true"),c+s,!1)),r},operand:function(){var e,t=this.entities;o.peek(/^-[@$(]/)&&(e=o.$char("-"));var n=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||this.colorOperand()||t.mixinLookup();return e&&(n.parensInOp=!0,n=new Ke.Negative(n)),n},expression:function(){var e,t,n=[],i=o.i;do{!(e=this.comment())||e.isLineComment?((e=this.addition()||this.entity())instanceof Ke.Comment&&(e=null),e&&(n.push(e),o.peek(/^\/[/*]/)||(t=o.$char("/"))&&n.push(new Ke.Anonymous(t,i+s)))):n.push(e)}while(e);if(n.length>0)return new Ke.Expression(n)},property:function(){var e=o.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,n=[],r=[];o.save();var a=o.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(a)return n=[new Ke.Keyword(a[1])],o.forget(),n;function l(e){var t=o.i,i=o.$re(e);if(i)return r.push(t),n.push(i[1])}for(l(/^(\*?)/);l(/^((?:[\w-]+)|(?:[@$]\{[\w-]+\}))/););if(n.length>1&&l(/^((?:\+_|\+)?)\s*:/)){for(o.forget(),""===n[0]&&(n.shift(),r.shift()),t=0;t0;e--){var t=this.rules[e-1];if(t instanceof he)return this.parseValue(t)}},parseValue:function(e){var t=this;function n(e){return e.value instanceof se&&!e.parsed?("string"==typeof e.value.value?new ae(this.parse.context,this.parse.importManager,e.fileInfo(),e.value.getIndex()).parseNode(e.value.value,["value","important"],(function(t,n){t&&(e.parsed=!0),n&&(e.value=n[0],e.important=n[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var i=[];return e.forEach((function(e){i.push(n.call(t,e))})),i}return n.call(t,e)},rulesets:function(){if(!this.rules)return[];var e,t,n=[],i=this.rules;for(e=0;t=i[e];e++)t.isRuleset&&n.push(t);return n},prependRule:function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},find:function(e,t,n){t=t||this;var i,r,s=[],a=e.toCSS();return a in this._lookups?this._lookups[a]:(this.rulesets().forEach((function(a){if(a!==t)for(var o=0;oi){if(!n||n(a)){r=a.find(new oe(e.elements.slice(i)),t,n);for(var l=0;l0&&t.add(l),e.firstSelector=!0,a[0].genCSS(e,t),e.firstSelector=!1,i=1;i0?(s=(r=A(e)).pop(),a=i.createDerived(A(s.elements))):a=i.createDerived([]),t.length>0){var o=n.combinator,l=t[0].elements[0];o.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(o=l.combinator),a.elements.push(new g(o,l.value,n.isVariable,n._index,n._fileInfo)),a.elements=a.elements.concat(t[0].elements.slice(1))}if(0!==a.elements.length&&r.push(a),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function a(e,t,n,i,r){var a;for(a=0;a0?i[i.length-1]=i[i.length-1].createDerived(i[i.length-1].elements.concat(e)):i.push(new oe(e));else t.push([new oe(e)])}function l(e,t){var n=t.createDerived(t.elements,t.extendList,t.evaldCondition);return n.copyVisibilityInfo(e),n}var u,c;if(!function e(t,n,l){var u,c,h,f,p,d,m,y,b,w,x,S,I=!1;for(f=[],p=[[]],u=0;y=l.elements[u];u++)if("&"!==y.value){var C=(S=void 0,(x=y).value instanceof v&&(S=x.value.value)instanceof oe?S:null);if(null!==C){o(f,p);var k,A=[],_=[];for(k=e(A,n,C),I=I||k,h=0;h0&&m[0].elements.push(new g(y.combinator,"",y.isVariable,y._index,y._fileInfo)),d.push(m);else for(h=0;h0&&(t.push(p[u]),w=p[u][b-1],p[u][b-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,n))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(i=n.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===n&&this.unit.isLength())return void t.add(i);n>0&&n<1&&(i=i.substr(1))}t.add(i),this.unit.genCSS(e,t)},operate:function(e,t,n){var i=this._operate(e,t,this.value,n.value),r=this.unit.clone();if("+"===t||"-"===t)if(0===r.numerator.length&&0===r.denominator.length)r=n.unit.clone(),this.unit.backupUnit&&(r.backupUnit=this.unit.backupUnit);else if(0===n.unit.numerator.length&&0===r.denominator.length);else{if(n=n.convertTo(this.unit.usedUnits()),e.strictUnits&&n.unit.toString()!==r.toString())throw new Error("Incompatible units. Change the units or use the unit function. "+"Bad units: '".concat(r.toString(),"' and '").concat(n.unit.toString(),"'."));i=this._operate(e,t,this.value,n.value)}else"*"===t?(r.numerator=r.numerator.concat(n.unit.numerator).sort(),r.denominator=r.denominator.concat(n.unit.denominator).sort(),r.cancel()):"/"===t&&(r.numerator=r.numerator.concat(n.unit.denominator).sort(),r.denominator=r.denominator.concat(n.unit.numerator).sort(),r.cancel());return new be(i,r)},compare:function(e){var t,n;if(e instanceof be){if(this.unit.isEmpty()||e.unit.isEmpty())t=this,n=e;else if(t=this.unify(),n=e.unify(),0!==t.unit.compare(n.unit))return;return u.numericCompare(t.value,n.value)}},unify:function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},convertTo:function(e){var t,n,i,r,s,a=this.value,l=this.unit.clone(),u={};if("string"==typeof e){for(t in o)o[t].hasOwnProperty(e)&&((u={})[t]=e);e=u}for(n in s=function(e,t){return i.hasOwnProperty(e)?(t?a/=i[e]/i[r]:a*=i[e]/i[r],r):e},e)e.hasOwnProperty(n)&&(r=e[n],i=o[n],l.map(s));return l.cancel(),new be(a,l)}});var we=function(e,t){if(this.value=e,this.noSpacing=t,!e)throw new Error("Expression requires an array parameter")};we.prototype=Object.assign(new u,{type:"Expression",accept:function(e){this.value=e.visitArray(this.value)},eval:function(e){var t,n=this.noSpacing,i=e.isMathOn(),r=this.parens,s=!1;return r&&e.inParenthesis(),this.value.length>1?t=new we(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(s=!0),t=this.value[0].eval(e)):t=this,r&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||s||t instanceof be||(t=new v(t)),t.noSpacing=t.noSpacing||n,t},genCSS:function(e,t){for(var n=0;n1){var n=new oe([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new ge(n,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},evalNested:function(e){var t,n;this.evalFunction();var i=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new se("and"));return new we(e)}))),this.setParent(this.features,this),new ge([],[])},permute:function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],n=this.permute(e.slice(1)),i=0;i0)for(var o=function(t){var o=e.frames[t];if("Ruleset"===o.type&&o.rules&&o.rules.length>0&&o&&!o.root&&o.selectors&&o.selectors.length>0&&(a=a.concat(o.selectors)),a.length>0){for(var l="",u={add:function(e){l+=e}},c=0;c0&&i>0&&!s&&!r;return(this.isRooted&&n>0&&0===i&&!s&&r||!u)&&(t[0].root=!0),t},variable:function(e){if(this.rules)return ge.prototype.variable.call(this.rules[0],e)},find:function(){if(this.rules)return ge.prototype.find.apply(this.rules[0],arguments)},rulesets:function(){if(this.rules)return ge.prototype.rulesets.apply(this.rules[0])},outputRuleset:function(e,t,n){var i,r=n.length;if(e.tabLevel=1+(0|e.tabLevel),e.compress){for(t.add("{"),i=0;i=1)if("Expression"===(o=r[0]).type&&Array.isArray(o.value)&&o.value.length>=2)"Keyword"===(r=o.value)[0].type&&"layer"===r[0].value&&"Paren"===r[1].type&&(this.css=!1)}if(this.options.inline){var s=new se(this.root,0,{filename:this.importedFilename,reference:this.path._fileInfo&&this.path._fileInfo.reference},!0,!0);return this.features?new $e([s],this.features.value):[s]}if(this.css||this.layerCss){var a=new Fe(this.evalPath(e),i,this.options,this._index);if(this.layerCss&&(a.css=this.layerCss,a.path._fileInfo=this._fileInfo),!a.css&&this.error)throw this.error;return a}if(this.root){if(this.features){var o;r=this.features.value;if(Array.isArray(r)&&1===r.length)if("Expression"===(o=r[0]).type&&Array.isArray(o.value)&&o.value.length>=2)if("Keyword"===(r=o.value)[0].type&&"layer"===r[0].value&&"Paren"===r[1].type)return this.layerCss=!0,r[0]=new we(r.slice(0,2)),r.splice(1,1),r[0].noSpacing=!0,this}return(t=new ge(null,A(this.root.rules))).evalImports(e),this.features?new $e(t.rules,this.features.value):t.rules}if(this.features){r=this.features.value;if(Array.isArray(r)&&r.length>=1)if(r=r[0].value,Array.isArray(r)&&r.length>=2)if("Keyword"===r[0].type&&"layer"===r[0].value&&"Paren"===r[1].type)return this.css=!0,r[0]=new we(r.slice(0,2)),r.splice(1,1),r[0].noSpacing=!0,this}return[]}});var Ve=function(){};Ve.prototype=Object.assign(new u,{evaluateJavaScript:function(e,t){var n,i=this,r={};if(!t.javascriptEnabled)throw{message:"Inline JavaScript is not enabled. Is it set in your options?",filename:this.fileInfo().filename,index:this.getIndex()};e=e.replace(/@\{([\w-]+)\}/g,(function(e,n){return i.jsify(new Pe("@".concat(n),i.getIndex(),i.fileInfo()).eval(t))}));try{e=new Function("return (".concat(e,")"))}catch(t){throw{message:"JavaScript evaluation error: ".concat(t.message," from `").concat(e,"`"),filename:this.fileInfo().filename,index:this.getIndex()}}var s=t.frames[0].variables();for(var a in s)s.hasOwnProperty(a)&&(r[a.slice(1)]={value:s[a].value,toJS:function(){return this.value.eval(t).toCSS()}});try{n=e.call(r)}catch(e){throw{message:"JavaScript evaluation error: '".concat(e.name,": ").concat(e.message.replace(/["]/g,"'"),"'"),filename:this.fileInfo().filename,index:this.getIndex()}}return n},jsify:function(e){return Array.isArray(e.value)&&e.value.length>1?"[".concat(e.value.map((function(e){return e.toCSS()})).join(", "),"]"):e.toCSS()}});var Le=function(e,t,n,i){this.escaped=t,this.expression=e,this._index=n,this._fileInfo=i};Le.prototype=Object.assign(new Ve,{type:"JavaScript",eval:function(e){var t=this.evaluateJavaScript(this.expression,e),n=typeof t;return"number"!==n||isNaN(t)?"string"===n?new Me('"'.concat(t,'"'),t,this.escaped,this._index):Array.isArray(t)?new se(t.join(", ")):new se(t):new be(t)}});var je=function(e,t){this.key=e,this.value=t};je.prototype=Object.assign(new u,{type:"Assignment",accept:function(e){this.value=e.visit(this.value)},eval:function(e){return this.value.eval?new je(this.key,this.value.eval(e)):this},genCSS:function(e,t){t.add("".concat(this.key,"=")),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)}});var De=function(e,t,n,i,r){this.op=e.trim(),this.lvalue=t,this.rvalue=n,this._index=i,this.negate=r};De.prototype=Object.assign(new u,{type:"Condition",accept:function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},eval:function(e){var t=function(e,t,n){switch(e){case"and":return t&&n;case"or":return t||n;default:switch(u.compare(t,n)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t}});var Ne=function(e,t,n,i,r,s){this.op=e.trim(),this.lvalue=t,this.mvalue=n,this.op2=i?i.trim():null,this.rvalue=r,this._index=s,this.mvalues=[]};Ne.prototype=Object.assign(new u,{type:"QueryInParens",accept:function(e){this.lvalue=e.visit(this.lvalue),this.mvalue=e.visit(this.mvalue),this.rvalue&&(this.rvalue=e.visit(this.rvalue))},eval:function(e){var t,n;this.lvalue=this.lvalue.eval(e);for(var i=0;(n=e.frames[i])&&("Ruleset"!==n.type||!(t=n.rules.find((function(e){return!!(e instanceof he&&e.variable)}))));i++);return this.mvalueCopy||(this.mvalueCopy=C(this.mvalue)),t?(this.mvalue=this.mvalueCopy,this.mvalue=this.mvalue.eval(e),this.mvalues.push(this.mvalue)):this.mvalue=this.mvalue.eval(e),this.rvalue&&(this.rvalue=this.rvalue.eval(e)),this},genCSS:function(e,t){this.lvalue.genCSS(e,t),t.add(" "+this.op+" "),this.mvalues.length>0&&(this.mvalue=this.mvalues.shift()),this.mvalue.genCSS(e,t),this.rvalue&&(t.add(" "+this.op2+" "),this.rvalue.genCSS(e,t))}});var Be=function(e,t,n,i,r){this._index=n,this._fileInfo=i;var s=new oe([],null,null,this._index,this._fileInfo).createEmptySelectors();this.features=new le(t),this.rules=[new ge(s,e)],this.rules[0].allowImports=!0,this.copyVisibilityInfo(r),this.allowRoot=!0,this.setParent(s,this),this.setParent(this.features,this),this.setParent(this.rules,this)};Be.prototype=Object.assign(new Se,p(p({type:"Container"},xe),{genCSS:function(e,t){t.add("@container ",this._fileInfo,this._index),this.features.genCSS(e,t),this.outputRuleset(e,t,this.rules)},eval:function(e){e.mediaBlocks||(e.mediaBlocks=[],e.mediaPath=[]);var t=new Be(null,[],this._index,this._fileInfo,this.visibilityInfo());return this.debugInfo&&(this.rules[0].debugInfo=this.debugInfo,t.debugInfo=this.debugInfo),t.features=this.features.eval(e),e.mediaPath.push(t),e.mediaBlocks.push(t),this.rules[0].functionRegistry=e.frames[0].functionRegistry.inherit(),e.frames.unshift(this.rules[0]),t.rules=[this.rules[0].eval(e)],e.frames.shift(),e.mediaPath.pop(),0===e.mediaPath.length?t.evalTop(e):t.evalNested(e)}}));var Ue=function(e){this.value=e};Ue.prototype=Object.assign(new u,{type:"UnicodeDescriptor"});var qe=function(e){this.value=e};qe.prototype=Object.assign(new u,{type:"Negative",genCSS:function(e,t){t.add("-"),this.value.genCSS(e,t)},eval:function(e){return e.isMathOn()?new ke("*",[new be(-1),this.value]).eval(e):new qe(this.value.eval(e))}});var Te=function(e,t,n,i,r){switch(this.selector=e,this.option=t,this.object_id=Te.next_id++,this.parent_ids=[this.object_id],this._index=n,this._fileInfo=i,this.copyVisibilityInfo(r),this.allowRoot=!0,t){case"!all":case"all":this.allowBefore=!0,this.allowAfter=!0;break;default:this.allowBefore=!1,this.allowAfter=!1}this.setParent(this.selector,this)};Te.prototype=Object.assign(new u,{type:"Extend",accept:function(e){this.selector=e.visit(this.selector)},eval:function(e){return new Te(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},clone:function(e){return new Te(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},findSelfSelectors:function(e){var t,n,i=[];for(t=0;t0&&n.length&&""===n[0].combinator.value&&(n[0].combinator.value=" "),i=i.concat(e[t].elements);this.selfSelectors=[new oe(i)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())}}),Te.next_id=0;var ze=function(e,t,n){this.variable=e,this._index=t,this._fileInfo=n,this.allowRoot=!0};ze.prototype=Object.assign(new u,{type:"VariableCall",eval:function(e){var t,n=new Pe(this.variable,this.getIndex(),this.fileInfo()).eval(e),i=new F({message:"Could not evaluate variable call ".concat(this.variable)});if(!n.ruleset){if(n.rules)t=n;else if(Array.isArray(n))t=new ge("",n);else{if(!Array.isArray(n.value))throw i;t=new ge("",n.value)}n=new Ie(t)}if(n.ruleset)return n.callEval(e);throw i}});var Ge=function(e,t,n,i){this.value=e,this.lookups=t,this._index=n,this._fileInfo=i};Ge.prototype=Object.assign(new u,{type:"NamespaceValue",eval:function(e){var t,n,i=this.value.eval(e);for(t=0;tthis.params.length)return!1}n=Math.min(s,this.arity);for(var a=0;a0){for(c=!0,o=0;o0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `".concat(this.format(m),"`"),index:this.getIndex(),filename:this.fileInfo().filename};for(o=0;o0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var n,i,r,s,a=this.extractUrlParts(e),o=this.extractUrlParts(t),l="";if(a.hostPart!==o.hostPart)return"";for(i=Math.max(o.directories.length,a.directories.length),n=0;nparseInt(t[n])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",n=0;n1?e-1:e)<1?r+(s-r)*e*6:2*e<1?s:3*e<2?r+(s-r)*(2/3-e)*6:r}try{if(e instanceof c)return i=t?st(t):e.alpha,new c(e.rgb,i,"hsla");e=st(e)%360/360,t=tt(st(t)),n=tt(st(n)),i=tt(st(i)),r=2*n-(s=n<=.5?n*(t+1):n+t-n*t);var o=[255*a(e+1/3),255*a(e),255*a(e-1/3)];return i=st(i),new c(o,i,"hsla")}catch(e){}},hsv:function(e,t,n){return Ye.hsva(e,t,n,1)},hsva:function(e,t,n,i){var r,s;e=st(e)%360/360*360,t=st(t),n=st(n),i=st(i);var a=[n,n*(1-t),n*(1-(s=e/60-(r=Math.floor(e/60%6)))*t),n*(1-(1-s)*t)],o=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return Ye.rgba(255*a[o[r][0]],255*a[o[r][1]],255*a[o[r][2]],i)},hue:function(e){return new be(it(e).h)},saturation:function(e){return new be(100*it(e).s,"%")},lightness:function(e){return new be(100*it(e).l,"%")},hsvhue:function(e){return new be(rt(e).h)},hsvsaturation:function(e){return new be(100*rt(e).s,"%")},hsvvalue:function(e){return new be(100*rt(e).v,"%")},red:function(e){return new be(e.rgb[0])},green:function(e){return new be(e.rgb[1])},blue:function(e){return new be(e.rgb[2])},alpha:function(e){return new be(it(e).a)},luma:function(e){return new be(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new be(t*e.alpha*100,"%")},saturate:function(e,t,n){if(!e.rgb)return null;var i=it(e);return void 0!==n&&"relative"===n.value?i.s+=i.s*t.value/100:i.s+=t.value/100,i.s=tt(i.s),nt(e,i)},desaturate:function(e,t,n){var i=it(e);return void 0!==n&&"relative"===n.value?i.s-=i.s*t.value/100:i.s-=t.value/100,i.s=tt(i.s),nt(e,i)},lighten:function(e,t,n){var i=it(e);return void 0!==n&&"relative"===n.value?i.l+=i.l*t.value/100:i.l+=t.value/100,i.l=tt(i.l),nt(e,i)},darken:function(e,t,n){var i=it(e);return void 0!==n&&"relative"===n.value?i.l-=i.l*t.value/100:i.l-=t.value/100,i.l=tt(i.l),nt(e,i)},fadein:function(e,t,n){var i=it(e);return void 0!==n&&"relative"===n.value?i.a+=i.a*t.value/100:i.a+=t.value/100,i.a=tt(i.a),nt(e,i)},fadeout:function(e,t,n){var i=it(e);return void 0!==n&&"relative"===n.value?i.a-=i.a*t.value/100:i.a-=t.value/100,i.a=tt(i.a),nt(e,i)},fade:function(e,t){var n=it(e);return n.a=t.value/100,n.a=tt(n.a),nt(e,n)},spin:function(e,t){var n=it(e),i=(n.h+t.value)%360;return n.h=i<0?360+i:i,nt(e,n)},mix:function(e,t,n){n||(n=new be(50));var i=n.value/100,r=2*i-1,s=it(e).a-it(t).a,a=((r*s==-1?r:(r+s)/(1+r*s))+1)/2,o=1-a,l=[e.rgb[0]*a+t.rgb[0]*o,e.rgb[1]*a+t.rgb[1]*o,e.rgb[2]*a+t.rgb[2]*o],u=e.alpha*i+t.alpha*(1-i);return new c(l,u)},greyscale:function(e){return Ye.desaturate(e,new be(100))},contrast:function(e,t,n,i){if(!e.rgb)return null;if(void 0===n&&(n=Ye.rgba(255,255,255,1)),void 0===t&&(t=Ye.rgba(0,0,0,1)),t.luma()>n.luma()){var r=n;n=t,t=r}return i=void 0===i?.43:st(i),e.luma().5&&(i=1,n=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*i*(n-e)},hardlight:function(e,t){return lt.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var ut in lt)lt.hasOwnProperty(ut)&&(ot[ut]=ot.bind(null,lt[ut]));var ct=function(e){return Array.isArray(e.value)?e.value:Array(e)},ht={_SELF:function(e){return e},"~":function(){for(var e=[],t=0;ta.value)&&(h[i]=r);else{if(void 0!==l&&o!==l)throw{type:"Argument",message:"incompatible types"};f[o]=h.length,h.push(r)}}return 1==h.length?h[0]:(t=h.map((function(e){return e.toCSS(c.context)})).join(this.context.compress?",":", "),new se("".concat(e?"min":"max","(").concat(t,")")))},mt={min:function(){for(var e=[],t=0;t<'.concat(u,'Gradient id="g" ').concat(n,">"),r=0;r");return i+="".concat(u,"Gradient>'),i=encodeURIComponent(i),i="data:image/svg+xml,".concat(i),new Oe(new Me("'".concat(i,"'"),i,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),ne.addMultiple(wt),ne.addMultiple(St),t};function Ct(e,t){var n,i=(t=t||{}).variables,r=new B.Eval(t);"object"!=typeof i||Array.isArray(i)||(i=Object.keys(i).map((function(e){var t=i[e];return t instanceof Ke.Value||(t instanceof Ke.Expression||(t=new Ke.Expression([t])),t=new Ke.Value([t])),new Ke.Declaration("@".concat(e),t,!1,null,0)})),r.frames=[new Ke.Ruleset(null,i)]);var s,a,o=[new ee.JoinSelectorVisitor,new ee.MarkVisibleSelectorsVisitor(!0),new ee.ExtendVisitor,new ee.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){a=t.pluginManager.visitor();for(var u=0;u<2;u++)for(a.first();s=a.get();)s.isPreEvalVisitor?0!==u&&-1!==l.indexOf(s)||(l.push(s),s.run(e)):0!==u&&-1!==o.indexOf(s)||(s.isPreVisitor?o.unshift(s):o.push(s))}n=e.eval(r);for(var c=0;c=t);n++);this.preProcessors.splice(n,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var n;for(n=0;n=t);n++);this.postProcessors.splice(n,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var i=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?i=this.sourceMapURL:this._sourceMapFilename&&(i=this._sourceMapFilename),this.sourceMapURL=i,this.sourceMap=r}return this._css.join("")},t}()}(e=new s(e,t)),e)),o=function(e){return function(){function t(e,t,n){this.less=e,this.rootFilename=n.filename,this.paths=t.paths||[],this.contents={},this.contentsIgnoredChars={},this.mime=t.mime,this.error=null,this.context=t,this.queue=[],this.files={}}return t.prototype.push=function(t,n,i,s,a){var o=this,l=this.context.pluginManager.Loader;this.queue.push(t);var u=function(e,n,i){o.queue.splice(o.queue.indexOf(t),1);var l=i===o.rootFilename;s.optional&&e?(a(null,{rules:[]},!1,null),r.info("The file ".concat(i," was skipped because it was not found and the import was marked optional."))):(o.files[i]||s.inline||(o.files[i]={root:n,options:s}),e&&!o.error&&(o.error=e),a(e,n,l,i))},c={rewriteUrls:this.context.rewriteUrls,entryPath:i.entryPath,rootpath:i.rootpath,rootFilename:i.rootFilename},h=e.getFileManager(t,i.currentDirectory,this.context,e);if(h){var f,p,v=function(e){var t,n=e.filename,r=e.contents.replace(/^\uFEFF/,"");c.currentDirectory=h.getPath(n),c.rewriteUrls&&(c.rootpath=h.join(o.context.rootpath||"",h.pathDiff(c.currentDirectory,c.entryPath)),!h.isPathAbsolute(c.rootpath)&&h.alwaysMakePathsAbsolute()&&(c.rootpath=h.join(c.entryPath,c.rootpath))),c.filename=n;var a=new B.Parse(o.context);a.processImports=!1,o.contents[n]=r,(i.reference||s.reference)&&(c.reference=!0),s.isPlugin?(t=l.evalPlugin(r,a,o,s.pluginArgs,c))instanceof F?u(t,null,n):u(null,t,n):s.inline?u(null,r,n):!o.files[n]||o.files[n].options.multiple||s.multiple?new ae(a,o,c).parse(r,(function(e,t){u(e,t,n)})):u(null,o.files[n].root,n)},d=_(this.context);n&&(d.ext=s.isPlugin?".js":".less"),s.isPlugin?(d.mime="application/javascript",d.syncImport?f=l.loadPluginSync(t,i.currentDirectory,d,e,h):p=l.loadPlugin(t,i.currentDirectory,d,e,h)):d.syncImport?f=h.loadFileSync(t,i.currentDirectory,d,e):p=h.loadFile(t,i.currentDirectory,d,e,(function(e,t){e?u(e):v(t)})),f?f.filename?v(f):u(f):p&&p.then(v,u)}else u({message:"Could not find a file-manager for ".concat(t)})},t}()}(e);var u,c=function(e,t){var n=function(e,i,r){if("function"==typeof i?(r=i,i=E(this.options,{})):i=E(this.options,i||{}),!r){var s=this;return new Promise((function(t,r){n.call(s,e,i,(function(e,n){e?r(e):t(n)}))}))}this.parse(e,i,(function(e,n,i,s){if(e)return r(e);var a;try{a=new t(n,i).toCSS(s)}catch(e){return r(e)}r(null,a)}))};return n}(0,a),h=function(e,t,n){var i=function(e,t,r){if("function"==typeof t?(r=t,t=E(this.options,{})):t=E(this.options,t||{}),!r){var s=this;return new Promise((function(n,r){i.call(s,e,t,(function(e,t){e?r(e):n(t)}))}))}var a,o=void 0,l=new _t(this,!t.reUsePluginManager);if(t.pluginManager=l,a=new B.Parse(t),t.rootFileInfo)o=t.rootFileInfo;else{var u=t.filename||"input",c=u.replace(/[^/\\]*$/,"");(o={filename:u,rewriteUrls:a.rewriteUrls,rootpath:a.rootpath||"",currentDirectory:c,entryPath:c,rootFilename:u}).rootpath&&"/"!==o.rootpath.slice(-1)&&(o.rootpath+="/")}var h=new n(this,a,o);this.importManager=h,t.plugins&&t.plugins.forEach((function(e){var t,n;if(e.fileContent){if(n=e.fileContent.replace(/^\uFEFF/,""),(t=l.Loader.evalPlugin(n,a,h,e.options,e.filename))instanceof F)return r(t)}else l.addPlugin(e)})),new ae(a,h,o).parse(e,(function(e,n){if(e)return r(e);r(null,n,h,t)}),t)};return i}(0,0,o),f=Rt("v".concat("4.4.2")),p={version:[f.major,f.minor,f.patch],data:l,tree:Ke,Environment:s,AbstractFileManager:He,AbstractPluginLoader:Qe,environment:e,visitors:ee,Parser:ae,functions:It(e),contexts:B,SourceMapOutput:n,SourceMapBuilder:i,ParseTree:a,ImportManager:o,render:c,parse:h,LessError:F,transformTree:Ct,utils:O,PluginManager:_t,logger:r},v=function(e){return function(){var t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}},d=Object.create(p);for(var m in p.tree)if("function"==typeof(u=p.tree[m]))d[m.toLowerCase()]=v(u);else for(var g in d[m]=Object.create(null),u)d[m][g.toLowerCase()]=v(u[g]);return p.parse=p.parse.bind(d),p.render=p.render.bind(d),d}var Ot={},$t=function(){};$t.prototype=Object.assign(new He,{alwaysMakePathsAbsolute:function(){return!0},join:function(e,t){return e?this.extractUrlParts(t,e).path:t},doXHR:function(e,t,n,i){var r=new XMLHttpRequest,s=!Pt.isFileProtocol||Pt.fileAsync;function a(t,n,i){t.status>=200&&t.status<300?n(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof i&&i(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),Et.debug("XHR: Getting '".concat(e,"'")),r.open("GET",e,s),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),Pt.isFileProtocol&&!Pt.fileAsync?0===r.status||r.status>=200&&r.status<300?n(r.responseText):i(r.status,e):s?r.onreadystatechange=function(){4==r.readyState&&a(r,n,i)}:a(r,n,i)},supports:function(){return!0},clearFileCache:function(){Ot={}},loadFile:function(e,t,n){t&&!this.isPathAbsolute(e)&&(e=t+e),e=n.ext?this.tryAppendExtension(e,n.ext):e,n=n||{};var i=this.extractUrlParts(e,window.location.href).url,r=this;return new Promise((function(e,t){if(n.useFileCache&&Ot[i])try{var s=Ot[i];return e({contents:s,filename:i,webInfo:{lastModified:new Date}})}catch(e){return t({filename:i,message:"Error loading file ".concat(i," error was ").concat(e.message)})}r.doXHR(i,n.mime,(function(t,n){Ot[i]=t,e({contents:t,filename:i,webInfo:{lastModified:n}})}),(function(e,n){t({type:"File",message:"'".concat(n,"' wasn't found (").concat(e,")"),href:i})}))}))}});var Ft=function(e,t){return Pt=e,Et=t,$t},Vt=function(e){this.less=e};Vt.prototype=Object.assign(new Qe,{loadPlugin:function(e,t,n,i,r){return new Promise((function(s,a){r.loadFile(e,t,n,i).then(s).catch(a)}))}});var Lt=function(t,i,r){return{add:function(s,a){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var n=e.filename||t,s=[],a="".concat(e.type||"Syntax","Error: ").concat(e.message||"There is an error in your .less file"," in ").concat(n),o=function(e,t,n){void 0!==e.extract[t]&&s.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};e.line&&(o(e,0,""),o(e,1,"line"),o(e,2,""),a+=" on line ".concat(e.line,", column ").concat(e.column+1,":\n").concat(s.join("\n"))),e.stack&&(e.extract||r.logLevel>=4)&&(a+="\nStack Trace\n".concat(e.stack)),i.logger.error(a)}(s,a):"function"==typeof r.errorReporting&&r.errorReporting("add",s,a):function(i,s){var a,o,l="less-error-message:".concat(e(s||"")),u=t.document.createElement("div"),c=[],h=i.filename||s,f=h.match(/([^/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",o="".concat(i.type||"Syntax","Error: ").concat(i.message||"There is an error in your .less file")+'
in ').concat(f," ");var p=function(e,t,n){void 0!==e.extract[t]&&c.push('
{content}'.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};i.line&&(p(i,0,""),p(i,1,"line"),p(i,2,""),o+="on line ".concat(i.line,", column ").concat(i.column+1,":")),i.stack&&(i.extract||r.logLevel>=4)&&(o+="
Stack Trace".concat(i.stack.split("\n").slice(1).join("
"))),u.innerHTML=o,n(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(a=setInterval((function(){var e=t.document,n=e.body;n&&(e.getElementById(l)?n.replaceChild(u,e.getElementById(l)):n.insertBefore(u,n.firstChild),clearInterval(a))}),10))}(s,a)},remove:function(n){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",n):function(n){var i=t.document.getElementById("less-error-message:".concat(e(n)));i&&i.parentNode.removeChild(i)}(n)}}},jt={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var Dt in window.less)Object.prototype.hasOwnProperty.call(window.less,Dt)&&(jt[Dt]=window.less[Dt]);!function(e,n){t(n,i(e)),void 0===n.isFileProtocol&&(n.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),n.async=n.async||!1,n.fileAsync=n.fileAsync||!1,n.poll=n.poll||(n.isFileProtocol?1e3:1500),n.env=n.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||n.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(n.dumpLineNumbers=r[1]),void 0===n.useFileCache&&(n.useFileCache=!0),void 0===n.onReady&&(n.onReady=!0),n.relativeUrls&&(n.rewriteUrls="all")}(window,jt),jt.plugins=jt.plugins||[],window.LESS_PLUGINS&&(jt.plugins=jt.plugins.concat(window.LESS_PLUGINS));var Nt,Bt,Ut,qt=function(e,i){var r=e.document,s=Mt();s.options=i;var a=s.environment,o=Ft(i,s.logger),l=new o;a.addFileManager(l),s.FileManager=o,s.PluginLoader=Vt,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var n=0;n 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory === undefined) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","/**\n * The reason why Node is a class and other nodes simply do not extend\n * from Node (since we're transpiling) is due to this issue:\n * \n * @see https://github.com/less/less.js/issues/3434\n */\nclass Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n }\n\n get currentFileInfo() {\n return this.fileInfo();\n }\n\n get index() {\n return this.getIndex();\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n // remove when genCSS has JSDoc types\n // eslint-disable-next-line no-unused-vars\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks === undefined) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks === undefined) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks === undefined) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nconst Color = function(rgb, a, originalForm) {\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n}\n\nColor.prototype = Object.assign(new Node(), {\n type: 'Color',\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n // eslint-disable-next-line no-fallthrough\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n },\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n },\n\n toRGB() {\n return toHex(this.rgb);\n },\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n },\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n },\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n },\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n});\n\nColor.fromKeyword = function(keyword) {\n let c;\n const key = keyword.toLowerCase();\n // eslint-disable-next-line no-prototype-builtins\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n};\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n }).join('')}`;\n}\n\nexport default Color;\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","import Node from './node';\n\nconst Paren = function(node) {\n this.value = node;\n};\n\nParen.prototype = Object.assign(new Node(), {\n type: 'Paren',\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n const paren = new Paren(this.value.eval(context));\n \n if (this.noSpacing) {\n paren.noSpacing = true;\n }\n\n return paren;\n }\n});\n\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nconst Combinator = function(value) {\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n}\n\nCombinator.prototype = Object.assign(new Node(), {\n type: 'Combinator',\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n});\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nconst Element = function(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n}\n\nElement.prototype = Object.assign(new Node(), {\n type: 'Element',\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n },\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n },\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n});\n\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/**\r\n * Returns the object type of the given payload\r\n *\r\n * @param {*} payload\r\n * @returns {string}\r\n */\r\nfunction getType(payload) {\r\n return Object.prototype.toString.call(payload).slice(8, -1);\r\n}\r\n/**\r\n * Returns whether the payload is undefined\r\n *\r\n * @param {*} payload\r\n * @returns {payload is undefined}\r\n */\r\nfunction isUndefined(payload) {\r\n return getType(payload) === 'Undefined';\r\n}\r\n/**\r\n * Returns whether the payload is null\r\n *\r\n * @param {*} payload\r\n * @returns {payload is null}\r\n */\r\nfunction isNull(payload) {\r\n return getType(payload) === 'Null';\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isPlainObject(payload) {\r\n if (getType(payload) !== 'Object')\r\n return false;\r\n return payload.constructor === Object && Object.getPrototypeOf(payload) === Object.prototype;\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isObject(payload) {\r\n return isPlainObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is { [K in any]: never }}\r\n */\r\nfunction isEmptyObject(payload) {\r\n return isPlainObject(payload) && Object.keys(payload).length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isFullObject(payload) {\r\n return isPlainObject(payload) && Object.keys(payload).length > 0;\r\n}\r\n/**\r\n * Returns whether the payload is an any kind of object (including special classes or objects with different prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isAnyObject(payload) {\r\n return getType(payload) === 'Object';\r\n}\r\n/**\r\n * Returns whether the payload is an object like a type passed in < >\r\n *\r\n * Usage: isObjectLike<{id: any}>(payload) // will make sure it's an object and has an `id` prop.\r\n *\r\n * @template T this must be passed in < >\r\n * @param {*} payload\r\n * @returns {payload is T}\r\n */\r\nfunction isObjectLike(payload) {\r\n return isAnyObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a function (regular or async)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is AnyFunction}\r\n */\r\nfunction isFunction(payload) {\r\n return typeof payload === 'function';\r\n}\r\n/**\r\n * Returns whether the payload is an array\r\n *\r\n * @param {any} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isArray(payload) {\r\n return getType(payload) === 'Array';\r\n}\r\n/**\r\n * Returns whether the payload is a an array with at least 1 item\r\n *\r\n * @param {*} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isFullArray(payload) {\r\n return isArray(payload) && payload.length > 0;\r\n}\r\n/**\r\n * Returns whether the payload is a an empty array\r\n *\r\n * @param {*} payload\r\n * @returns {payload is []}\r\n */\r\nfunction isEmptyArray(payload) {\r\n return isArray(payload) && payload.length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is a string\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isString(payload) {\r\n return getType(payload) === 'String';\r\n}\r\n/**\r\n * Returns whether the payload is a string, BUT returns false for ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isFullString(payload) {\r\n return isString(payload) && payload !== '';\r\n}\r\n/**\r\n * Returns whether the payload is ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isEmptyString(payload) {\r\n return payload === '';\r\n}\r\n/**\r\n * Returns whether the payload is a number (but not NaN)\r\n *\r\n * This will return `false` for `NaN`!!\r\n *\r\n * @param {*} payload\r\n * @returns {payload is number}\r\n */\r\nfunction isNumber(payload) {\r\n return getType(payload) === 'Number' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a boolean\r\n *\r\n * @param {*} payload\r\n * @returns {payload is boolean}\r\n */\r\nfunction isBoolean(payload) {\r\n return getType(payload) === 'Boolean';\r\n}\r\n/**\r\n * Returns whether the payload is a regular expression (RegExp)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is RegExp}\r\n */\r\nfunction isRegExp(payload) {\r\n return getType(payload) === 'RegExp';\r\n}\r\n/**\r\n * Returns whether the payload is a Map\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Map}\r\n */\r\nfunction isMap(payload) {\r\n return getType(payload) === 'Map';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakMap\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakMap}\r\n */\r\nfunction isWeakMap(payload) {\r\n return getType(payload) === 'WeakMap';\r\n}\r\n/**\r\n * Returns whether the payload is a Set\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Set}\r\n */\r\nfunction isSet(payload) {\r\n return getType(payload) === 'Set';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakSet\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakSet}\r\n */\r\nfunction isWeakSet(payload) {\r\n return getType(payload) === 'WeakSet';\r\n}\r\n/**\r\n * Returns whether the payload is a Symbol\r\n *\r\n * @param {*} payload\r\n * @returns {payload is symbol}\r\n */\r\nfunction isSymbol(payload) {\r\n return getType(payload) === 'Symbol';\r\n}\r\n/**\r\n * Returns whether the payload is a Date, and that the date is valid\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Date}\r\n */\r\nfunction isDate(payload) {\r\n return getType(payload) === 'Date' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a Blob\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Blob}\r\n */\r\nfunction isBlob(payload) {\r\n return getType(payload) === 'Blob';\r\n}\r\n/**\r\n * Returns whether the payload is a File\r\n *\r\n * @param {*} payload\r\n * @returns {payload is File}\r\n */\r\nfunction isFile(payload) {\r\n return getType(payload) === 'File';\r\n}\r\n/**\r\n * Returns whether the payload is a Promise\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Promise}\r\n */\r\nfunction isPromise(payload) {\r\n return getType(payload) === 'Promise';\r\n}\r\n/**\r\n * Returns whether the payload is an Error\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Error}\r\n */\r\nfunction isError(payload) {\r\n return getType(payload) === 'Error';\r\n}\r\n/**\r\n * Returns whether the payload is literally the value `NaN` (it's `NaN` and also a `number`)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is typeof NaN}\r\n */\r\nfunction isNaNValue(payload) {\r\n return getType(payload) === 'Number' && isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a primitive type (eg. Boolean | Null | Undefined | Number | String | Symbol)\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is boolean | null | undefined | number | string | symbol)}\r\n */\r\nfunction isPrimitive(payload) {\r\n return (isBoolean(payload) ||\r\n isNull(payload) ||\r\n isUndefined(payload) ||\r\n isNumber(payload) ||\r\n isString(payload) ||\r\n isSymbol(payload));\r\n}\r\n/**\r\n * Returns true whether the payload is null or undefined\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is null | undefined)}\r\n */\r\nvar isNullOrUndefined = isOneOf(isNull, isUndefined);\r\nfunction isOneOf(a, b, c, d, e) {\r\n return function (value) {\r\n return a(value) || b(value) || (!!c && c(value)) || (!!d && d(value)) || (!!e && e(value));\r\n };\r\n}\r\n/**\r\n * Does a generic check to check that the given payload is of a given type.\r\n * In cases like Number, it will return true for NaN as NaN is a Number (thanks javascript!);\r\n * It will, however, differentiate between object and null\r\n *\r\n * @template T\r\n * @param {*} payload\r\n * @param {T} type\r\n * @throws {TypeError} Will throw type error if type is an invalid type\r\n * @returns {payload is T}\r\n */\r\nfunction isType(payload, type) {\r\n if (!(type instanceof Function)) {\r\n throw new TypeError('Type must be a function');\r\n }\r\n if (!Object.prototype.hasOwnProperty.call(type, 'prototype')) {\r\n throw new TypeError('Type is not a class');\r\n }\r\n // Classes usually have names (as functions usually have names)\r\n var name = type.name;\r\n return getType(payload) === name || Boolean(payload && payload.constructor === type);\r\n}\n\nexport { getType, isAnyObject, isArray, isBlob, isBoolean, isDate, isEmptyArray, isEmptyObject, isEmptyString, isError, isFile, isFullArray, isFullObject, isFullString, isFunction, isMap, isNaNValue, isNull, isNullOrUndefined, isNumber, isObject, isObjectLike, isOneOf, isPlainObject, isPrimitive, isPromise, isRegExp, isSet, isString, isSymbol, isType, isUndefined, isWeakMap, isWeakSet };\n","import { isArray, isPlainObject } from 'is-what';\n\nfunction assignProp(carry, key, newVal, originalObject, includeNonenumerable) {\r\n const propType = {}.propertyIsEnumerable.call(originalObject, key)\r\n ? 'enumerable'\r\n : 'nonenumerable';\r\n if (propType === 'enumerable')\r\n carry[key] = newVal;\r\n if (includeNonenumerable && propType === 'nonenumerable') {\r\n Object.defineProperty(carry, key, {\r\n value: newVal,\r\n enumerable: false,\r\n writable: true,\r\n configurable: true,\r\n });\r\n }\r\n}\r\n/**\r\n * Copy (clone) an object and all its props recursively to get rid of any prop referenced of the original object. Arrays are also cloned, however objects inside arrays are still linked.\r\n *\r\n * @export\r\n * @template T\r\n * @param {T} target Target can be anything\r\n * @param {Options} [options = {}] Options can be `props` or `nonenumerable`\r\n * @returns {T} the target with replaced values\r\n * @export\r\n */\r\nfunction copy(target, options = {}) {\r\n if (isArray(target)) {\r\n return target.map((item) => copy(item, options));\r\n }\r\n if (!isPlainObject(target)) {\r\n return target;\r\n }\r\n const props = Object.getOwnPropertyNames(target);\r\n const symbols = Object.getOwnPropertySymbols(target);\r\n return [...props, ...symbols].reduce((carry, key) => {\r\n if (isArray(options.props) && !options.props.includes(key)) {\r\n return carry;\r\n }\r\n const val = target[key];\r\n const newVal = copy(val, options);\r\n assignProp(carry, key, newVal, target, options.nonenumerable);\r\n return carry;\r\n }, {});\r\n}\n\nexport { copy };\n","/* jshint proto: true */\nimport * as Constants from './constants';\nimport { copy } from 'copy-anything';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = copy(obj1);\n newObj._defaults = defaults;\n const cloned = obj2 ? copy(obj2) : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (Object.prototype.hasOwnProperty.call(obj2, prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}\n\nexport function isNullOrUndefined(val) {\n return val === null || val === undefined\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n var line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n lineAdjust = 1 - parseInt(match[2]);\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n options = options || {};\n const isWarning = (this.type ?? '').toLowerCase().includes('warning');\n const type = isWarning ? this.type : `${this.type}Error`;\n const color = isWarning ? 'yellow' : 'red';\n\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (!isWarning && typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (!isWarning && typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${type}: ${this.message}`, color);\n if (this.filename) {\n message += stylize(' in ', color) + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', color) + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import tree from '../tree';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (Object.prototype.hasOwnProperty.call(original, propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager', // Used as the plugin manager for the session\n 'quiet', // option - whether to log warnings\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n importItem.args = Array.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","/* eslint-disable no-unused-vars */\n/**\n * @todo - Remove unused when JSDoc types are added for visitor methods\n */\nimport contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this,\n inlineCSS = importNode.options.inline,\n isPlugin = importNode.options.isPlugin,\n isOptional = importNode.options.optional,\n duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n if (atRuleNode.value) {\n this.context.frames.unshift(atRuleNode);\n } else if (atRuleNode.declarations && atRuleNode.declarations.length) {\n if (atRuleNode.isRooted) {\n this.context.frames.unshift(atRuleNode);\n } else {\n this.context.frames.unshift(atRuleNode.declarations[0]);\n }\n } else if (atRuleNode.rules && atRuleNode.rules.length) {\n this.context.frames.unshift(atRuleNode);\n }\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","/* eslint-disable no-unused-vars */\n/**\n * @todo - Remove unused when JSDoc types are added for visitor methods\n */\nimport tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(extend) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n /**\n * @todo Shouldn't this be an error? To alert the developer\n * that they may have made an error in the selector they are\n * targeting?\n */\n logger.warn(`WARNING: extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(function (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","/* eslint-disable no-unused-vars */\n/**\n * @todo - Remove unused when JSDoc types are added for visitor methods\n */\nimport Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n\n if (atRuleNode.declarations && atRuleNode.declarations.length) {\n atRuleNode.declarations[0].root = (context.length === 0 || context[0].multiMedia);\n }\n else if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","/* eslint-disable no-unused-vars */\n/**\n * @todo - Remove unused when JSDoc types are added for visitor methods\n */\nimport tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$peekChar = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar: {\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n }\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']': {\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default function (input, fail) {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n}\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n // eslint-disable-next-line no-prototype-builtins\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","export const MediaSyntaxOptions = {\n queryInParens: true\n};\n\nexport const ContainerSyntaxOptions = {\n queryInParens: true\n};\n","import Node from './node';\n\nconst Anonymous = function(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n}\n\nAnonymous.prototype = Object.assign(new Node(), {\n type: 'Anonymous',\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n },\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n },\n isRulesetLike() {\n return this.rulesetLike;\n },\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n})\n\nexport default Anonymous;\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\nimport { ContainerSyntaxOptions, MediaSyntaxOptions } from '../tree/atrule-syntax';\nimport logger from '../logger';\nimport Selector from '../tree/selector';\nimport Anonymous from '../tree/anonymous';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo, currentIndex) {\n currentIndex = currentIndex || 0;\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n /**\n * \n * @param {string} msg \n * @param {number} index \n * @param {string} type \n */\n function warn(msg, index, type) {\n if (!context.quiet) {\n logger.warn(\n (new LessError(\n {\n index: index ?? parserInput.i,\n filename: fileInfo.filename,\n type: type ? `${type.toUpperCase()} WARNING` : 'WARNING',\n message: msg\n },\n imports\n )).toString()\n );\n }\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n\n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n *\n * @param {String} str - string to parse\n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p; (p = parseList[x]); x++) {\n result = parsers[p]();\n returnNodes.push(result || null);\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let err = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n // Optionally disable @plugin parsing\n if (additionalData && additionalData.disablePluginRule) {\n parsers.plugin = function() {\n var dir = parserInput.$re(/^@plugin?\\s+/);\n if (dir) {\n error('@plugin statements are not allowed when disablePluginRule is set to true');\n }\n }\n }\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n\n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n err = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = err || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) ||\n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index + currentIndex, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index + currentIndex, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w.]+)\\(/);\n if (!name) {\n parserInput.forget();\n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index + currentIndex, fileInfo);\n },\n\n declarationCall: function () {\n let validCall;\n let args;\n const index = parserInput.i;\n\n parserInput.save();\n\n validCall = parserInput.$re(/^[\\w]+\\(/);\n if (!validCall) {\n parserInput.forget();\n return;\n }\n\n validCall = validCall.substring(0, validCall.length - 1);\n\n let rule = this.ruleProperty();\n let value;\n \n if (rule) {\n value = this.value();\n }\n \n if (rule && value) {\n args = [new (tree.Declaration)(rule, value, null, null, parserInput.i + currentIndex, fileInfo, true)];\n }\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(validCall, args, index + currentIndex, fileInfo);\n },\n\n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result,\n // otherwise continue for plain args\n };\n }\n\n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[()'\"])|[^()'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value !== undefined ||\n value instanceof tree.Variable ||\n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index + currentIndex, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index + currentIndex, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index + currentIndex, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index + currentIndex, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index + currentIndex, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n }\n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index + currentIndex, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n let first = true;\n while (!(option = parserInput.$re(/^(!?all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n\n if (!e) {\n break;\n }\n /**\n * @note - This will not catch selectors in pseudos like :is() and :where() because\n * they don't currently parse their contents as selectors.\n */\n if (!first && e.combinator.value) {\n warn('Targeting complex selectors can have unexpected behavior, and this behavior may change in the future.', index)\n }\n\n first = false;\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index + currentIndex, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n let parensIndex;\n let parensWS = false;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n parensIndex = parserInput.i;\n if (parserInput.$char('(')) {\n parensWS = parserInput.isWhitespace(-2);\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n if (parensWS) {\n warn('Whitespace between a mixin name and parentheses for a mixin call is deprecated', parensIndex, 'DEPRECATED');\n }\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (inValue && !lookups && !hasParens) {\n // This isn't a valid in-value mixin call\n parserInput.restore();\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index + currentIndex, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n if (!hasParens) {\n warn('Calling a mixin without parentheses is deprecated', parensIndex, 'DEPRECATED');\n }\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n\n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex + currentIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n\n ruleLookups: function() {\n let rule;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') {\n return;\n }\n\n while (true) {\n parserInput.save();\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n\n lookupValue: function() {\n parserInput.save();\n\n if (!parserInput.$char('[')) {\n parserInput.restore();\n return;\n }\n\n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n\n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n }\n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n\n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n /** \n * A Selector Element\n *\n * div\n * + h1\n * #socks\n * input[type=\"text\"]\n *\n * Elements are the building blocks for Selectors,\n * they are made out of a `Combinator` (see combinator rule),\n * and an element name, such as a tag a class, or `*`.\n */\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n /** This selector parser is quite simplistic and will pass a number of invalid selectors. */\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n // eslint-disable-next-line no-control-regex\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false))) {\n let selectors = [];\n while (parserInput.$char(',')) {\n selectors.push(v);\n selectors.push(new Anonymous(','));\n v = this.selector(false);\n }\n selectors.push(v);\n \n if (parserInput.$char(')')) {\n if (selectors.length > 1) {\n e = new (tree.Paren)(new Selector(selectors));\n } else {\n e = new(tree.Paren)(v);\n }\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index + currentIndex, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (Array.isArray(e)){\n e.forEach(ele => elements.push(ele));\n } if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index + currentIndex, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error('Guards are only currently allowed on a single selector.');\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error('Guards are only currently allowed on a single selector.');\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n //\n // case-insensitive flag\n // e.g. [attr operator value i]\n //\n let cif;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n if (val) {\n cif = parserInput.$re(/^[iIsS]/);\n }\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val, cif);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not\n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n if (parserInput.$char(';')) {\n value = new Anonymous('');\n } else {\n value = this.permissiveValue(/[;}]/, true);\n }\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index + currentIndex, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n /**\n * As a last resort, try permissiveValue\n *\n * @todo - This has created some knock-on problems of not\n * flagging incorrect syntax or detecting user intent.\n */\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index + currentIndex, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@$+/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index + currentIndex);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n *\n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n * \n * @param {RexExp} untilTokens - Characters to stop parsing at\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n if (parserInput.peek(',')) {\n value.push(new (tree.Anonymous)(',', parserInput.i));\n parserInput.$char(',');\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n /** @type {string} */\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n const variableRegex = /@([\\w-]+)/g;\n const propRegex = /\\$([\\w-]+)/g;\n if (variableRegex.test(item)) {\n warn('@[ident] in unknown values will not be evaluated as variables in the future. Use @{[ident]}', index, 'DEPRECATED');\n }\n if (propRegex.test(item)) {\n warn('$[ident] in unknown values will not be evaluated as property references in the future. Use ${[ident]}', index, 'DEPRECATED');\n }\n quote.variableRegex = /@([\\w-]+)|@{([\\w-]+)}/g;\n quote.propRegex = /\\$([\\w-]+)|\\${([\\w-]+)}/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures({});\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index + currentIndex, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function (syntaxOptions) {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n let rangeP;\n let spacing = false;\n parserInput.save();\n do {\n parserInput.save();\n if (parserInput.$re(/^[0-9a-z-]*\\s+\\(/)) {\n spacing = true;\n }\n parserInput.restore();\n\n e = entities.declarationCall.bind(this)() || entities.keyword() || entities.variable() || entities.mixinLookup()\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n parserInput.save();\n if (!p && syntaxOptions.queryInParens && parserInput.$re(/^[0-9a-z-]*\\s*([<>]=|<=|>=|[<>]|=)/)) {\n parserInput.restore();\n p = this.condition();\n\n parserInput.save();\n rangeP = this.atomicCondition(null, p.rvalue);\n if (!rangeP) {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n e = this.value();\n }\n if (parserInput.$char(')')) {\n if (p && !e) {\n nodes.push(new (tree.Paren)(new (tree.QueryInParens)(p.op, p.lvalue, p.rvalue, rangeP ? rangeP.op : null, rangeP ? rangeP.rvalue : null, p._index)));\t\t\t\t \n e = p;\n } else if (p && e) {\n nodes.push(new (tree.Paren)(new (tree.Declaration)(p, e, null, null, parserInput.i + currentIndex, fileInfo, true)));\n if (!spacing) {\n nodes[nodes.length - 1].noSpacing = true;\n }\n spacing = false;\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n spacing = false;\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function (syntaxOptions) {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature(syntaxOptions);\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n else if (!features[features.length - 1].noSpacing) {\n features[features.length - 1].noSpacing = false;\n }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n else if (!features[features.length - 1].noSpacing) {\n features[features.length - 1].noSpacing = false;\n }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n prepareAndGetNestableAtRule: function (treeType, index, debugInfo, syntaxOptions) {\n const features = this.mediaFeatures(syntaxOptions);\n\n const rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n const atRule = new (treeType)(rules, features, index + currentIndex, fileInfo);\n if (context.dumpLineNumbers) {\n atRule.debugInfo = debugInfo;\n }\n\n return atRule;\n },\n\n nestableAtRule: function () {\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n parserInput.save();\n\n if (parserInput.$peekChar('@')) {\n if (parserInput.$str('@media')) {\n return this.prepareAndGetNestableAtRule(tree.Media, index, debugInfo, MediaSyntaxOptions);\n }\n \n if (parserInput.$str('@container')) {\n return this.prepareAndGetNestableAtRule(tree.Container, index, debugInfo, ContainerSyntaxOptions);\n }\n }\n \n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index + currentIndex, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else {\n parserInput.restore();\n return null;\n }\n },\n atruleUnknown: function (value, name, hasBlock) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(''.concat(name, ' rule is missing block or ending semi-colon'));\n }\n }\n else if (!value.value) {\n value = null;\n }\n return [value, hasBlock];\n },\n atruleBlock: function (rules, value, isRooted, isKeywordList) {\n rules = this.blockRuleset();\n parserInput.save();\n if (!rules && !isRooted) {\n value = this.entity();\n rules = this.blockRuleset();\n }\n if (!rules && !isRooted) {\n parserInput.restore();\n var e = [];\n value = this.entity();\n while (parserInput.$char(',')) {\n e.push(value);\n value = this.entity();\n }\n if (value && e.length > 0) {\n e.push(value);\n value = e;\n isKeywordList = true;\n }\n else {\n rules = this.blockRuleset();\n }\n }\n else {\n parserInput.forget();\n }\n \n return [rules, value, isKeywordList];\n },\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n let isKeywordList = false;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.nestableAtRule();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n case '@starting-style':\n isRooted = false;\n break;\n case '@layer':\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n const unknownPackage = this.atruleUnknown(value, name, hasBlock);\n value = unknownPackage[0];\n hasBlock = unknownPackage[1];\n }\n \n if (hasBlock) {\n let blockPackage = this.atruleBlock(rules, value, isRooted, isKeywordList);\n rules = blockPackage[0];\n value = blockPackage[1];\n isKeywordList = blockPackage[2];\n\n if (!rules && !hasUnknown) {\n parserInput.restore();\n name = parserInput.$re(/^@[a-z-]+/);\n const unknownPackage = this.atruleUnknown(value, name, hasBlock);\n value = unknownPackage[0];\n hasBlock = unknownPackage[1];\n if (hasBlock) {\n blockPackage = this.atruleBlock(rules, value, isRooted, isKeywordList);\n rules = blockPackage[0];\n value = blockPackage[1];\n isKeywordList = blockPackage[2];\n }\n }\n }\n\n if (rules || isKeywordList || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index + currentIndex, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index + currentIndex);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n colorOperand: function () {\n parserInput.save();\n \n // hsl or rgb or lch operand\n const match = parserInput.$re(/^[lchrgbs]\\s+/);\n if (match) {\n return new tree.Keyword(match[0]);\n }\n\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*');\n if (!op) {\n let index = parserInput.i;\n op = parserInput.$str('./');\n if (op) {\n warn('./ operator is deprecated', index, 'DEPRECATED');\n }\n }\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index + currentIndex);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens, preparsedCond) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n const cond = (function() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }).bind(this)\n\n if (preparsedCond) {\n a = preparsedCond;\n } else {\n a = cond();\n }\n\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index + currentIndex, false);\n } else {\n error('expected expression');\n }\n } else if (!preparsedCond) {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index + currentIndex, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@$(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n this.colorOperand() || entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e && !e.isLineComment) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index + currentIndex));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k] + currentIndex, fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k] + currentIndex, fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\nimport * as utils from '../utils';\nimport Parser from '../parser/parser';\n\nconst Selector = function(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n};\n\nSelector.prototype = Object.assign(new Node(), {\n type: 'Selector',\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (!utils.isNullOrUndefined(evaldCondition)) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n },\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n new Parser(this.parse.context, this.parse.importManager, this._fileInfo, this._index).parseNode(\n els,\n ['selector'],\n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n },\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n },\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n },\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v.value.value || v.value);\n }).join('').match(/[,*.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n },\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n },\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(function (e) { return e.eval(context); });\n extendList = extendList && extendList.map(function(extend) { return extend.eval(context); });\n\n return this.createDerived(elements, extendList, evaldCondition);\n },\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n },\n\n getIsOutput() {\n return this.evaldCondition;\n }\n});\n\nexport default Selector;\n","import Node from './node';\n\nconst Value = function(value) {\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n};\n\nValue.prototype = Object.assign(new Node(), {\n type: 'Value',\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n },\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n },\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n});\n\nexport default Value;\n","import Node from './node';\n\nconst Keyword = function(value) {\n this.value = value;\n};\n\nKeyword.prototype = Object.assign(new Node(), {\n type: 'Keyword',\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n});\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nconst Declaration = function(name, value, important, merge, index, currentFileInfo, inline, variable) {\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n};\n\nDeclaration.prototype = Object.assign(new Node(), {\n type: 'Declaration',\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n },\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n },\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n});\n\nexport default Declaration;","function asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n}\n\nfunction asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '/';\n }\n return `\\\\${a}`;\n })}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n}\n\nfunction debugInfo(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = asComment(ctx);\n break;\n case 'mediaquery':\n result = asMediaQuery(ctx);\n break;\n case 'all':\n result = asComment(ctx) + (lineSeparator || '') + asMediaQuery(ctx);\n break;\n }\n }\n return result;\n}\n\nexport default debugInfo;\n\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nconst Comment = function(value, isLineComment, index, currentFileInfo) {\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n}\n\nComment.prototype = Object.assign(new Node(), {\n type: 'Comment',\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n },\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n});\n\nexport default Comment;\n","import Keyword from '../tree/keyword';\nimport * as utils from '../utils';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (!utils.isNullOrUndefined(v)) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\nimport Parser from '../parser/parser';\n\nconst Ruleset = function(selectors, rules, strictImports, visibilityInfo) {\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n}\n\nRuleset.prototype = Object.assign(new Node(), {\n type: 'Ruleset',\n isRuleset: true,\n\n isRulesetLike() { return true; },\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n eval(context) {\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (let j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n const startingIndex = selectors[0].getIndex();\n const selectorFileInfo = selectors[0].fileInfo();\n new Parser(context, this.parse.importManager, selectorFileInfo, startingIndex).parseNode(\n toParseSelectors.join(','),\n ['selectors'],\n function(err, result) {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n }(context.frames)).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (let j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n },\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n },\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n },\n\n matchArgs(args) {\n return !args || args.length === 0;\n },\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n },\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n },\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n // eslint-disable-next-line no-prototype-builtins\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n },\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n },\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n },\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n new Parser(this.parse.context, this.parse.importManager, decl.fileInfo(), decl.value.getIndex()).parseNode(\n decl.value.value,\n ['value', 'important'],\n function(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function(n) {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n },\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n },\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n },\n\n find(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (rule) {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n },\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n },\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n },\n\n joinSelector(paths, context, selector) {\n\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen, j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element, selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n return selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i, sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector !== null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n});\n\nexport default Ruleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nconst Unit = function(numerator, denominator, backupUnit) {\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n};\n\nUnit.prototype = Object.assign(new Node(), {\n type: 'Unit',\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n },\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n },\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n },\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n },\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n },\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n },\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n },\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n },\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n },\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n // eslint-disable-next-line no-prototype-builtins\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n // eslint-disable-next-line no-prototype-builtins\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n },\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n // eslint-disable-next-line no-prototype-builtins\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n});\n\nexport default Unit;\n","/* eslint-disable no-prototype-builtins */\nimport Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nconst Dimension = function(value, unit) {\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n};\n\nDimension.prototype = Object.assign(new Node(), {\n type: 'Dimension',\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n },\n\n // remove when Nodes have JSDoc types\n // eslint-disable-next-line no-unused-vars\n eval(context) {\n return this;\n },\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n },\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n },\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value);\n let unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error('Incompatible units. Change the units or use the unit function. '\n + `Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n },\n\n compare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n },\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n },\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n});\n\nexport default Dimension;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport Anonymous from './anonymous';\n\nconst Expression = function(value, noSpacing) {\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n};\n\nExpression.prototype = Object.assign(new Node(), {\n type: 'Expression',\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n },\n\n eval(context) {\n const noSpacing = this.noSpacing;\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen\n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n returnValue.noSpacing = returnValue.noSpacing || noSpacing;\n return returnValue;\n },\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n if (i + 1 < this.value.length && !(this.value[i + 1] instanceof Anonymous) ||\n this.value[i + 1] instanceof Anonymous && this.value[i + 1].value !== ',') {\n output.add(' ');\n }\n }\n }\n },\n\n throwAwayComments() {\n this.value = this.value.filter(function(v) {\n return !(v instanceof Comment);\n });\n }\n});\n\nexport default Expression;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport * as utils from '../utils';\n\nconst NestableAtRulePrototype = {\n\n isRulesetLike() {\n return true;\n },\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n evalFunction: function () {\n if (!this.features || !Array.isArray(this.features.value) || this.features.value.length < 1) {\n return;\n }\n\n const exprValues = this.features.value;\n let expr, paren;\n\n for (let index = 0; index < exprValues.length; ++index) {\n expr = exprValues[index];\n\n if (expr.type === 'Keyword' && index + 1 < exprValues.length && (expr.noSpacing || expr.noSpacing == null)) {\n paren = exprValues[index + 1];\n \n if (paren.type === 'Paren' && paren.noSpacing) {\n exprValues[index]= new Expression([expr, paren]);\n exprValues.splice(index + 1, 1);\n exprValues[index].noSpacing = true;\n }\n }\n }\n },\n\n evalTop(context) {\n this.evalFunction();\n\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n },\n\n evalNested(context) {\n this.evalFunction();\n\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n if (path[i].type !== this.type) { \n context.mediaBlocks.splice(i, 1); \n \n return this; \n }\n \n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n },\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n },\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n};\n\nexport default NestableAtRulePrototype;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport NestableAtRulePrototype from './nested-at-rule';\n\nconst AtRule = function(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n) {\n let i;\n var selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n const allDeclarations = this.declarationsBlock(rules);\n \n let allRulesetDeclarations = true;\n rules.forEach(rule => {\n if (rule.type === 'Ruleset' && rule.rules) allRulesetDeclarations = allRulesetDeclarations && this.declarationsBlock(rule.rules, true);\n });\n\n if (allDeclarations && !isRooted) {\n this.simpleBlock = true;\n this.declarations = rules;\n } else if (allRulesetDeclarations && rules.length === 1 && !isRooted && !value) {\n this.simpleBlock = true;\n this.declarations = rules[0].rules ? rules[0].rules : rules;\n } else {\n this.rules = rules;\n }\n } else {\n const allDeclarations = this.declarationsBlock(rules.rules);\n \n if (allDeclarations && !isRooted && !value) {\n this.simpleBlock = true;\n this.declarations = rules.rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n }\n if (!this.simpleBlock) {\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n }\n this.setParent(selectors, this);\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nAtRule.prototype = Object.assign(new Node(), {\n type: 'AtRule',\n\n ...NestableAtRulePrototype,\n\n declarationsBlock(rules, mergeable = false) {\n if (!mergeable) {\n return rules.filter(function (node) { return (node.type === 'Declaration' || node.type === 'Comment') && !node.merge}).length === rules.length;\n } else {\n return rules.filter(function (node) { return (node.type === 'Declaration' || node.type === 'Comment'); }).length === rules.length;\n }\n },\n\n keywordList(rules) {\n if (!Array.isArray(rules)) {\n return false;\n } else { \n return rules.filter(function (node) { return (node.type === 'Keyword' || node.type === 'Comment'); }).length === rules.length;\n }\n },\n\n accept(visitor) {\n const value = this.value, rules = this.rules, declarations = this.declarations;\n\n if (rules) {\n this.rules = visitor.visitArray(rules);\n } else if (declarations) {\n this.declarations = visitor.visitArray(declarations); \n }\n if (value) {\n this.value = visitor.visit(value);\n }\n },\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n },\n\n isCharset() {\n return '@charset' === this.name;\n },\n\n genCSS(context, output) {\n const value = this.value, rules = this.rules || this.declarations;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (this.simpleBlock) {\n this.outputRuleset(context, output, this.declarations);\n } else if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n },\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules || this.declarations;\n \n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n if (value.value && this.keywordList(value.value)) {\n value = new Anonymous(value.value.map(keyword => keyword.value).join(', '), this.getIndex(), this.fileInfo());\n }\n }\n\n if (rules) {\n rules = this.evalRoot(context, rules);\n }\n if (Array.isArray(rules) && rules[0].rules && Array.isArray(rules[0].rules) && rules[0].rules.length) {\n const allMergeableDeclarations = this.declarationsBlock(rules[0].rules, true);\n if (allMergeableDeclarations && !this.isRooted && !value) {\n var mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n mergeRules(rules[0].rules);\n rules = rules[0].rules;\n rules.forEach(rule => rule.merge = false);\n }\n }\n if (this.simpleBlock && rules) {\n rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n rules = rules.map(function (rule) { return rule.eval(context); });\n }\n\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n return new AtRule(this.name, value, rules, this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n },\n\n evalRoot(context, rules) {\n let ampersandCount = 0;\n let noAmpersandCount = 0;\n let noAmpersands = true;\n let allAmpersands = false;\n\n if (!this.simpleBlock) {\n rules = [rules[0].eval(context)];\n }\n\n let precedingSelectors = [];\n if (context.frames.length > 0) {\n for (let index = 0; index < context.frames.length; index++) {\n const frame = context.frames[index];\n if (\n frame.type === 'Ruleset' &&\n frame.rules &&\n frame.rules.length > 0\n ) {\n if (frame && !frame.root && frame.selectors && frame.selectors.length > 0) {\n precedingSelectors = precedingSelectors.concat(frame.selectors);\n }\n }\n if (precedingSelectors.length > 0) {\n let value = '';\n const output = { add: function (s) { value += s; } };\n for (let i = 0; i < precedingSelectors.length; i++) {\n precedingSelectors[i].genCSS(context, output);\n }\n if (/^&+$/.test(value.replace(/\\s+/g, ''))) {\n noAmpersands = false;\n noAmpersandCount++;\n } else {\n allAmpersands = false;\n ampersandCount++;\n }\n }\n }\n }\n\n const mixedAmpersands = ampersandCount > 0 && noAmpersandCount > 0 && !allAmpersands && !noAmpersands;\n if (\n (this.isRooted && ampersandCount > 0 && noAmpersandCount === 0 && !allAmpersands && noAmpersands)\n || !mixedAmpersands\n ) {\n rules[0].root = true;\n }\n return rules;\n },\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n },\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\n },\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n },\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n});\n\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nconst DetachedRuleset = function(ruleset, frames) {\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n};\n\nDetachedRuleset.prototype = Object.assign(new Node(), {\n type: 'DetachedRuleset',\n evalFirst: true,\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n },\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n },\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n});\n\nexport default DetachedRuleset;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nconst Operation = function(op, operands, isSpaced) {\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n};\n\nOperation.prototype = Object.assign(new Node(), {\n type: 'Operation',\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n },\n\n eval(context) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate || !b.operate) {\n if (\n (a instanceof Operation || b instanceof Operation)\n && a.op === '/' && context.math === MATH.PARENS_DIVISION\n ) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n },\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n});\n\nexport default Operation;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n // https://github.com/less/less.js/issues/3616\n if (item.parens && subNodes[0].op === '/') {\n return item;\n }\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\n\n//\n// A function call node.\n//\nconst Call = function(name, args, index, currentFileInfo) {\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nCall.prototype = Object.assign(new Node(), {\n type: 'Call',\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n },\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n // eslint-disable-next-line no-prototype-builtins\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n },\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n});\n\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nconst Variable = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nVariable.prototype = Object.assign(new Node(), {\n type: 'Variable',\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nconst Property = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nProperty.prototype = Object.assign(new Node(), {\n type: 'Property',\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Property;\n","import Node from './node';\n\nconst Attribute = function(key, op, value, cif) {\n this.key = key;\n this.op = op;\n this.value = value;\n this.cif = cif;\n}\n\nAttribute.prototype = Object.assign(new Node(), {\n type: 'Attribute',\n\n eval(context) {\n return new Attribute(\n this.key.eval ? this.key.eval(context) : this.key,\n this.op,\n (this.value && this.value.eval) ? this.value.eval(context) : this.value,\n this.cif\n );\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n if (this.cif) {\n value = value + ' ' + this.cif;\n }\n\n return `[${value}]`;\n }\n});\n\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\nconst Quoted = function(str, content, escaped, index, currentFileInfo) {\n this.escaped = (escaped === undefined) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n};\n\nQuoted.prototype = Object.assign(new Node(), {\n type: 'Quoted',\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n },\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n },\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = function (_, name1, name2) {\n const v = new Variable(`@${name1 ?? name2}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name1, name2) {\n const v = new Property(`$${name1 ?? name2}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n },\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n});\n\nexport default Quoted;\n","import Node from './node';\n\nfunction escapePath(path) {\n return path.replace(/[()'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nconst URL = function(val, index, currentFileInfo, isEvald) {\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n};\n\nURL.prototype = Object.assign(new Node(), {\n type: 'Url',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n});\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport AtRule from './atrule';\nimport NestableAtRulePrototype from './nested-at-rule';\n\nconst Media = function(value, features, index, currentFileInfo, visibilityInfo) {\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n};\n\nMedia.prototype = Object.assign(new AtRule(), {\n type: 'Media',\n\n ...NestableAtRulePrototype,\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n },\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n }\n});\n\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\nimport Expression from './expression';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nconst Import = function(path, features, options, index, currentFileInfo, visibilityInfo) {\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#.&?]css([?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n};\n\nImport.prototype = Object.assign(new Node(), {\n type: 'Import',\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n },\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n },\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n },\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n },\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n },\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n },\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n },\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.features) {\n let featureValue = this.features.value;\n if (Array.isArray(featureValue) && featureValue.length >= 1) {\n const expr = featureValue[0];\n if (expr.type === 'Expression' && Array.isArray(expr.value) && expr.value.length >= 2) {\n featureValue = expr.value;\n const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'\n && featureValue[1].type === 'Paren';\n if (isLayer) {\n this.css = false;\n }\n }\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css || this.layerCss) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (this.layerCss) {\n newImport.css = this.layerCss;\n newImport.path._fileInfo = this._fileInfo;\n }\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n if (this.features) {\n let featureValue = this.features.value;\n if (Array.isArray(featureValue) && featureValue.length === 1) {\n const expr = featureValue[0];\n if (expr.type === 'Expression' && Array.isArray(expr.value) && expr.value.length >= 2) {\n featureValue = expr.value;\n const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'\n && featureValue[1].type === 'Paren';\n if (isLayer) {\n this.layerCss = true;\n featureValue[0] = new Expression(featureValue.slice(0, 2));\n featureValue.splice(1, 1);\n featureValue[0].noSpacing = true;\n return this;\n }\n }\n }\n }\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n if (this.features) {\n let featureValue = this.features.value;\n if (Array.isArray(featureValue) && featureValue.length >= 1) {\n featureValue = featureValue[0].value;\n if (Array.isArray(featureValue) && featureValue.length >= 2) {\n const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'\n && featureValue[1].type === 'Paren';\n if (isLayer) {\n this.css = true;\n featureValue[0] = new Expression(featureValue.slice(0, 2));\n featureValue.splice(1, 1);\n featureValue[0].noSpacing = true;\n return this;\n }\n }\n }\n }\n return [];\n }\n }\n});\n\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nconst JsEvalNode = function() {};\n\nJsEvalNode.prototype = Object.assign(new Node(), {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n // eslint-disable-next-line no-prototype-builtins\n if (variables.hasOwnProperty(k)) {\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n },\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n});\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nconst JavaScript = function(string, escaped, index, currentFileInfo) {\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nJavaScript.prototype = Object.assign(new JsEvalNode(), {\n type: 'JavaScript',\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n});\n\nexport default JavaScript;\n","import Node from './node';\n\nconst Assignment = function(key, val) {\n this.key = key;\n this.value = val;\n}\n\nAssignment.prototype = Object.assign(new Node(), {\n type: 'Assignment',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n },\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n});\n\nexport default Assignment;\n","import Node from './node';\n\nconst Condition = function(op, l, r, i, negate) {\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n};\n\nCondition.prototype = Object.assign(new Node(), {\n type: 'Condition',\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n },\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n});\n\nexport default Condition;\n","import { copy } from 'copy-anything';\nimport Declaration from './declaration';\nimport Node from './node';\n\nconst QueryInParens = function (op, l, m, op2, r, i) {\n this.op = op.trim();\n this.lvalue = l;\n this.mvalue = m;\n this.op2 = op2 ? op2.trim() : null;\n this.rvalue = r;\n this._index = i;\n this.mvalues = [];\n};\n\nQueryInParens.prototype = Object.assign(new Node(), {\n type: 'QueryInParens',\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.mvalue = visitor.visit(this.mvalue);\n if (this.rvalue) {\n this.rvalue = visitor.visit(this.rvalue);\n }\n },\n\n eval(context) {\n this.lvalue = this.lvalue.eval(context);\n \n let variableDeclaration;\n let rule;\n\n for (let i = 0; (rule = context.frames[i]); i++) {\n if (rule.type === 'Ruleset') {\n variableDeclaration = rule.rules.find(function (r) {\n if ((r instanceof Declaration) && r.variable) {\n return true;\n }\n\n return false;\n });\n \n if (variableDeclaration) {\n break;\n }\n }\n }\n\n if (!this.mvalueCopy) {\n this.mvalueCopy = copy(this.mvalue);\n }\n \n if (variableDeclaration) {\n this.mvalue = this.mvalueCopy;\n this.mvalue = this.mvalue.eval(context);\n this.mvalues.push(this.mvalue);\n } else {\n this.mvalue = this.mvalue.eval(context);\n }\n\n if (this.rvalue) {\n this.rvalue = this.rvalue.eval(context);\n }\n return this;\n },\n\n genCSS(context, output) {\n this.lvalue.genCSS(context, output);\n output.add(' ' + this.op + ' ');\n if (this.mvalues.length > 0) {\n this.mvalue = this.mvalues.shift();\n }\n this.mvalue.genCSS(context, output);\n if (this.rvalue) {\n output.add(' ' + this.op2 + ' ');\n this.rvalue.genCSS(context, output);\n }\n },\n});\n\nexport default QueryInParens;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport AtRule from './atrule';\nimport NestableAtRulePrototype from './nested-at-rule';\n\nconst Container = function(value, features, index, currentFileInfo, visibilityInfo) {\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n};\n\nContainer.prototype = Object.assign(new AtRule(), {\n type: 'Container',\n\n ...NestableAtRulePrototype,\n\n genCSS(context, output) {\n output.add('@container ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n },\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Container(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n }\n});\n\nexport default Container;\n","import Node from './node';\n\nconst UnicodeDescriptor = function(value) {\n this.value = value;\n}\n\nUnicodeDescriptor.prototype = Object.assign(new Node(), {\n type: 'UnicodeDescriptor'\n})\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nconst Negative = function(node) {\n this.value = node;\n};\n\nNegative.prototype = Object.assign(new Node(), {\n type: 'Negative',\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n },\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n});\n\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nconst Extend = function(selector, option, index, currentFileInfo, visibilityInfo) {\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case '!all':\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n};\n\nExtend.prototype = Object.assign(new Node(), {\n type: 'Extend',\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n },\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n // remove when Nodes have JSDoc types\n // eslint-disable-next-line no-unused-vars\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n});\n\nExtend.next_id = 0;\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nconst VariableCall = function(variable, index, currentFileInfo) {\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n};\n\nVariableCall.prototype = Object.assign(new Node(), {\n type: 'VariableCall',\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n});\n\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nconst NamespaceValue = function(ruleCall, lookups, index, fileInfo) {\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n};\n\nNamespaceValue.prototype = Object.assign(new Node(), {\n type: 'NamespaceValue',\n\n eval(context) {\n let i, name, rules = this.value.eval(context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n});\n\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nconst Definition = function(name, params, rules, condition, variadic, frames, visibilityInfo) {\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nDefinition.prototype = Object.assign(new Ruleset(), {\n type: 'MixinDefinition',\n evalFirst: true,\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n },\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n },\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n },\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n },\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n },\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n});\n\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nconst MixinCall = function(elements, args, index, currentFileInfo, important) {\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n};\n\nMixinCall.prototype = Object.assign(new Node(), {\n type: 'MixinCall',\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n },\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n },\n\n _setVisibilityToReplacement(replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n },\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n});\n\nexport default MixinCall;\n","import Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport QueryInParens from './query-in-parens';\nimport Paren from './paren';\nimport Media from './media';\nimport Container from './container';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, Container, QueryInParens, \n UnicodeDescriptor, Negative, Extend, VariableCall, \n NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlParts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n /**\n * Helper function, not part of API.\n * This should be replaceable by newer Node / Browser APIs\n * \n * @param {string} url \n * @param {string} baseUrl\n */\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^/?#]*\\/)|([/\\\\]))?((?:[^/\\\\?#]*[/\\\\])*)([^/\\\\?#]*)([#?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager;\n","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = function() {\n return null;\n }\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false;\n\nfunction isdefined(context, variable) {\n try {\n variable.eval(context);\n return Keyword.True;\n } catch (e) {\n return Keyword.False;\n }\n}\n\nisdefined.evalArgs = false;\n\nexport default { isdefined, boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport Expression from '../tree/expression';\nimport Operation from '../tree/operation';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 128 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Expression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n // eslint-disable-next-line no-prototype-builtins\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Comment from '../tree/comment';\nimport Node from '../tree/node';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\nimport Value from '../tree/value';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...expr) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n const tryEval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset).rules;\n } else if (list.rules) {\n iterator = list.rules.map(tryEval);\n } else if (Array.isArray(list)) {\n iterator = list.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element('', '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element('', '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit === null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n // eslint-disable-next-line no-prototype-builtins\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n continue;\n } else {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(a => { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n try {\n return minMax.call(this, true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax.call(this, false, args);\n } catch (e) {}\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import Variable from '../tree/variable';\nimport Anonymous from '../tree/variable';\n\nconst styleExpression = function (args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n \n const entityList = [new Variable(args[0].value, this.index, this.currentFileInfo).eval(this.context)];\n \n args = entityList.map(a => { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n \n return new Anonymous(`style(${args})`);\n};\n\nexport default {\n style: function(...args) {\n try {\n return styleExpression.call(this, args);\n } catch (e) {}\n },\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\nimport style from './style';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n functionRegistry.addMultiple(style);\n\n return functions;\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default () => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += `${gradientType}Gradient>`;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default function(root, options) {\n options = options || {};\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(function (k) {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (let i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (let i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n}\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","'use strict';\n\nfunction parseNodeVersion(version) {\n var match = version.match(/^v(\\d{1,2})\\.(\\d{1,2})\\.(\\d{1,2})(?:-([0-9A-Za-z-.]+))?(?:\\+([0-9A-Za-z-.]+))?$/); // eslint-disable-line max-len\n if (!match) {\n throw new Error('Unable to parse: ' + version);\n }\n\n var res = {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n patch: parseInt(match[3], 10),\n pre: match[4] || '',\n build: match[5] || '',\n };\n\n return res;\n}\n\nmodule.exports = parseNodeVersion;\n","import AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nconst FileManager = function() {}\nFileManager.prototype = Object.assign(new AbstractFileManager(), {\n alwaysMakePathsAbsolute() {\n return true;\n },\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n },\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n },\n\n supports() {\n return true;\n },\n\n clearFileCache() {\n fileCache = {};\n },\n\n loadFile(filename, currentDirectory, options) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n});\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import Environment from './environment/environment';\nimport data from './data';\nimport tree from './tree';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport functions from './functions';\nimport contexts from './contexts';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\nimport SourceMapOutput from './source-map-output';\nimport SourceMapBuilder from './source-map-builder';\nimport ParseTree from './parse-tree';\nimport ImportManager from './import-manager';\nimport Parse from './parse';\nimport Render from './render';\nimport { version } from '../../package.json';\nimport parseVersion from 'parse-node-version';\n\nexport default function(environment, fileManagers) {\n let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n environment = new Environment(environment, fileManagers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(sourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse(environment, parseTree, importManager);\n\n const v = parseVersion(`v${version}`);\n const initial = {\n version: [v.major, v.minor, v.patch],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n\n const ctor = function(t) {\n return function() {\n const obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.slice.call(arguments, 0));\n return obj;\n };\n };\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n}\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default function(SourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n result.imports = [];\n for (const file in this.imports.files) {\n if (Object.prototype.hasOwnProperty.call(this.imports.files, file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n return result;\n }\n }\n\n return ParseTree;\n}\n","export default function (SourceMapOutput, environment) {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n}\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n /** \n * ignore empty content, or failsafe\n * if contents map is incorrect\n */\n if (inputSource === undefined) {\n this._css.push(chunk);\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n // eslint-disable-next-line no-prototype-builtins\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n}\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n // same name as they used to do before this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n // import (multiple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[resolvedFilename]\n && !importManager.files[resolvedFilename].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n}\n","import * as utils from './utils';\n\nexport default function(environment, ParseTree) {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n render.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, function(err, root, imports, options) {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n}\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, function (e, root) {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n}\n","/**\n * @todo Add tests for browser `@plugin`\n */\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nconst PluginLoader = function(less) {\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n};\n\nPluginLoader.prototype = Object.assign(new AbstractPluginLoader(), {\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n});\n\nexport default PluginLoader;\n\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '{content}';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `
in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:
`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
Stack Trace${e.stack.split('\\n').slice(1).join('
')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole() {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (Object.prototype.hasOwnProperty.call(window.less, key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default function() {\n return {\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n}","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n /**\n * @todo remove when this is typed with JSDoc\n */\n // eslint-disable-next-line no-unused-vars\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || '{}'; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","Object","prototype","hasOwnProperty","call","JSON","parse","_","browser","document","styles","sheet","id","concat","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","logger$1","error","msg","this","_fireEvent","warn","info","debug","addListener","listener","_listeners","push","removeListener","i_1","splice","type","i_2","logFunction","Environment","externalEnvironment","fileManagers","requiredFunctions","functions","propName","environmentFunc","bind","getFileManager","filename","currentDirectory","environment","isSync","logger","undefined","pluginManager","getFileManagers","fileManager","addFileManager","clearFileManagers","colors","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","unitConversions","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math","PI","deg","grad","turn","data","Node","parent","visibilityBlocks","nodeVisible","rootNode","parsed","defineProperty","get","fileInfo","getIndex","setParent","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","isRulesetLike","toCSS","context","strs","genCSS","add","chunk","index","isEmpty","join","output","value","accept","visitor","visit","eval","_operate","op","a","b","fround","precision","numPrecision","Number","toFixed","compare","numericCompare","blocksVisibility","addVisibilityBlock","removeVisibilityBlock","ensureVisibility","ensureInvisibility","isVisible","visibilityInfo","copyVisibilityInfo","Color","rgb","originalForm","self","match","map","c","i","parseInt","alpha","split","clamp","v","max","min","toHex","round","toString","assign","luma","r","g","pow","doNotCompress","color","colorFunction","compress","args","indexOf","toHSL","h","l","toRGB","splitcolor","operate","other","d","toHSV","toARGB","x","fromKeyword","keyword","key","toLowerCase","slice","__assign","t","n","arguments","p","apply","SuppressedError","Paren","paren","noSpacing","_noSpaceCombinators"," ","|","Combinator","emptyOrWhitespace","trim","spaceOrEmpty","Element","combinator","isVariable","currentFileInfo","clone","firstSelector","charAt","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getType","payload","copy","target","item","constructor","getPrototypeOf","getOwnPropertyNames","getOwnPropertySymbols","reduce","carry","props","includes","newVal","originalObject","includeNonenumerable","propType","propertyIsEnumerable","enumerable","writable","configurable","assignProp","nonenumerable","getLocation","inputStream","line","column","copyArray","arr","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","isNullOrUndefined","val","anonymousFunc","LessError","fileContentMap","currentFilename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","create","F","isWarning","_a","stylize","str","type_1","errorTxt","substr","_visitArgs","visitDeeper","_hasIndexed","_noop","Visitor","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","tree","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","visitArray","nonReplacing","out","evald","flatten","nestedCnt","j","nestedItem","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","test","isPathLocalRelative","Eval","frames","importantScope","enterCalc","calcStack","inCalc","exitCalc","pop","inParenthesis","parensStack","outOfParenthesis","mathOn","isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePath","segment","segments","reverse","ImportSequencer","onSequencerEmpty","imports","variableImports","_onSequencerEmpty","_currentDepth","addImport","callback","importSequencer","importItem","isReady","tryRun","addVariableImport","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","root","isFinished","visitImport","importNode","inlineCSS","inline","css","utils.copyArray","importParent","isVariableImport","processImportNode","evaldImportNode","evalForImport","multiple","importMultiple","tryAppendLessExtension","rules","onImported","sequencedOnImported","getPath","importedAtRoot","fullPath","importVisitor","isPlugin","isOptional","optional","duplicateImport","skip","importedFilename","oldContext","visitDeclaration","declNode","unshift","visitDeclarationOut","shift","visitAtRule","atRuleNode","declarations","isRooted","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","SetTreeVisibilityVisitor","visible","ExtendFinderVisitor","allExtendsStack","allExtends","extend","extendList","allSelectorsExtendList","ruleCnt","Extend","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","findSelfSelectors","ruleset","firstExtendOnThisSelectorPath","selectors","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","filter","hasFoundMatches","parent_ids","selector","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","newSelector","targetExtend","newExtend","extendsToAdd","extendVisitor","object_id","selfSelectors","findMatch","selfSelector","extendSelector","option","extendChainCount","selectorOne","selectorTwo","ruleNode","visitSelector","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","elements","potentialMatches","allowBefore","matched","initialCombinator","isElementValuesEqual","finished","allowAfter","endPathIndex","endPathElementIndex","elementValue1","elementValue2","Attribute","Selector","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","createDerived","newAllExtends","lastIndex","JoinSelectorVisitor","getIsOutput","joinSelectors","multiMedia","CSSVisitorUtils","_context","containsSilentNonBlockedChild","bodyRules","rule","isSilent","keepOnlyVisibleChilds","owner","thing","hasVisibleSelector","resolveVisibility","compiledRulesBody","isVisibleRuleset","firstRoot","ToCSSVisitor","utils","variable","mixinNode","visitExtend","extendNode","visitComment","commentNode","originalRules","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","_mergeRules","name","charset","debugInfo","comment","Comment","checkValidNodes","isRoot","Declaration","Call","allowRoot","rulesets","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","ruleList","ruleCache","ruleCSS","groups","groupsArr","i_3","merge","group","result_1","space_1","comma_1","Expression","important","Value","visitors","MarkVisibleSelectorsVisitor","ExtendVisitor","getParserInput","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","isLineComment","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$peekChar","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","quote","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","len","level","parenLevel","emitFrom","emitChunk","force","String","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","functionRegistry","makeRegistry","base","_data","addMultiple","_this","keys","getLocalFunctions","inherit","MediaSyntaxOptions","queryInParens","ContainerSyntaxOptions","Anonymous","mapLines","rulesetLike","Boolean","Parser","currentIndex","parsers","quiet","toUpperCase","expect","arg","expectChar","getDebugInfo","lineNumber","fileName","parseNode","parseList","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","err","preText","disablePluginRule","plugin","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","Ruleset","primary","endInfo","processImports","mixin","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","k","customFuncCall","stop","declarationCall","validCall","substring","ruleProperty","f","ieAlpha","boolean","condition","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","detachedRuleset","assignment","expression","literal","dimension","unicodeDescriptor","entity","url","property","Variable","Property","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","lookups","inValue","ruleLookups","VariableCall","NamespaceValue","isRule","first","element","getLookup","hasParens","parensIndex","parensWS","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expand","returner","variadic","expressions","hasSep","throwAwayComments","cond","params","argInfo","conditions","block","lookupValue","Quoted","attribute","slashedCombinator","isLess","when","ele","cif","content","blockRuleset","Definition","DetachedRuleset","dumpLineNumbers","strictImports","hasDR","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","variableRegex","propRegex","import","features","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","syntaxOptions","rangeP","spacing","atomicCondition","rvalue","lvalue","prepareAndGetNestableAtRule","treeType","atRule","nestableAtRule","Media","Container","pluginArgs","atruleUnknown","hasBlock","atruleBlock","isKeywordList","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","unknownPackage","blockPackage","sub","addition","parens","colorOperand","Keyword","multiplication","operation","isSpaced","operand","parensInOp","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","negate","body","me","tryConditionFollowedByParenthesis","preparsedCond","delim","simpleProperty","vars","name_1","evaldCondition","getElements","mixinElements_","utils.isNullOrUndefined","mediaEmpty","els","importManager","createEmptySelectors","el","sels","olen","mixinElements","isJustParentSelector","True","False","MATH","asComment","ctx","asMediaQuery","filenameWithProtocol","lineSeparator","lastRule","prevMath","evaldValue","mathBypass","evalName","importantResult","makeImportant","isCompressed","defaultFunc","value_","error_","reset","_lookups","_variables","_properties","isRuleset","selCnt","hasVariable","hasOnePassingSelector","toParseSelectors","startingIndex","selectorFileInfo","utils.flattenArray","subRule","originalRuleset","allowImports","globalFunctionRegistry","ctxFrames","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","resetCache","bubbleSelectors","importRules","matchArgs","matchCondition","lastSelector","_rulesets","variables","hash","properties","name_2","decl","parseValue","lastDeclaration","toParse","transformDeclaration","nodes_1","filtRules","prependRule","find","foundMixins","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","currentElements","newSelectors","selectorsMultiplied","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","Unit","numerator","denominator","backupUnit","sort","strictUnits","returnStr","is","unitString","isLength","RegExp","isSingular","usedUnits","mapUnit","groupName","atomicUnit","cancel","counter","count","Dimension","unit","parseFloat","isNaN","toColor","strValue","convertTo","unify","conversions","targetUnit","applyUnit","derivedConversions","returnValue","doubleParen","NestableAtRulePrototype","evalFunction","expr","exprValues","evalTop","mediaPath","evalNested","permute","fragment","rest","AtRule","allDeclarations","declarationsBlock","allRulesetDeclarations_1","simpleBlock","mergeable","keywordList","outputRuleset","mediaPathBackup","mediaBlocksBackup","evalRoot","mergeRules","less","ampersandCount","noAmpersandCount","noAmpersands","allAmpersands","precedingSelectors","frame","value_1","mixedAmpersands","callEval","Operation","operands","functionCaller","isValid","evalArgs","commentFilter","subNodes","to","from","pack","ar","__spreadArray","calc","currentMathContext","funcCaller","FunctionCaller","columnNumber","evaluating","fun","vArr","escaped","containsVariables","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","name1","name2","URL","isEvald","urlArgs","Import","pathValue","reference","evalPath","doEval","registry","featureValue","layerCss","newImport","JsEvalNode","evaluateJavaScript","evalContext","javascriptEnabled","jsify","toJS","JavaScript","string","Assignment","Condition","QueryInParens","op2","mvalue","mvalues","variableDeclaration","mvalueCopy","UnicodeDescriptor","Negative","next_id","selectorElements","selfElements","ruleCall","arity","optionalParameters","required","evalParams","mixinEnv","evaldArguments","varargs","isNamedFound","argIndex","argsLength","evalCall","_arguments","mixinFrames","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixinPath","argValue","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","MixinDefinition","format","newRules","_setVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","tryAppendExtension","ext","supportsSync","alwaysMakePathsAbsolute","isPathAbsolute","basePath","laterPath","pathDiff","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","rawDirectories","rawPath","fileUrl","AbstractPluginLoader","require","evalPlugin","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","validatePlugin","minVersion","compareVersion","addPlugin","setOptions","version","versionToString","aVersion","bVersion","versionString","printUsage","plugins","If","trueValue","falseValue","isdefined","colorFunctions","boolean$1","hsla","origColor","hsl","number","rgba","size","m1","m2","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","argb","tint","shade","colorBlend","mode","cb","cs","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","list","_SELF","~","_i","values","range","step","stepValue","each","rs","iterator","tryEval","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","types","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","styleExpression","style$1","style","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","transformTree","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","isPreEvalVisitor","isPreVisitor","pm","PluginManager","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","addPlugins","install","addVisitor","addPreProcessor","preProcessor","priority","indexToInsertAt","addPostProcessor","postProcessor","manager","getPostProcessors","getVisitors","PluginManagerFactory","newFactory","parseNodeVersion_1","major","minor","patch","pre","build","lessRoot","sourceMapOutput","sourceMapBuilder","parseTree","SourceMapBuilder","ParseTree","toCSSOptions","sourceMap","file_1","getExternalSourceMap","files","rootFilename","SourceMapOutput","contentsIgnoredCharsMap","contentsMap","sourceMapFilename","sourceMapURL","outputFilename","sourceMapOutputFilename","sourceMapBasepath","sourceMapRootpath","outputSourceFiles","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","normalizeFilename","removeBasepath","getCSSAppendage","setExternalSourceMap","isInline","getSourceMapURL","getOutputFilename","getInputFilename","_css","_rootNode","_contentsMap","_contentsIgnoredCharsMap","_sourceMapFilename","_outputFilename","_sourceMapBasepath","_sourceMapRootpath","_outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","file","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","ImportManager","rootFileInfo","mime","queue","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","newEnv","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","parseVersion","initial","ctor","api","fileCache","doXHR","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","supports","clearFileCache","location","useFileCache","lessText_1","webInfo","lastModified","Date","FM","log","fulfill","catch","ErrorReporting","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","loggers","console","LogListener","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":";;;;;;;;;qOACM,SAAUA,EAAUC,GACtB,OAAOA,EAAKC,QAAQ,qBAAsB,IACrCA,QAAQ,qBAAsB,IAC9BA,QAAQ,MAAO,IACfA,QAAQ,eAAgB,IACxBA,QAAQ,YAAa,KACrBA,QAAQ,MAAO,KAGR,SAAAC,EAAYC,EAASC,GACjC,GAAKA,EACL,IAAK,IAAMC,KAAOD,EAAIE,QAClB,GAAIC,OAAOC,UAAUC,eAAeC,KAAKN,EAAIE,QAASD,GAClD,GAAY,QAARA,GAAyB,oBAARA,GAAqC,aAARA,GAA8B,mBAARA,EACpEF,EAAQE,GAAOD,EAAIE,QAAQD,QAE3B,IACIF,EAAQE,GAAOM,KAAKC,MAAMR,EAAIE,QAAQD,IAE1C,MAAOQ,KClBR,IAAAC,EACA,SAAUC,EAAUC,EAAQC,GAEnC,IAAMjB,EAAOiB,EAAMjB,MAAQ,GAGrBkB,EAAK,QAAQC,OAAAF,EAAMG,OAASC,EAAgBrB,IAG5CsB,EAAeP,EAASQ,eAAeL,GACzCM,GAAmB,EAGjBC,EAAYV,EAASW,cAAc,SACzCD,EAAUE,aAAa,OAAQ,YAC3BV,EAAMW,OACNH,EAAUE,aAAa,QAASV,EAAMW,OAE1CH,EAAUP,GAAKA,EAEVO,EAAUI,aACXJ,EAAUK,YAAYf,EAASgB,eAAef,IAG9CQ,EAAqC,OAAjBF,GAAyBA,EAAaU,WAAWC,OAAS,GAAKR,EAAUO,WAAWC,OAAS,GAC7GX,EAAaY,WAAWC,YAAcV,EAAUS,WAAWC,WAGnE,IAAMC,EAAOrB,EAASsB,qBAAqB,QAAQ,GAInD,GAAqB,OAAjBf,IAA8C,IAArBE,EAA4B,CACrD,IAAMc,EAASrB,GAASA,EAAMsB,aAAe,KACzCD,EACAA,EAAOE,WAAWC,aAAahB,EAAWa,GAE1CF,EAAKN,YAAYL,GAUzB,GAPIH,IAAqC,IAArBE,GAChBF,EAAakB,WAAWE,YAAYpB,GAMpCG,EAAUI,WACV,IACIJ,EAAUI,WAAWc,QAAU3B,EACjC,MAAO4B,GACL,MAAM,IAAIC,MAAM,2CAnDjB/B,EAuDI,SAASgC,GACpB,IAEUC,EAFJhC,EAAW+B,EAAO/B,SACxB,OAAOA,EAASiC,gBACND,EAAUhC,EAASsB,qBAAqB,WAC/BU,EAAQd,OAAS,IC7D7BgB,EAAA,CACXC,MAAO,SAASC,GACZC,KAAKC,WAAW,QAASF,IAE7BG,KAAM,SAASH,GACXC,KAAKC,WAAW,OAAQF,IAE5BI,KAAM,SAASJ,GACXC,KAAKC,WAAW,OAAQF,IAE5BK,MAAO,SAASL,GACZC,KAAKC,WAAW,QAASF,IAE7BM,YAAa,SAASC,GAClBN,KAAKO,WAAWC,KAAKF,IAEzBG,eAAgB,SAASH,GACrB,IAAK,IAAII,EAAI,EAAGA,EAAIV,KAAKO,WAAW1B,OAAQ6B,IACxC,GAAIV,KAAKO,WAAWG,KAAOJ,EAEvB,YADAN,KAAKO,WAAWI,OAAOD,EAAG,IAKtCT,WAAY,SAASW,EAAMb,GACvB,IAAK,IAAIc,EAAI,EAAGA,EAAIb,KAAKO,WAAW1B,OAAQgC,IAAK,CAC7C,IAAMC,EAAcd,KAAKO,WAAWM,GAAGD,GACnCE,GACAA,EAAYf,KAIxBQ,WAAY,ICzBhBQ,EAAA,WACI,SAAYA,EAAAC,EAAqBC,GAC7BjB,KAAKiB,aAAeA,GAAgB,GACpCD,EAAsBA,GAAuB,GAM7C,IAJA,IACME,EAAoB,GACpBC,EAAYD,EAAkBnD,OAFV,CAAC,eAAgB,aAAc,gBAAiB,0BAIjE2C,EAAI,EAAGA,EAAIS,EAAUtC,OAAQ6B,IAAK,CACvC,IAAMU,EAAWD,EAAUT,GACrBW,EAAkBL,EAAoBI,GACxCC,EACArB,KAAKoB,GAAYC,EAAgBC,KAAKN,GAC/BN,EAAIQ,EAAkBrC,QAC7BmB,KAAKE,KAAK,qDAA8CkB,KAkCxE,OA7BIL,EAAc3D,UAAAmE,eAAd,SAAeC,EAAUC,EAAkB1E,EAAS2E,EAAaC,GAExDH,GACDI,EAAO1B,KAAK,uFAES2B,IAArBJ,GACAG,EAAO1B,KAAK,qFAGhB,IAAIe,EAAejB,KAAKiB,aACpBlE,EAAQ+E,gBACRb,EAAe,GAAGlD,OAAOkD,GAAclD,OAAOhB,EAAQ+E,cAAcC,oBAExE,IAAK,IAAIlB,EAAII,EAAapC,OAAS,EAAGgC,GAAK,EAAIA,IAAK,CAChD,IAAMmB,EAAcf,EAAaJ,GACjC,GAAImB,EAAYL,EAAS,eAAiB,YAAYH,EAAUC,EAAkB1E,EAAS2E,GACvF,OAAOM,EAGf,OAAO,MAGXjB,EAAc3D,UAAA6E,eAAd,SAAeD,GACXhC,KAAKiB,aAAaT,KAAKwB,IAG3BjB,EAAA3D,UAAA8E,kBAAA,WACIlC,KAAKiB,aAAe,IAE3BF,KCxDcoB,EAAA,CACXC,UAAY,UACZC,aAAe,UACfC,KAAO,UACPC,WAAa,UACbC,MAAQ,UACRC,MAAQ,UACRC,OAAS,UACTC,MAAQ,UACRC,eAAiB,UACjBC,KAAO,UACPC,WAAa,UACbC,MAAQ,UACRC,UAAY,UACZC,UAAY,UACZC,WAAa,UACbC,UAAY,UACZC,MAAQ,UACRC,eAAiB,UACjBC,SAAW,UACXC,QAAU,UACVC,KAAO,UACPC,SAAW,UACXC,SAAW,UACXC,cAAgB,UAChBC,SAAW,UACXC,SAAW,UACXC,UAAY,UACZC,UAAY,UACZC,YAAc,UACdC,eAAiB,UACjBC,WAAa,UACbC,WAAa,UACbC,QAAU,UACVC,WAAa,UACbC,aAAe,UACfC,cAAgB,UAChBC,cAAgB,UAChBC,cAAgB,UAChBC,cAAgB,UAChBC,WAAa,UACbC,SAAW,UACXC,YAAc,UACdC,QAAU,UACVC,QAAU,UACVC,WAAa,UACbC,UAAY,UACZC,YAAc,UACdC,YAAc,UACdC,QAAU,UACVC,UAAY,UACZC,WAAa,UACbC,KAAO,UACPC,UAAY,UACZC,KAAO,UACPC,KAAO,UACPC,MAAQ,UACRC,YAAc,UACdC,SAAW,UACXC,QAAU,UACVC,UAAY,UACZC,OAAS,UACTC,MAAQ,UACRC,MAAQ,UACRC,SAAW,UACXC,cAAgB,UAChBC,UAAY,UACZC,aAAe,UACfC,UAAY,UACZC,WAAa,UACbC,UAAY,UACZC,qBAAuB,UACvBC,UAAY,UACZC,UAAY,UACZC,WAAa,UACbC,UAAY,UACZC,YAAc,UACdC,cAAgB,UAChBC,aAAe,UACfC,eAAiB,UACjBC,eAAiB,UACjBC,eAAiB,UACjBC,YAAc,UACdC,KAAO,UACPC,UAAY,UACZC,MAAQ,UACRC,QAAU,UACVC,OAAS,UACTC,iBAAmB,UACnBC,WAAa,UACbC,aAAe,UACfC,aAAe,UACfC,eAAiB,UACjBC,gBAAkB,UAClBC,kBAAoB,UACpBC,gBAAkB,UAClBC,gBAAkB,UAClBC,aAAe,UACfC,UAAY,UACZC,UAAY,UACZC,SAAW,UACXC,YAAc,UACdC,KAAO,UACPC,QAAU,UACVC,MAAQ,UACRC,UAAY,UACZC,OAAS,UACTC,UAAY,UACZC,OAAS,UACTC,cAAgB,UAChBC,UAAY,UACZC,cAAgB,UAChBC,cAAgB,UAChBC,WAAa,UACbC,UAAY,UACZC,KAAO,UACPC,KAAO,UACPC,KAAO,UACPC,WAAa,UACbC,OAAS,UACTC,cAAgB,UAChBC,IAAM,UACNC,UAAY,UACZC,UAAY,UACZC,YAAc,UACdC,OAAS,UACTC,WAAa,UACbC,SAAW,UACXC,SAAW,UACXC,OAAS,UACTC,OAAS,UACTC,QAAU,UACVC,UAAY,UACZC,UAAY,UACZC,UAAY,UACZC,KAAO,UACPC,YAAc,UACdC,UAAY,UACZC,IAAM,UACNC,KAAO,UACPC,QAAU,UACVC,OAAS,UACTC,UAAY,UACZC,OAAS,UACTC,MAAQ,UACRC,MAAQ,UACRC,WAAa,UACbC,OAAS,UACTC,YAAc,WCpJHC,EAAA,CACX3M,OAAQ,CACJ4M,EAAK,EACLC,GAAM,IACNC,GAAM,KACNC,GAAM,MACNC,GAAM,MAAS,GACfC,GAAM,MAAS,GACfC,GAAM,MAAS,GAAK,IAExBC,SAAU,CACNC,EAAK,EACLC,GAAM,MAEVC,MAAO,CACHC,IAAO,GAAK,EAAIC,KAAKC,IACrBC,IAAO,EAAI,IACXC,KAAQ,EAAI,IACZC,KAAQ,ICfDC,EAAA,CAAEvK,OAAMA,EAAEqJ,gBAAeA,GCGxCmB,EAAA,WACI,SAAAA,IACI3M,KAAK4M,OAAS,KACd5M,KAAK6M,sBAAmBhL,EACxB7B,KAAK8M,iBAAcjL,EACnB7B,KAAK+M,SAAW,KAChB/M,KAAKgN,OAAS,KA2KtB,OAxKI7P,OAAA8P,eAAIN,EAAevP,UAAA,kBAAA,CAAnB8P,IAAA,WACI,OAAOlN,KAAKmN,4CAGhBhQ,OAAA8P,eAAIN,EAAKvP,UAAA,QAAA,CAAT8P,IAAA,WACI,OAAOlN,KAAKoN,4CAGhBT,EAAAvP,UAAAiQ,UAAA,SAAUC,EAAOV,GACb,SAASW,EAAIC,GACLA,GAAQA,aAAgBb,IACxBa,EAAKZ,OAASA,GAGlBa,MAAMC,QAAQJ,GACdA,EAAMK,QAAQJ,GAGdA,EAAID,IAIZX,EAAAvP,UAAAgQ,SAAA,WACI,OAAOpN,KAAK4N,QAAW5N,KAAK4M,QAAU5M,KAAK4M,OAAOQ,YAAe,GAGrET,EAAAvP,UAAA+P,SAAA,WACI,OAAOnN,KAAK6N,WAAc7N,KAAK4M,QAAU5M,KAAK4M,OAAOO,YAAe,IAGxER,EAAAvP,UAAA0Q,cAAA,WAAkB,OAAO,GAEzBnB,EAAKvP,UAAA2Q,MAAL,SAAMC,GACF,IAAMC,EAAO,GAWb,OAVAjO,KAAKkO,OAAOF,EAAS,CAGjBG,IAAK,SAASC,EAAOjB,EAAUkB,GAC3BJ,EAAKzN,KAAK4N,IAEdE,QAAS,WACL,OAAuB,IAAhBL,EAAKpP,UAGboP,EAAKM,KAAK,KAGrB5B,EAAAvP,UAAA8Q,OAAA,SAAOF,EAASQ,GACZA,EAAOL,IAAInO,KAAKyO,QAGpB9B,EAAMvP,UAAAsR,OAAN,SAAOC,GACH3O,KAAKyO,MAAQE,EAAQC,MAAM5O,KAAKyO,QAGpC9B,EAAAvP,UAAAyR,KAAA,WAAS,OAAO7O,MAEhB2M,EAAQvP,UAAA0R,SAAR,SAASd,EAASe,EAAIC,EAAGC,GACrB,OAAQF,GACJ,IAAK,IAAK,OAAOC,EAAIC,EACrB,IAAK,IAAK,OAAOD,EAAIC,EACrB,IAAK,IAAK,OAAOD,EAAIC,EACrB,IAAK,IAAK,OAAOD,EAAIC,IAI7BtC,EAAAvP,UAAA8R,OAAA,SAAOlB,EAASS,GACZ,IAAMU,EAAYnB,GAAWA,EAAQoB,aAErC,OAAO,EAAcC,QAAQZ,EAAQ,OAAOa,QAAQH,IAAcV,GAG/D9B,EAAA4C,QAAP,SAAeP,EAAGC,GAOd,GAAKD,EAAS,SAGG,WAAXC,EAAErO,MAAgC,cAAXqO,EAAErO,KAC3B,OAAOoO,EAAEO,QAAQN,GACd,GAAIA,EAAEM,QACT,OAAQN,EAAEM,QAAQP,GACf,GAAIA,EAAEpO,OAASqO,EAAErO,KAAjB,CAMP,GAFAoO,EAAIA,EAAEP,MACNQ,EAAIA,EAAER,OACDhB,MAAMC,QAAQsB,GACf,OAAOA,IAAMC,EAAI,OAAIpN,EAEzB,GAAImN,EAAEnQ,SAAWoQ,EAAEpQ,OAAnB,CAGA,IAAK,IAAI6B,EAAI,EAAGA,EAAIsO,EAAEnQ,OAAQ6B,IAC1B,GAAiC,IAA7BiM,EAAK4C,QAAQP,EAAEtO,GAAIuO,EAAEvO,IACrB,OAGR,OAAO,KAGJiM,EAAA6C,eAAP,SAAsBR,EAAGC,GACrB,OAAOD,EAAMC,GAAK,EACZD,IAAMC,EAAK,EACPD,EAAMC,EAAK,OAAIpN,GAI7B8K,EAAAvP,UAAAqS,iBAAA,WAII,YAH8B5N,IAA1B7B,KAAK6M,mBACL7M,KAAK6M,iBAAmB,GAEK,IAA1B7M,KAAK6M,kBAGhBF,EAAAvP,UAAAsS,mBAAA,gBACkC7N,IAA1B7B,KAAK6M,mBACL7M,KAAK6M,iBAAmB,GAE5B7M,KAAK6M,iBAAmB7M,KAAK6M,iBAAmB,GAGpDF,EAAAvP,UAAAuS,sBAAA,gBACkC9N,IAA1B7B,KAAK6M,mBACL7M,KAAK6M,iBAAmB,GAE5B7M,KAAK6M,iBAAmB7M,KAAK6M,iBAAmB,GAKpDF,EAAAvP,UAAAwS,iBAAA,WACI5P,KAAK8M,aAAc,GAKvBH,EAAAvP,UAAAyS,mBAAA,WACI7P,KAAK8M,aAAc,GAOvBH,EAAAvP,UAAA0S,UAAA,WACI,OAAO9P,KAAK8M,aAGhBH,EAAAvP,UAAA2S,eAAA,WACI,MAAO,CACHlD,iBAAkB7M,KAAK6M,iBACvBC,YAAa9M,KAAK8M,cAI1BH,EAAkBvP,UAAA4S,mBAAlB,SAAmB7P,GACVA,IAGLH,KAAK6M,iBAAmB1M,EAAK0M,iBAC7B7M,KAAK8M,YAAc3M,EAAK2M,cAE/BH,KCjLKsD,EAAQ,SAASC,EAAKlB,EAAGmB,GAC3B,IAAMC,EAAOpQ,KAOTyN,MAAMC,QAAQwC,GACdlQ,KAAKkQ,IAAMA,EACJA,EAAIrR,QAAU,GACrBmB,KAAKkQ,IAAM,GACXA,EAAIG,MAAM,SAASC,KAAI,SAAUC,EAAGC,GAC5BA,EAAI,EACJJ,EAAKF,IAAI1P,KAAKiQ,SAASF,EAAG,KAE1BH,EAAKM,MAASD,SAASF,EAAG,IAAO,SAIzCvQ,KAAKkQ,IAAM,GACXA,EAAIS,MAAM,IAAIL,KAAI,SAAUC,EAAGC,GACvBA,EAAI,EACJJ,EAAKF,IAAI1P,KAAKiQ,SAASF,EAAIA,EAAG,KAE9BH,EAAKM,MAASD,SAASF,EAAIA,EAAG,IAAO,QAIjDvQ,KAAK0Q,MAAQ1Q,KAAK0Q,QAAuB,iBAAN1B,EAAiBA,EAAI,QAC5B,IAAjBmB,IACPnQ,KAAKyO,MAAQ0B,IAgMrB,SAASS,EAAMC,EAAGC,GACd,OAAOzE,KAAK0E,IAAI1E,KAAKyE,IAAID,EAAG,GAAIC,GAGpC,SAASE,EAAMH,GACX,MAAO,WAAIA,EAAEP,KAAI,SAAUC,GAEvB,QADAA,EAAIK,EAAMvE,KAAK4E,MAAMV,GAAI,MACb,GAAK,IAAM,IAAMA,EAAEW,SAAS,OACzC3C,KAAK,KApMZ0B,EAAM7S,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CACxC/L,KAAM,QAENwQ,KAAI,WACA,IAAIC,EAAIrR,KAAKkQ,IAAI,GAAK,IAAKoB,EAAItR,KAAKkQ,IAAI,GAAK,IAAKjB,EAAIjP,KAAKkQ,IAAI,GAAK,IAMpE,MAAO,OAJPmB,EAAKA,GAAK,OAAWA,EAAI,MAAQhF,KAAKkF,KAAMF,EAAI,MAAS,MAAQ,MAI7C,OAHpBC,EAAKA,GAAK,OAAWA,EAAI,MAAQjF,KAAKkF,KAAMD,EAAI,MAAS,MAAQ,MAGhC,OAFjCrC,EAAKA,GAAK,OAAWA,EAAI,MAAQ5C,KAAKkF,KAAMtC,EAAI,MAAS,MAAQ,OAKrEf,OAAM,SAACF,EAASQ,GACZA,EAAOL,IAAInO,KAAK+N,MAAMC,KAG1BD,MAAK,SAACC,EAASwD,GACX,IACIC,EACAf,EACAgB,EAHEC,EAAW3D,GAAWA,EAAQ2D,WAAaH,EAI7CI,EAAO,GAOX,GAFAlB,EAAQ1Q,KAAKkP,OAAOlB,EAAShO,KAAK0Q,OAE9B1Q,KAAKyO,MACL,GAAkC,IAA9BzO,KAAKyO,MAAMoD,QAAQ,OACfnB,EAAQ,IACRgB,EAAgB,YAEjB,CAAA,GAAkC,IAA9B1R,KAAKyO,MAAMoD,QAAQ,OAO1B,OAAO7R,KAAKyO,MALRiD,EADAhB,EAAQ,EACQ,OAEA,WAMpBA,EAAQ,IACRgB,EAAgB,QAIxB,OAAQA,GACJ,IAAK,OACDE,EAAO5R,KAAKkQ,IAAII,KAAI,SAAUC,GAC1B,OAAOK,EAAMvE,KAAK4E,MAAMV,GAAI,QAC7BxS,OAAO6S,EAAMF,EAAO,IACvB,MACJ,IAAK,OACDkB,EAAKpR,KAAKoQ,EAAMF,EAAO,IAE3B,IAAK,MACDe,EAAQzR,KAAK8R,QACbF,EAAO,CACH5R,KAAKkP,OAAOlB,EAASyD,EAAMM,GAC3B,GAAAhU,OAAGiC,KAAKkP,OAAOlB,EAAmB,IAAVyD,EAAMxF,GAAW,KACzC,GAAAlO,OAAGiC,KAAKkP,OAAOlB,EAAmB,IAAVyD,EAAMO,GAAW,MAC3CjU,OAAO6T,GAGjB,GAAIF,EAEA,MAAO,GAAA3T,OAAG2T,EAAiB,KAAA3T,OAAA6T,EAAKrD,KAAK,WAAIoD,EAAW,GAAK,WAK7D,GAFAF,EAAQzR,KAAKiS,QAETN,EAAU,CACV,IAAMO,EAAaT,EAAMd,MAAM,IAG3BuB,EAAW,KAAOA,EAAW,IAAMA,EAAW,KAAOA,EAAW,IAAMA,EAAW,KAAOA,EAAW,KACnGT,EAAQ,IAAI1T,OAAAmU,EAAW,IAAKnU,OAAAmU,EAAW,IAAKnU,OAAAmU,EAAW,KAI/D,OAAOT,GASXU,QAAQ,SAAAnE,EAASe,EAAIqD,GAGjB,IAFA,IAAMlC,EAAM,IAAIzC,MAAM,GAChBiD,EAAQ1Q,KAAK0Q,OAAS,EAAI0B,EAAM1B,OAAS0B,EAAM1B,MAC5CH,EAAI,EAAGA,EAAI,EAAGA,IACnBL,EAAIK,GAAKvQ,KAAK8O,SAASd,EAASe,EAAI/O,KAAKkQ,IAAIK,GAAI6B,EAAMlC,IAAIK,IAE/D,OAAO,IAAIN,EAAMC,EAAKQ,IAG1BuB,MAAK,WACD,OAAOjB,EAAMhR,KAAKkQ,MAGtB4B,MAAK,WACD,IAGIC,EACA9F,EAJEoF,EAAIrR,KAAKkQ,IAAI,GAAK,IAAKoB,EAAItR,KAAKkQ,IAAI,GAAK,IAAKjB,EAAIjP,KAAKkQ,IAAI,GAAK,IAAKlB,EAAIhP,KAAK0Q,MAE9EI,EAAMzE,KAAKyE,IAAIO,EAAGC,EAAGrC,GAAI8B,EAAM1E,KAAK0E,IAAIM,EAAGC,EAAGrC,GAG9C+C,GAAKlB,EAAMC,GAAO,EAClBsB,EAAIvB,EAAMC,EAEhB,GAAID,IAAQC,EACRgB,EAAI9F,EAAI,MACL,CAGH,OAFAA,EAAI+F,EAAI,GAAMK,GAAK,EAAIvB,EAAMC,GAAOsB,GAAKvB,EAAMC,GAEvCD,GACJ,KAAKO,EAAGU,GAAKT,EAAIrC,GAAKoD,GAAKf,EAAIrC,EAAI,EAAI,GAAI,MAC3C,KAAKqC,EAAGS,GAAK9C,EAAIoC,GAAKgB,EAAI,EAAiB,MAC3C,KAAKpD,EAAG8C,GAAKV,EAAIC,GAAKe,EAAI,EAE9BN,GAAK,EAET,MAAO,CAAEA,EAAO,IAAJA,EAAS9F,EAACA,EAAE+F,EAACA,EAAEhD,EAACA,IAIhCsD,MAAK,WACD,IAGIP,EACA9F,EAJEoF,EAAIrR,KAAKkQ,IAAI,GAAK,IAAKoB,EAAItR,KAAKkQ,IAAI,GAAK,IAAKjB,EAAIjP,KAAKkQ,IAAI,GAAK,IAAKlB,EAAIhP,KAAK0Q,MAE9EI,EAAMzE,KAAKyE,IAAIO,EAAGC,EAAGrC,GAAI8B,EAAM1E,KAAK0E,IAAIM,EAAGC,EAAGrC,GAG9C4B,EAAIC,EAEJuB,EAAIvB,EAAMC,EAOhB,GALI9E,EADQ,IAAR6E,EACI,EAEAuB,EAAIvB,EAGRA,IAAQC,EACRgB,EAAI,MACD,CACH,OAAQjB,GACJ,KAAKO,EAAGU,GAAKT,EAAIrC,GAAKoD,GAAKf,EAAIrC,EAAI,EAAI,GAAI,MAC3C,KAAKqC,EAAGS,GAAK9C,EAAIoC,GAAKgB,EAAI,EAAG,MAC7B,KAAKpD,EAAG8C,GAAKV,EAAIC,GAAKe,EAAI,EAE9BN,GAAK,EAET,MAAO,CAAEA,EAAO,IAAJA,EAAS9F,EAACA,EAAE4E,EAACA,EAAE7B,EAACA,IAGhCuD,OAAM,WACF,OAAOvB,EAAM,CAAc,IAAbhR,KAAK0Q,OAAa3S,OAAOiC,KAAKkQ,OAGhDX,iBAAQiD,GACJ,OAAQA,EAAEtC,KACNsC,EAAEtC,IAAI,KAAOlQ,KAAKkQ,IAAI,IACtBsC,EAAEtC,IAAI,KAAOlQ,KAAKkQ,IAAI,IACtBsC,EAAEtC,IAAI,KAAOlQ,KAAKkQ,IAAI,IACtBsC,EAAE9B,QAAW1Q,KAAK0Q,MAAS,OAAI7O,KAI3CoO,EAAMwC,YAAc,SAASC,GACzB,IAAInC,EACEoC,EAAMD,EAAQE,cASpB,GAPIzQ,EAAO9E,eAAesV,GACtBpC,EAAI,IAAIN,EAAM9N,EAAOwQ,GAAKE,MAAM,IAEnB,gBAARF,IACLpC,EAAI,IAAIN,EAAM,CAAC,EAAG,EAAG,GAAI,IAGzBM,EAEA,OADAA,EAAE9B,MAAQiE,EACHnC,GClMR,IAAIuC,EAAW,WAQpB,OAPAA,EAAW3V,OAAOgU,QAAU,SAAkB4B,GAC1C,IAAK,IAAI9G,EAAGuE,EAAI,EAAGwC,EAAIC,UAAUpU,OAAQ2R,EAAIwC,EAAGxC,IAE5C,IAAK,IAAI0C,KADTjH,EAAIgH,UAAUzC,GACOrT,OAAOC,UAAUC,eAAeC,KAAK2O,EAAGiH,KAAIH,EAAEG,GAAKjH,EAAEiH,IAE9E,OAAOH,IAEKI,MAAMnT,KAAMiT,YAgSoB,mBAApBG,iBAAiCA,gBCrU/D,IAAMC,EAAQ,SAAS7F,GACnBxN,KAAKyO,MAAQjB,GAGjB6F,EAAMjW,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CACxC/L,KAAM,QAENsN,OAAM,SAACF,EAASQ,GACZA,EAAOL,IAAI,KACXnO,KAAKyO,MAAMP,OAAOF,EAASQ,GAC3BA,EAAOL,IAAI,MAGfU,cAAKb,GACD,IAAMsF,EAAQ,IAAID,EAAMrT,KAAKyO,MAAMI,KAAKb,IAMxC,OAJIhO,KAAKuT,YACLD,EAAMC,WAAY,GAGfD,KCrBf,IAAME,EAAsB,CACxB,IAAI,EACJC,KAAK,EACLC,KAAK,GAGHC,EAAa,SAASlF,GACV,MAAVA,GACAzO,KAAKyO,MAAQ,IACbzO,KAAK4T,mBAAoB,IAEzB5T,KAAKyO,MAAQA,EAAQA,EAAMoF,OAAS,GACpC7T,KAAK4T,kBAAmC,KAAf5T,KAAKyO,QAItCkF,EAAWvW,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC7C/L,KAAM,aAENsN,OAAM,SAACF,EAASQ,GACZ,IAAMsF,EAAgB9F,EAAQ2D,UAAY6B,EAAoBxT,KAAKyO,OAAU,GAAK,IAClFD,EAAOL,IAAI2F,EAAe9T,KAAKyO,MAAQqF,MClB/C,IAAMC,EAAU,SAASC,EAAYvF,EAAOwF,EAAY5F,EAAO6F,EAAiBnE,GAC5E/P,KAAKgU,WAAaA,aAAsBL,EACpCK,EAAa,IAAIL,EAAWK,GAG5BhU,KAAKyO,MADY,iBAAVA,EACMA,EAAMoF,OACZpF,GAGM,GAEjBzO,KAAKiU,WAAaA,EAClBjU,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,EACjBlU,KAAKgQ,mBAAmBD,GACxB/P,KAAKqN,UAAUrN,KAAKgU,WAAYhU,OAGpC+T,EAAQ3W,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC1C/L,KAAM,UAEN8N,gBAAOC,GACH,IAAMF,EAAQzO,KAAKyO,MACnBzO,KAAKgU,WAAarF,EAAQC,MAAM5O,KAAKgU,YAChB,iBAAVvF,IACPzO,KAAKyO,MAAQE,EAAQC,MAAMH,KAInCI,cAAKb,GACD,OAAO,IAAI+F,EAAQ/T,KAAKgU,WACpBhU,KAAKyO,MAAMI,KAAO7O,KAAKyO,MAAMI,KAAKb,GAAWhO,KAAKyO,MAClDzO,KAAKiU,WACLjU,KAAKoN,WACLpN,KAAKmN,WAAYnN,KAAK+P,mBAG9BoE,MAAK,WACD,OAAO,IAAIJ,EAAQ/T,KAAKgU,WACpBhU,KAAKyO,MACLzO,KAAKiU,WACLjU,KAAKoN,WACLpN,KAAKmN,WAAYnN,KAAK+P,mBAG9B7B,OAAM,SAACF,EAASQ,GACZA,EAAOL,IAAInO,KAAK+N,MAAMC,GAAUhO,KAAKmN,WAAYnN,KAAKoN,aAG1DW,eAAMC,GACFA,EAAUA,GAAW,GACrB,IAAIS,EAAQzO,KAAKyO,MACX2F,EAAgBpG,EAAQoG,cAQ9B,OAPI3F,aAAiB4E,IAGjBrF,EAAQoG,eAAgB,GAE5B3F,EAAQA,EAAMV,MAAQU,EAAMV,MAAMC,GAAWS,EAC7CT,EAAQoG,cAAgBA,EACV,KAAV3F,GAAoD,MAApCzO,KAAKgU,WAAWvF,MAAM4F,OAAO,GACtC,GAEArU,KAAKgU,WAAWjG,MAAMC,GAAWS,KClE7C,IAAMpC,EAAO,CAChBiI,OAAQ,EACRC,gBAAiB,EACjBC,OAAQ,GAICC,EACJ,EADIA,EAEF,EAFEA,EAGJ,ECLT,SAASC,EAAQC,GACb,OAAOxX,OAAOC,UAAU8T,SAAS5T,KAAKqX,GAAS9B,MAAM,GAAI,GA8F7D,SAASnF,EAAQiH,GACb,MAA4B,UAArBD,EAAQC,GC3EnB,SAASC,EAAKC,EAAQ9X,EAAU,IAC5B,GAAI2Q,EAAQmH,GACR,OAAOA,EAAOvE,IAAKwE,GAASF,EAAKE,EAAM/X,IAE3C,GDGyB,WAArB2X,EADeC,ECFAE,IDKZF,EAAQI,cAAgB5X,QAAUA,OAAO6X,eAAeL,KAAaxX,OAAOC,UCJ/E,OAAOyX,EDCf,IAAuBF,ECGnB,MAAO,IAFOxX,OAAO8X,oBAAoBJ,MACzB1X,OAAO+X,sBAAsBL,IACfM,OAAO,CAACC,EAAOzC,KACzC,GAAIjF,EAAQ3Q,EAAQsY,SAAWtY,EAAQsY,MAAMC,SAAS3C,GAClD,OAAOyC,EAKX,OAzCR,SAAoBA,EAAOzC,EAAK4C,EAAQC,EAAgBC,GACpD,MAAMC,EAAW,GAAGC,qBAAqBrY,KAAKkY,EAAgB7C,GACxD,aACA,gBACW,eAAb+C,IACAN,EAAMzC,GAAO4C,GACbE,GAAqC,kBAAbC,GACxBvY,OAAO8P,eAAemI,EAAOzC,EAAK,CAC9BlE,MAAO8G,EACPK,YAAY,EACZC,UAAU,EACVC,cAAc,IA6BlBC,CAAWX,EAAOzC,EADHiC,EADHC,EAAOlC,GACM5V,GACM8X,EAAQ9X,EAAQiZ,eACxCZ,GACR,ICxCS,SAAAa,EAAY5H,EAAO6H,GAK/B,IAJA,IAAIlD,EAAI3E,EAAQ,EACZ8H,EAAO,KACPC,GAAU,IAELpD,GAAK,GAA+B,OAA1BkD,EAAY7B,OAAOrB,IAClCoD,IAOJ,MAJqB,iBAAV/H,IACP8H,GAAQD,EAAYrD,MAAM,EAAGxE,GAAOgC,MAAM,QAAU,IAAIxR,QAGrD,CACHsX,KAAIA,EACJC,OAAMA,GAIR,SAAUC,EAAUC,GACtB,IAAI9F,EACE3R,EAASyX,EAAIzX,OACb+V,EAAO,IAAInH,MAAM5O,GAEvB,IAAK2R,EAAI,EAAGA,EAAI3R,EAAQ2R,IACpBoE,EAAKpE,GAAK8F,EAAI9F,GAElB,OAAOoE,EAGL,SAAUT,EAAMoC,GAClB,IAAMC,EAAS,GACf,IAAK,IAAMC,KAAQF,EACXpZ,OAAOC,UAAUC,eAAeC,KAAKiZ,EAAKE,KAC1CD,EAAOC,GAAQF,EAAIE,IAG3B,OAAOD,EAGK,SAAAE,EAASC,EAAMC,GAC3B,IAAIC,EAASD,GAAQ,GACrB,IAAKA,EAAKE,UAAW,CACjBD,EAAS,GACT,IAAME,EAAWnC,EAAK+B,GACtBE,EAAOC,UAAYC,EACnB,IAAMP,EAASI,EAAOhC,EAAKgC,GAAQ,GACnCzZ,OAAOgU,OAAO0F,EAAQE,EAAUP,GAEpC,OAAOK,EAGK,SAAAG,EAAYL,EAAMC,GAC9B,GAAIA,GAAQA,EAAKE,UACb,OAAOF,EAEX,IAAMK,EAAOP,EAASC,EAAMC,GAQ5B,GAPIK,EAAKC,aACLD,EAAKE,KAAOC,EAAe5C,QAG3ByC,EAAKI,eACLJ,EAAKK,YAAcC,GAEE,iBAAdN,EAAKE,KACZ,OAAQF,EAAKE,KAAKvE,eACd,IAAK,SACDqE,EAAKE,KAAOC,EAAe9C,OAC3B,MACJ,IAAK,kBACD2C,EAAKE,KAAOC,EAAe7C,gBAC3B,MACJ,IAAK,SACL,IAAK,SACD0C,EAAKE,KAAOC,EAAe5C,OAC3B,MACJ,QACIyC,EAAKE,KAAOC,EAAe5C,OAGvC,GAAgC,iBAArByC,EAAKK,YACZ,OAAQL,EAAKK,YAAY1E,eACrB,IAAK,MACDqE,EAAKK,YAAcC,EACnB,MACJ,IAAK,QACDN,EAAKK,YAAcC,EACnB,MACJ,IAAK,MACDN,EAAKK,YAAcC,EAI/B,OAAON,EAYK,SAAAO,EAAalB,EAAKmB,QAAA,IAAAA,IAAAA,EAAW,IACzC,IAAK,IAAI/W,EAAI,EAAGgX,EAASpB,EAAIzX,OAAQ6B,EAAIgX,EAAQhX,IAAK,CAClD,IAAM+N,EAAQ6H,EAAI5V,GACd+M,MAAMC,QAAQe,GACd+I,EAAa/I,EAAOgJ,QAEN5V,IAAV4M,GACAgJ,EAAOjX,KAAKiO,GAIxB,OAAOgJ,EAGL,SAAUE,EAAkBC,GAC9B,OAAOA,MAAAA,uGAxBK,SAAMjB,EAAMC,GACxB,IAAK,IAAMH,KAAQG,EACXzZ,OAAOC,UAAUC,eAAeC,KAAKsZ,EAAMH,KAC3CE,EAAKF,GAAQG,EAAKH,IAG1B,OAAOE,wCCxGLkB,EAAgB,qCAwBhBC,EAAY,SAAStY,EAAGuY,EAAgBC,GAC1CvY,MAAMnC,KAAK0C,MAEX,IAAMwB,EAAWhC,EAAEgC,UAAYwW,EAK/B,GAHAhY,KAAKiY,QAAUzY,EAAEyY,QACjBjY,KAAKkY,MAAQ1Y,EAAE0Y,MAEXH,GAAkBvW,EAAU,CAC5B,IAAM2W,EAAQJ,EAAeK,SAAS5W,GAChC6W,EAAMC,EAAkB9Y,EAAE6O,MAAO8J,GACnChC,EAAOkC,EAAIlC,KACToC,EAAOF,EAAIjC,OACXoC,EAAWhZ,EAAElC,MAAQgb,EAAkB9Y,EAAElC,KAAM6a,GAAOhC,KACtDsC,EAAQN,EAAQA,EAAMxH,MAAM,MAAQ,GAQ1C,GANA3Q,KAAKY,KAAOpB,EAAEoB,MAAQ,SACtBZ,KAAKwB,SAAWA,EAChBxB,KAAKqO,MAAQ7O,EAAE6O,MACfrO,KAAKmW,KAAuB,iBAATA,EAAoBA,EAAO,EAAI,KAClDnW,KAAKoW,OAASmC,GAETvY,KAAKmW,MAAQnW,KAAKkY,MAAO,CAC1B,IAAMQ,EAAQ1Y,KAAKkY,MAAM7H,MAAMwH,GASzBc,EAAO,IAAIC,SAAS,IAAK,qBAC3BC,EAAa,EACjB,IACIF,IACF,MAAOnZ,GACL,IAAM6Q,EAAQ7Q,EAAE0Y,MAAM7H,MAAMwH,GAC5BgB,EAAa,EAAIpI,SAASJ,EAAM,IAGhCqI,IACIA,EAAM,KACN1Y,KAAKmW,KAAO1F,SAASiI,EAAM,IAAMG,GAEjCH,EAAM,KACN1Y,KAAKoW,OAAS3F,SAASiI,EAAM,MAKzC1Y,KAAKwY,SAAWA,EAAW,EAC3BxY,KAAK8Y,YAAcL,EAAMD,GAEzBxY,KAAK+Y,QAAU,CACXN,EAAMzY,KAAKmW,KAAO,GAClBsC,EAAMzY,KAAKmW,KAAO,GAClBsC,EAAMzY,KAAKmW,SAMvB,QAA6B,IAAlBhZ,OAAO6b,OAAwB,CACtC,IAAMC,EAAI,aACVA,EAAE7b,UAAYqC,MAAMrC,UACpB0a,EAAU1a,UAAY,IAAI6b,OAE1BnB,EAAU1a,UAAYD,OAAO6b,OAAOvZ,MAAMrC,WAG9C0a,EAAU1a,UAAU2X,YAAc+C,EASlCA,EAAU1a,UAAU8T,SAAW,SAASnU,SACpCA,EAAUA,GAAW,GACrB,IAAMmc,GAA0B,UAAblZ,KAAKY,YAAQ,IAAAuY,EAAAA,EAAA,IAAIvG,cAAc0C,SAAS,WACrD1U,EAAOsY,EAAYlZ,KAAKY,KAAO,GAAA7C,OAAGiC,KAAKY,cACvC6Q,EAAQyH,EAAY,SAAW,MAEjCjB,EAAU,GACRc,EAAU/Y,KAAK+Y,SAAW,GAC5BjZ,EAAQ,GACRsZ,EAAU,SAAUC,GAAO,OAAOA,GACtC,GAAItc,EAAQqc,QAAS,CACjB,IAAME,SAAcvc,EAAQqc,QAC5B,GAAa,aAATE,EACA,MAAM7Z,MAAM,+CAAA1B,OAA+Cub,EAAI,MAEnEF,EAAUrc,EAAQqc,QAGtB,GAAkB,OAAdpZ,KAAKmW,KAAe,CAKpB,GAJK+C,GAAmC,iBAAfH,EAAQ,IAC7BjZ,EAAMU,KAAK4Y,EAAQ,GAAGrb,OAAAiC,KAAKmW,KAAO,EAAK,KAAApY,OAAAgb,EAAQ,IAAM,SAG/B,iBAAfA,EAAQ,GAAiB,CAChC,IAAIQ,EAAW,GAAAxb,OAAGiC,KAAKmW,UACnB4C,EAAQ,KACRQ,GAAYR,EAAQ,GAAGlG,MAAM,EAAG7S,KAAKoW,QACjCgD,EAAQA,EAAQA,EAAQL,EAAQ,GAAGS,OAAOxZ,KAAKoW,OAAQ,GAAI,QACvD2C,EAAQ,GAAGlG,MAAM7S,KAAKoW,OAAS,GAAI,OAAQ,YAEvDtW,EAAMU,KAAK+Y,GAGVL,GAAmC,iBAAfH,EAAQ,IAC7BjZ,EAAMU,KAAK4Y,EAAQ,GAAGrb,OAAAiC,KAAKmW,KAAO,EAAK,KAAApY,OAAAgb,EAAQ,IAAM,SAEzDjZ,EAAQ,GAAG/B,OAAA+B,EAAMyO,KAAK,MAAQ6K,EAAQ,GAAI,eAkB9C,OAfAnB,GAAWmB,EAAQ,GAAArb,OAAG6C,EAAI,MAAA7C,OAAKiC,KAAKiY,SAAWxG,GAC3CzR,KAAKwB,WACLyW,GAAWmB,EAAQ,OAAQ3H,GAASzR,KAAKwB,UAEzCxB,KAAKmW,OACL8B,GAAWmB,EAAQ,YAAYrb,OAAAiC,KAAKmW,KAAI,aAAApY,OAAYiC,KAAKoW,OAAS,OAAM,SAG5E6B,GAAW,KAAAla,OAAK+B,GAEZE,KAAKwY,WACLP,GAAW,GAAGla,OAAAqb,EAAQ,QAAS3H,IAAUzR,KAAKwB,UAAY,UAC1DyW,GAAW,GAAAla,OAAGqb,EAAQpZ,KAAKwY,SAAU,QAAW,KAAAza,OAAAiC,KAAK8Y,mBAGlDb,GC9JX,IAAMwB,EAAa,CAAEC,aAAa,GAC9BC,GAAc,EAElB,SAASC,EAAMpM,GACX,OAAOA,EA0BX,IAAAqM,EAAA,WACI,SAAAA,EAAYC,GACR9Z,KAAK+Z,gBAAkBD,EACvB9Z,KAAKga,cAAgB,GACrBha,KAAKia,eAAiB,GAEjBN,KA7Bb,SAASO,EAAetN,EAAQuN,GAE5B,IAAIxH,EAAKyH,EACT,IAAKzH,KAAO/F,EAGR,cADAwN,EAAQxN,EAAO+F,KAEX,IAAK,WAGGyH,EAAMhd,WAAagd,EAAMhd,UAAUwD,OACnCwZ,EAAMhd,UAAUid,UAAYF,KAEhC,MACJ,IAAK,SACDA,EAASD,EAAeE,EAAOD,GAK3C,OAAOA,EAUCD,CAAeI,GAAM,GACrBX,GAAc,GA0H1B,OAtHIE,EAAKzc,UAAAwR,MAAL,SAAMpB,GACF,IAAKA,EACD,OAAOA,EAGX,IAAM+M,EAAgB/M,EAAK6M,UAC3B,IAAKE,EAKD,OAHI/M,EAAKiB,OAASjB,EAAKiB,MAAM4L,WACzBra,KAAK4O,MAAMpB,EAAKiB,OAEbjB,EAGX,IAIIgN,EAJEC,EAAOza,KAAK+Z,gBACdpB,EAAO3Y,KAAKga,cAAcO,GAC1BG,EAAU1a,KAAKia,eAAeM,GAC5BI,EAAYlB,EAalB,GAVAkB,EAAUjB,aAAc,EAEnBf,IAEDA,EAAO8B,EADPD,EAAS,QAAQzc,OAAAyP,EAAK5M,QACCgZ,EACvBc,EAAUD,EAAK,GAAA1c,OAAGyc,EAAW,SAAKZ,EAClC5Z,KAAKga,cAAcO,GAAiB5B,EACpC3Y,KAAKia,eAAeM,GAAiBG,GAGrC/B,IAASiB,EAAO,CAChB,IAAMgB,EAAUjC,EAAKrb,KAAKmd,EAAMjN,EAAMmN,GAClCnN,GAAQiN,EAAKI,cACbrN,EAAOoN,GAIf,GAAID,EAAUjB,aAAelM,EACzB,GAAIA,EAAK3O,OACL,IAAK,IAAI6B,EAAI,EAAGoa,EAAMtN,EAAK3O,OAAQ6B,EAAIoa,EAAKpa,IACpC8M,EAAK9M,GAAGgO,QACRlB,EAAK9M,GAAGgO,OAAO1O,WAGhBwN,EAAKkB,QACZlB,EAAKkB,OAAO1O,MAQpB,OAJI0a,GAAWd,GACXc,EAAQpd,KAAKmd,EAAMjN,GAGhBA,GAGXqM,EAAAzc,UAAA2d,WAAA,SAAWzN,EAAO0N,GACd,IAAK1N,EACD,OAAOA,EAGX,IACIkD,EADEsK,EAAMxN,EAAMzO,OAIlB,GAAImc,IAAiBhb,KAAK+Z,gBAAgBc,YAAa,CACnD,IAAKrK,EAAI,EAAGA,EAAIsK,EAAKtK,IACjBxQ,KAAK4O,MAAMtB,EAAMkD,IAErB,OAAOlD,EAIX,IAAM2N,EAAM,GACZ,IAAKzK,EAAI,EAAGA,EAAIsK,EAAKtK,IAAK,CACtB,IAAM0K,EAAQlb,KAAK4O,MAAMtB,EAAMkD,SACjB3O,IAAVqZ,IACCA,EAAMva,OAEAua,EAAMrc,QACbmB,KAAKmb,QAAQD,EAAOD,GAFpBA,EAAIza,KAAK0a,IAKjB,OAAOD,GAGXpB,EAAAzc,UAAA+d,QAAA,SAAQ7E,EAAK2E,GAKT,IAAIH,EAAKtK,EAAGsE,EAAMsG,EAAWC,EAAGC,EAEhC,IANKL,IACDA,EAAM,IAKLzK,EAAI,EAAGsK,EAAMxE,EAAIzX,OAAQ2R,EAAIsK,EAAKtK,IAEnC,QAAa3O,KADbiT,EAAOwB,EAAI9F,IAIX,GAAKsE,EAAKnU,OAKV,IAAK0a,EAAI,EAAGD,EAAYtG,EAAKjW,OAAQwc,EAAID,EAAWC,SAE7BxZ,KADnByZ,EAAaxG,EAAKuG,MAIbC,EAAW3a,OAEL2a,EAAWzc,QAClBmB,KAAKmb,QAAQG,EAAYL,GAFzBA,EAAIza,KAAK8a,SAVbL,EAAIza,KAAKsU,GAiBjB,OAAOmG,GAEdpB,KClKK0B,EAAW,GAIXC,EAAmB,SAA0BC,EAAUC,EAAaC,GACtE,GAAKF,EAEL,IAAK,IAAI/a,EAAI,EAAGA,EAAIib,EAAiB9c,OAAQ6B,IACrCvD,OAAOC,UAAUC,eAAeC,KAAKme,EAAUE,EAAiBjb,MAChEgb,EAAYC,EAAiBjb,IAAM+a,EAASE,EAAiBjb,MAQnEkb,EAAsB,CAExB,QACA,cACA,WACA,gBACA,WACA,kBACA,WACA,aACA,aACA,OACA,eAEA,iBAEA,gBACA,SAGJL,EAASM,MAAQ,SAAS9e,GACtBye,EAAiBze,EAASiD,KAAM4b,GAEN,iBAAf5b,KAAK8b,QAAsB9b,KAAK8b,MAAQ,CAAC9b,KAAK8b,SAG7D,IAAMC,EAAqB,CACvB,QACA,WACA,OACA,cACA,YACA,iBACA,UACA,oBACA,gBACA,iBACA,eAsGJ,SAASC,EAAeC,GACpB,OAAQ,sBAAsBC,KAAKD,GAGvC,SAASE,EAAoBF,GACzB,MAA0B,MAAnBA,EAAK5H,OAAO,GAxGvBkH,EAASa,KAAO,SAASrf,EAASsf,GAC9Bb,EAAiBze,EAASiD,KAAM+b,GAEN,iBAAf/b,KAAK8b,QAAsB9b,KAAK8b,MAAQ,CAAC9b,KAAK8b,QAEzD9b,KAAKqc,OAASA,GAAU,GACxBrc,KAAKsc,eAAiBtc,KAAKsc,gBAAkB,IAGjDf,EAASa,KAAKhf,UAAUmf,UAAY,WAC3Bvc,KAAKwc,YACNxc,KAAKwc,UAAY,IAErBxc,KAAKwc,UAAUhc,MAAK,GACpBR,KAAKyc,QAAS,GAGlBlB,EAASa,KAAKhf,UAAUsf,SAAW,WAC/B1c,KAAKwc,UAAUG,MACV3c,KAAKwc,UAAU3d,SAChBmB,KAAKyc,QAAS,IAItBlB,EAASa,KAAKhf,UAAUwf,cAAgB,WAC/B5c,KAAK6c,cACN7c,KAAK6c,YAAc,IAEvB7c,KAAK6c,YAAYrc,MAAK,IAG1B+a,EAASa,KAAKhf,UAAU0f,iBAAmB,WACvC9c,KAAK6c,YAAYF,OAGrBpB,EAASa,KAAKhf,UAAUqf,QAAS,EACjClB,EAASa,KAAKhf,UAAU2f,QAAS,EACjCxB,EAASa,KAAKhf,UAAU4f,SAAW,SAAUjO,GACzC,QAAK/O,KAAK+c,YAGC,MAAPhO,GAAc/O,KAAKmX,OAASC,EAAe9C,QAAYtU,KAAK6c,aAAgB7c,KAAK6c,YAAYhe,YAG7FmB,KAAKmX,KAAOC,EAAe7C,kBACpBvU,KAAK6c,aAAe7c,KAAK6c,YAAYhe,UAKpD0c,EAASa,KAAKhf,UAAU6f,oBAAsB,SAAUhB,GAGpD,OAFmBjc,KAAKsX,cAAgBC,EAA8B4E,EAAsBH,GAE1EC,IAGtBV,EAASa,KAAKhf,UAAU8f,YAAc,SAAUjB,EAAMkB,GAClD,IAAIC,EAaJ,OAXAD,EAAWA,GAAY,GACvBC,EAAUpd,KAAKqd,cAAcF,EAAWlB,GAIpCE,EAAoBF,IACpBD,EAAemB,KACkB,IAAjChB,EAAoBiB,KACpBA,EAAU,KAAArf,OAAKqf,IAGZA,GAGX7B,EAASa,KAAKhf,UAAUigB,cAAgB,SAAUpB,GAC9C,IACIqB,EADEC,EAAWtB,EAAKtL,MAAM,KAAK6M,UAIjC,IADAvB,EAAO,GACoB,IAApBsB,EAAS1e,QAEZ,OADAye,EAAUC,EAASZ,OAEf,IAAK,IACD,MACJ,IAAK,KACoB,IAAhBV,EAAKpd,QAA4C,OAA1Bod,EAAKA,EAAKpd,OAAS,GAC3Cod,EAAKzb,KAAM8c,GAEXrB,EAAKU,MAET,MACJ,QACIV,EAAKzb,KAAK8c,GAKtB,OAAOrB,EAAK1N,KAAK,MCzJrB,IAAAkP,EAAA,WACI,SAAAA,EAAYC,GACR1d,KAAK2d,QAAU,GACf3d,KAAK4d,gBAAkB,GACvB5d,KAAK6d,kBAAoBH,EACzB1d,KAAK8d,cAAgB,EAgD7B,OA7CIL,EAASrgB,UAAA2gB,UAAT,SAAUC,GACN,IAAMC,EAAkBje,KACpBke,EAAa,CACTF,SAAQA,EACRpM,KAAM,KACNuM,SAAS,GAGjB,OADAne,KAAK2d,QAAQnd,KAAK0d,GACX,WACHA,EAAWtM,KAAOnE,MAAMrQ,UAAUyV,MAAMvV,KAAK2V,UAAW,GACxDiL,EAAWC,SAAU,EACrBF,EAAgBG,WAIxBX,EAAiBrgB,UAAAihB,kBAAjB,SAAkBL,GACdhe,KAAK4d,gBAAgBpd,KAAKwd,IAG9BP,EAAArgB,UAAAghB,OAAA,WACIpe,KAAK8d,gBACL,IACI,OAAa,CACT,KAAO9d,KAAK2d,QAAQ9e,OAAS,GAAG,CAC5B,IAAMqf,EAAale,KAAK2d,QAAQ,GAChC,IAAKO,EAAWC,QACZ,OAEJne,KAAK2d,QAAU3d,KAAK2d,QAAQ9K,MAAM,GAClCqL,EAAWF,SAAS7K,MAAM,KAAM+K,EAAWtM,MAE/C,GAAoC,IAAhC5R,KAAK4d,gBAAgB/e,OACrB,MAEJ,IAAMyf,EAAiBte,KAAK4d,gBAAgB,GAC5C5d,KAAK4d,gBAAkB5d,KAAK4d,gBAAgB/K,MAAM,GAClDyL,KAEE,QACNte,KAAK8d,gBAEkB,IAAvB9d,KAAK8d,eAAuB9d,KAAK6d,mBACjC7d,KAAK6d,qBAGhBJ,KC5CKc,EAAgB,SAASC,EAAUC,GAErCze,KAAK0e,SAAW,IAAI7E,EAAQ7Z,MAC5BA,KAAK2e,UAAYH,EACjBxe,KAAK4e,QAAUH,EACfze,KAAKgO,QAAU,IAAIuN,EAASa,KAC5Bpc,KAAK6e,YAAc,EACnB7e,KAAK8e,qBAAuB,GAC5B9e,KAAK+e,kBAAoB,GACzB/e,KAAKgf,WAAa,IAAIvB,EAAgBzd,KAAK6d,kBAAkBvc,KAAKtB,QAGtEue,EAAcnhB,UAAY,CACtByd,aAAa,EACboE,IAAK,SAAUC,GACX,IAEIlf,KAAK0e,SAAS9P,MAAMsQ,GAExB,MAAO1f,GACHQ,KAAKF,MAAQN,EAGjBQ,KAAKmf,YAAa,EAClBnf,KAAKgf,WAAWZ,UAEpBP,kBAAmB,WACV7d,KAAKmf,YAGVnf,KAAK4e,QAAQ5e,KAAKF,QAEtBsf,YAAa,SAAUC,EAAY1E,GAC/B,IAAM2E,EAAYD,EAAWtiB,QAAQwiB,OAErC,IAAKF,EAAWG,KAAOF,EAAW,CAE9B,IAAMtR,EAAU,IAAIuN,EAASa,KAAKpc,KAAKgO,QAASyR,EAAgBzf,KAAKgO,QAAQqO,SACvEqD,EAAe1R,EAAQqO,OAAO,GAEpCrc,KAAK6e,cACDQ,EAAWM,mBACX3f,KAAKgf,WAAWX,kBAAkBre,KAAK4f,kBAAkBte,KAAKtB,KAAMqf,EAAYrR,EAAS0R,IAEzF1f,KAAK4f,kBAAkBP,EAAYrR,EAAS0R,GAGpD/E,EAAUjB,aAAc,GAE5BkG,kBAAmB,SAASP,EAAYrR,EAAS0R,GAC7C,IAAIG,EACEP,EAAYD,EAAWtiB,QAAQwiB,OAErC,IACIM,EAAkBR,EAAWS,cAAc9R,GAC7C,MAAOxO,GACAA,EAAEgC,WAAYhC,EAAE6O,MAAQgR,EAAWjS,WAAY5N,EAAEgC,SAAW6d,EAAWlS,WAAW3L,UAEvF6d,EAAWG,KAAM,EAEjBH,EAAWvf,MAAQN,EAGvB,IAAIqgB,GAAqBA,EAAgBL,MAAOF,EAqB5Ctf,KAAK6e,cACD7e,KAAKmf,YACLnf,KAAKgf,WAAWZ,aAvBoC,CAEpDyB,EAAgB9iB,QAAQgjB,WACxB/R,EAAQgS,gBAAiB,GAM7B,IAFA,IAAMC,OAAiDpe,IAAxBge,EAAgBL,IAEtC9e,EAAI,EAAGA,EAAIgf,EAAaQ,MAAMrhB,OAAQ6B,IAC3C,GAAIgf,EAAaQ,MAAMxf,KAAO2e,EAAY,CACtCK,EAAaQ,MAAMxf,GAAKmf,EACxB,MAIR,IAAMM,EAAangB,KAAKmgB,WAAW7e,KAAKtB,KAAM6f,EAAiB7R,GAAUoS,EAAsBpgB,KAAKgf,WAAWjB,UAAUoC,GAEzHngB,KAAK2e,UAAUne,KAAKqf,EAAgBQ,UAAWJ,EAAwBJ,EAAgB1S,WACnF0S,EAAgB9iB,QAASqjB,KAQrCD,WAAY,SAAUd,EAAYrR,EAASxO,EAAG0f,EAAMoB,EAAgBC,GAC5D/gB,IACKA,EAAEgC,WACHhC,EAAE6O,MAAQgR,EAAWjS,WAAY5N,EAAEgC,SAAW6d,EAAWlS,WAAW3L,UAExExB,KAAKF,MAAQN,GAGjB,IAAMghB,EAAgBxgB,KAClBsf,EAAYD,EAAWtiB,QAAQwiB,OAC/BkB,EAAWpB,EAAWtiB,QAAQ0jB,SAC9BC,EAAarB,EAAWtiB,QAAQ4jB,SAChCC,EAAkBN,GAAkBC,KAAYC,EAAczB,kBAoBlE,GAlBK/Q,EAAQgS,iBAELX,EAAWwB,OADXD,GAGkB,WACd,OAAIL,KAAYC,EAAc1B,uBAG9B0B,EAAc1B,qBAAqByB,IAAY,GACxC,MAKdA,GAAYG,IACbrB,EAAWwB,MAAO,GAGlB3B,IACAG,EAAWH,KAAOA,EAClBG,EAAWyB,iBAAmBP,GAEzBjB,IAAcmB,IAAazS,EAAQgS,iBAAmBY,IAAkB,CACzEJ,EAAczB,kBAAkBwB,IAAY,EAE5C,IAAMQ,EAAa/gB,KAAKgO,QACxBhO,KAAKgO,QAAUA,EACf,IACIhO,KAAK0e,SAAS9P,MAAMsQ,GACtB,MAAO1f,GACLQ,KAAKF,MAAQN,EAEjBQ,KAAKgO,QAAU+S,EAIvBP,EAAc3B,cAEV2B,EAAcrB,YACdqB,EAAcxB,WAAWZ,UAGjC4C,iBAAkB,SAAUC,EAAUtG,GACN,oBAAxBsG,EAASxS,MAAM7N,KACfZ,KAAKgO,QAAQqO,OAAO6E,QAAQD,GAE5BtG,EAAUjB,aAAc,GAGhCyH,oBAAqB,SAASF,GACE,oBAAxBA,EAASxS,MAAM7N,MACfZ,KAAKgO,QAAQqO,OAAO+E,SAG5BC,YAAa,SAAUC,EAAY3G,GAC3B2G,EAAW7S,MACXzO,KAAKgO,QAAQqO,OAAO6E,QAAQI,GACrBA,EAAWC,cAAgBD,EAAWC,aAAa1iB,OACtDyiB,EAAWE,SACXxhB,KAAKgO,QAAQqO,OAAO6E,QAAQI,GAE5BthB,KAAKgO,QAAQqO,OAAO6E,QAAQI,EAAWC,aAAa,IAEjDD,EAAWpB,OAASoB,EAAWpB,MAAMrhB,QAC5CmB,KAAKgO,QAAQqO,OAAO6E,QAAQI,IAGpCG,eAAgB,SAAUH,GACtBthB,KAAKgO,QAAQqO,OAAO+E,SAExBM,qBAAsB,SAAUC,EAAqBhH,GACjD3a,KAAKgO,QAAQqO,OAAO6E,QAAQS,IAEhCC,wBAAyB,SAAUD,GAC/B3hB,KAAKgO,QAAQqO,OAAO+E,SAExBS,aAAc,SAAUC,EAAanH,GACjC3a,KAAKgO,QAAQqO,OAAO6E,QAAQY,IAEhCC,gBAAiB,SAAUD,GACvB9hB,KAAKgO,QAAQqO,OAAO+E,SAExBY,WAAY,SAAUC,EAAWtH,GAC7B3a,KAAKgO,QAAQqO,OAAO6E,QAAQe,EAAU/B,MAAM,KAEhDgC,cAAe,SAAUD,GACrBjiB,KAAKgO,QAAQqO,OAAO+E,UCvM5B,IAAAe,EAAA,WACI,SAAAA,EAAYC,GACRpiB,KAAKoiB,QAAUA,EAwCvB,OArCID,EAAG/kB,UAAA6hB,IAAH,SAAIC,GACAlf,KAAK4O,MAAMsQ,IAGfiD,EAAU/kB,UAAA2d,WAAV,SAAWzN,GACP,IAAKA,EACD,OAAOA,EAGX,IACIkD,EADEsK,EAAMxN,EAAMzO,OAElB,IAAK2R,EAAI,EAAGA,EAAIsK,EAAKtK,IACjBxQ,KAAK4O,MAAMtB,EAAMkD,IAErB,OAAOlD,GAGX6U,EAAK/kB,UAAAwR,MAAL,SAAMpB,GACF,OAAKA,EAGDA,EAAKuH,cAAgBtH,MACdzN,KAAK+a,WAAWvN,KAGtBA,EAAKiC,kBAAoBjC,EAAKiC,qBAG/BzP,KAAKoiB,QACL5U,EAAKoC,mBAELpC,EAAKqC,qBAGTrC,EAAKkB,OAAO1O,OARDwN,GAPAA,GAkBlB2U,KC/BDE,EAAA,WACI,SAAAA,IACIriB,KAAK0e,SAAW,IAAI7E,EAAQ7Z,MAC5BA,KAAKub,SAAW,GAChBvb,KAAKsiB,gBAAkB,CAAC,IAwFhC,OArFID,EAAGjlB,UAAA6hB,IAAH,SAAIC,GAGA,OAFAA,EAAOlf,KAAK0e,SAAS9P,MAAMsQ,IACtBqD,WAAaviB,KAAKsiB,gBAAgB,GAChCpD,GAGXmD,EAAAjlB,UAAA4jB,iBAAA,SAAiBC,EAAUtG,GACvBA,EAAUjB,aAAc,GAG5B2I,EAAAjlB,UAAAskB,qBAAA,SAAqBC,EAAqBhH,GACtCA,EAAUjB,aAAc,GAG5B2I,EAAAjlB,UAAAykB,aAAA,SAAaC,EAAanH,GACtB,IAAImH,EAAY5C,KAAhB,CAIA,IAAI1O,EACA6K,EACAmH,EAEAC,EADEC,EAAyB,GAIzBxC,EAAQ4B,EAAY5B,MAAOyC,EAAUzC,EAAQA,EAAMrhB,OAAS,EAClE,IAAK2R,EAAI,EAAGA,EAAImS,EAASnS,IACjBsR,EAAY5B,MAAM1P,aAAc8J,GAAKsI,SACrCF,EAAuBliB,KAAK0f,EAAM1P,IAClCsR,EAAYe,mBAAoB,GAMxC,IAAM/G,EAAQgG,EAAYhG,MAC1B,IAAKtL,EAAI,EAAGA,EAAIsL,EAAMjd,OAAQ2R,IAAK,CAC/B,IAAMsS,EAAehH,EAAMtL,GAAsDuS,EAAvCD,EAAaA,EAAajkB,OAAS,GAA6B4jB,WAW1G,KATAA,EAAaM,EAAgBtD,EAAgBsD,GAAehlB,OAAO2kB,GAC7DA,KAGFD,EAAaA,EAAWnS,KAAI,SAAS0S,GACjC,OAAOA,EAAmB7O,YAI7BkH,EAAI,EAAGA,EAAIoH,EAAW5jB,OAAQwc,IAC/Brb,KAAKijB,cAAe,GACpBT,EAASC,EAAWpH,IACb6H,kBAAkBJ,GACzBN,EAAOW,QAAUrB,EACP,IAANzG,IAAWmH,EAAOY,+BAAgC,GACtDpjB,KAAKsiB,gBAAgBtiB,KAAKsiB,gBAAgBzjB,OAAS,GAAG2B,KAAKgiB,GAInExiB,KAAKub,SAAS/a,KAAKshB,EAAYuB,aAGnChB,EAAejlB,UAAA2kB,gBAAf,SAAgBD,GACPA,EAAY5C,OACblf,KAAKub,SAAS1c,OAASmB,KAAKub,SAAS1c,OAAS,IAItDwjB,EAAAjlB,UAAA4kB,WAAA,SAAWC,EAAWtH,GAClBsH,EAAUM,WAAa,GACvBviB,KAAKsiB,gBAAgB9hB,KAAKyhB,EAAUM,aAGxCF,EAAajlB,UAAA8kB,cAAb,SAAcD,GACVjiB,KAAKsiB,gBAAgBzjB,OAASmB,KAAKsiB,gBAAgBzjB,OAAS,GAGhEwjB,EAAAjlB,UAAAikB,YAAA,SAAYC,EAAY3G,GACpB2G,EAAWiB,WAAa,GACxBviB,KAAKsiB,gBAAgB9hB,KAAK8gB,EAAWiB,aAGzCF,EAAcjlB,UAAAqkB,eAAd,SAAeH,GACXthB,KAAKsiB,gBAAgBzjB,OAASmB,KAAKsiB,gBAAgBzjB,OAAS,GAEnEwjB,KAEDiB,EAAA,WACI,SAAAA,IACItjB,KAAK0e,SAAW,IAAI7E,EAAQ7Z,MA6YpC,OA1YIsjB,EAAGlmB,UAAA6hB,IAAH,SAAIC,GACA,IAAMqE,EAAe,IAAIlB,EAGzB,GAFAriB,KAAKwjB,cAAgB,GACrBD,EAAatE,IAAIC,IACZqE,EAAaN,aAAgB,OAAO/D,EACzCA,EAAKqD,WAAarD,EAAKqD,WAAWxkB,OAAOiC,KAAKyjB,iBAAiBvE,EAAKqD,WAAYrD,EAAKqD,aACrFviB,KAAKsiB,gBAAkB,CAACpD,EAAKqD,YAC7B,IAAMmB,EAAU1jB,KAAK0e,SAAS9P,MAAMsQ,GAEpC,OADAlf,KAAK2jB,0BAA0BzE,EAAKqD,YAC7BmB,GAGXJ,EAAyBlmB,UAAAumB,0BAAzB,SAA0BlB,GACtB,IAAMmB,EAAU5jB,KAAKwjB,cACrBf,EAAWoB,QAAO,SAASrB,GACvB,OAAQA,EAAOsB,iBAA+C,GAA5BtB,EAAOuB,WAAWllB,UACrD8O,SAAQ,SAAS6U,GAChB,IAAIwB,EAAW,YACf,IACIA,EAAWxB,EAAOwB,SAASjW,MAAM,IAErC,MAAOtQ,IAEFmmB,EAAQ,GAAG7lB,OAAAykB,EAAOnU,MAAS,KAAAtQ,OAAAimB,MAC5BJ,EAAQ,GAAG7lB,OAAAykB,EAAOnU,MAAS,KAAAtQ,OAAAimB,KAAc,EAMzCpiB,EAAO1B,KAAK,2BAAoB8jB,EAAQ,0BAKpDV,EAAAlmB,UAAAqmB,iBAAA,SAAiBQ,EAAaC,EAAmBC,GAU7C,IAAIC,EAEAC,EACAC,EAEAC,EAEAzB,EACAN,EACAgC,EACAC,EANEC,EAAe,GAEfC,EAAgB3kB,KActB,IARAmkB,EAAiBA,GAAkB,EAQ9BC,EAAc,EAAGA,EAAcH,EAAYplB,OAAQulB,IACpD,IAAKC,EAAoB,EAAGA,EAAoBH,EAAkBrlB,OAAQwlB,IAEtE7B,EAASyB,EAAYG,GACrBI,EAAeN,EAAkBG,GAG5B7B,EAAOuB,WAAWlS,QAAS2S,EAAaI,YAAe,IAG5D9B,EAAe,CAAC0B,EAAaK,cAAc,KAC3CP,EAAUK,EAAcG,UAAUtC,EAAQM,IAE9BjkB,SACR2jB,EAAOsB,iBAAkB,EAGzBtB,EAAOqC,cAAclX,SAAQ,SAASoX,GAClC,IAAM5kB,EAAOqkB,EAAazU,iBAG1BwU,EAAcI,EAAcK,eAAeV,EAASxB,EAAciC,EAAcvC,EAAO1S,cAGvF2U,EAAY,IAAInK,GAAW,OAAEkK,EAAaR,SAAUQ,EAAaS,OAAQ,EAAGT,EAAarX,WAAYhN,IAC3F0kB,cAAgBN,EAG1BA,EAAYA,EAAY1lB,OAAS,GAAG4jB,WAAa,CAACgC,GAGlDC,EAAalkB,KAAKikB,GAClBA,EAAUtB,QAAUqB,EAAarB,QAGjCsB,EAAUV,WAAaU,EAAUV,WAAWhmB,OAAOymB,EAAaT,WAAYvB,EAAOuB,YAK/ES,EAAapB,gCACbqB,EAAUrB,+BAAgC,EAC1CoB,EAAarB,QAAQrH,MAAMtb,KAAK+jB,SAOpD,GAAIG,EAAa7lB,OAAQ,CAIrB,GADAmB,KAAKklB,mBACDf,EAAiB,IAAK,CACtB,IAAIgB,EAAc,wBACdC,EAAc,wBAClB,IACID,EAAcT,EAAa,GAAGG,cAAc,GAAG9W,QAC/CqX,EAAcV,EAAa,GAAGV,SAASjW,QAE3C,MAAOvO,IACP,KAAM,CAAEyY,QAAS,gFAAAla,OAAgFonB,EAAsB,YAAApnB,OAAAqnB,EAAc,MAKzI,OAAOV,EAAa3mB,OAAO4mB,EAAclB,iBAAiBiB,EAAcR,EAAmBC,EAAiB,IAE5G,OAAOO,GAIfpB,EAAAlmB,UAAA4jB,iBAAA,SAAiBqE,EAAU1K,GACvBA,EAAUjB,aAAc,GAG5B4J,EAAAlmB,UAAAskB,qBAAA,SAAqBC,EAAqBhH,GACtCA,EAAUjB,aAAc,GAG5B4J,EAAAlmB,UAAAkoB,cAAA,SAAcC,EAAc5K,GACxBA,EAAUjB,aAAc,GAG5B4J,EAAAlmB,UAAAykB,aAAA,SAAaC,EAAanH,GACtB,IAAImH,EAAY5C,KAAhB,CAGA,IAAIoF,EACAkB,EACApB,EAIAtB,EAHEP,EAAaviB,KAAKsiB,gBAAgBtiB,KAAKsiB,gBAAgBzjB,OAAS,GAChE4mB,EAAiB,GACjBd,EAAgB3kB,KAKtB,IAAKokB,EAAc,EAAGA,EAAc7B,EAAW1jB,OAAQulB,IACnD,IAAKoB,EAAY,EAAGA,EAAY1D,EAAYhG,MAAMjd,OAAQ2mB,IAItD,GAHA1C,EAAehB,EAAYhG,MAAM0J,IAG7B1D,EAAYe,kBAAhB,CACA,IAAMJ,EAAaK,EAAaA,EAAajkB,OAAS,GAAG4jB,WACrDA,GAAcA,EAAW5jB,SAE7BylB,EAAUtkB,KAAK8kB,UAAUvC,EAAW6B,GAActB,IAEtCjkB,SACR0jB,EAAW6B,GAAaN,iBAAkB,EAE1CvB,EAAW6B,GAAaS,cAAclX,SAAQ,SAASoX,GACnD,IAAIW,EACJA,EAAoBf,EAAcK,eAAeV,EAASxB,EAAciC,EAAcxC,EAAW6B,GAAatU,aAC9G2V,EAAejlB,KAAKklB,OAKpC5D,EAAYhG,MAAQgG,EAAYhG,MAAM/d,OAAO0nB,KAGjDnC,EAAAlmB,UAAA0nB,UAAA,SAAUtC,EAAQmD,GAKd,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAxV,EAIAyV,EAFEC,EAAiB1D,EAAOwB,SAASmC,SACjCC,EAAmB,GAEnB9B,EAAU,GAGhB,IAAKsB,EAAwB,EAAGA,EAAwBD,EAAqB9mB,OAAQ+mB,IAGjF,IAFAC,EAAoBF,EAAqBC,GAEpCE,EAAwB,EAAGA,EAAwBD,EAAkBM,SAAStnB,OAAQinB,IAUvF,IARAC,EAAkBF,EAAkBM,SAASL,IAGzCtD,EAAO6D,aAA0C,IAA1BT,GAAyD,IAA1BE,IACtDM,EAAiB5lB,KAAK,CAACglB,UAAWI,EAAuBvX,MAAOyX,EAAuBQ,QAAS,EAC5FC,kBAAmBR,EAAgB/R,aAGtCxD,EAAI,EAAGA,EAAI4V,EAAiBvnB,OAAQ2R,IACrCyV,EAAiBG,EAAiB5V,GAMT,MADzBwV,EAAmBD,EAAgB/R,WAAWvF,QACW,IAA1BqX,IAC3BE,EAAmB,MA5BbhmB,KAgCSwmB,qBAAqBN,EAAeD,EAAeK,SAAS7X,MAAOsX,EAAgBtX,QACjGwX,EAAeK,QAAU,GAAKJ,EAAeD,EAAeK,SAAStS,WAAWvF,QAAUuX,EAC3FC,EAAiB,KAEjBA,EAAeK,UAIfL,IACAA,EAAeQ,SAAWR,EAAeK,UAAYJ,EAAernB,OAChEonB,EAAeQ,WACbjE,EAAOkE,aACJZ,EAAwB,EAAID,EAAkBM,SAAStnB,QAAU+mB,EAAwB,EAAID,EAAqB9mB,UACvHonB,EAAiB,OAIrBA,EACIA,EAAeQ,WACfR,EAAepnB,OAASqnB,EAAernB,OACvConB,EAAeU,aAAef,EAC9BK,EAAeW,oBAAsBd,EAAwB,EAC7DM,EAAiBvnB,OAAS,EAC1BylB,EAAQ9jB,KAAKylB,KAGjBG,EAAiBzlB,OAAO6P,EAAG,GAC3BA,KAKhB,OAAO8T,GAGXhB,EAAAlmB,UAAAopB,qBAAA,SAAqBK,EAAeC,GAChC,GAA6B,iBAAlBD,GAAuD,iBAAlBC,EAC5C,OAAOD,IAAkBC,EAE7B,GAAID,aAAyBvM,GAAKyM,UAC9B,OAAIF,EAAc9X,KAAO+X,EAAc/X,IAAM8X,EAAclU,MAAQmU,EAAcnU,MAG5EkU,EAAcpY,OAAUqY,EAAcrY,OAM3CoY,EAAgBA,EAAcpY,MAAMA,OAASoY,EAAcpY,UAC3DqY,EAAgBA,EAAcrY,MAAMA,OAASqY,EAAcrY,QANnDoY,EAAcpY,QAASqY,EAAcrY,OAWjD,GAFAoY,EAAgBA,EAAcpY,MAC9BqY,EAAgBA,EAAcrY,MAC1BoY,aAAyBvM,GAAK0M,SAAU,CACxC,KAAMF,aAAyBxM,GAAK0M,WAAaH,EAAcV,SAAStnB,SAAWioB,EAAcX,SAAStnB,OACtG,OAAO,EAEX,IAAK,IAAI6B,EAAI,EAAGA,EAAKmmB,EAAcV,SAAStnB,OAAQ6B,IAAK,CACrD,GAAImmB,EAAcV,SAASzlB,GAAGsT,WAAWvF,QAAUqY,EAAcX,SAASzlB,GAAGsT,WAAWvF,QAC1E,IAAN/N,IAAYmmB,EAAcV,SAASzlB,GAAGsT,WAAWvF,OAAS,QAAUqY,EAAcX,SAASzlB,GAAGsT,WAAWvF,OAAS,MAClH,OAAO,EAGf,IAAKzO,KAAKwmB,qBAAqBK,EAAcV,SAASzlB,GAAG+N,MAAOqY,EAAcX,SAASzlB,GAAG+N,OACtF,OAAO,EAGf,OAAO,EAEX,OAAO,GAGX6U,EAAclmB,UAAA4nB,eAAd,SAAeV,EAASxB,EAAcmE,EAAqBnX,GAIvD,IAAkFoX,EAAYlD,EAAUmD,EAAc9W,EAAO+W,EAAzHC,EAA2B,EAAGC,EAAkC,EAAGrL,EAAO,GAE9E,IAAKiL,EAAa,EAAGA,EAAa5C,EAAQzlB,OAAQqoB,IAE9ClD,EAAWlB,GADXzS,EAAQiU,EAAQ4C,IACc1B,WAC9B2B,EAAe,IAAI7M,GAAKvG,QACpB1D,EAAMkW,kBACNU,EAAoBd,SAAS,GAAG1X,MAChCwY,EAAoBd,SAAS,GAAGlS,WAChCgT,EAAoBd,SAAS,GAAG/Y,WAChC6Z,EAAoBd,SAAS,GAAGhZ,YAGhCkD,EAAMmV,UAAY6B,GAA4BC,EAAkC,IAChFrL,EAAKA,EAAKpd,OAAS,GAAGsnB,SAAWlK,EAAKA,EAAKpd,OAAS,GAC/CsnB,SAASpoB,OAAO+kB,EAAauE,GAA0BlB,SAAStT,MAAMyU,IAC3EA,EAAkC,EAClCD,KAGJD,EAAcpD,EAASmC,SAClBtT,MAAMyU,EAAiCjX,EAAMhC,OAC7CtQ,OAAO,CAACopB,IACRppB,OAAOkpB,EAAoBd,SAAStT,MAAM,IAE3CwU,IAA6BhX,EAAMmV,WAAa0B,EAAa,EAC7DjL,EAAKA,EAAKpd,OAAS,GAAGsnB,SAClBlK,EAAKA,EAAKpd,OAAS,GAAGsnB,SAASpoB,OAAOqpB,IAE1CnL,EAAOA,EAAKle,OAAO+kB,EAAajQ,MAAMwU,EAA0BhX,EAAMmV,aAEjEhlB,KAAK,IAAI8Z,GAAK0M,SACfI,IAGRC,EAA2BhX,EAAMsW,cACjCW,EAAkCjX,EAAMuW,sBACD9D,EAAauE,GAA0BlB,SAAStnB,SACnFyoB,EAAkC,EAClCD,KAqBR,OAjBIA,EAA2BvE,EAAajkB,QAAUyoB,EAAkC,IACpFrL,EAAKA,EAAKpd,OAAS,GAAGsnB,SAAWlK,EAAKA,EAAKpd,OAAS,GAC/CsnB,SAASpoB,OAAO+kB,EAAauE,GAA0BlB,SAAStT,MAAMyU,IAC3ED,KAIJpL,GADAA,EAAOA,EAAKle,OAAO+kB,EAAajQ,MAAMwU,EAA0BvE,EAAajkB,UACjEyR,KAAI,SAAUiX,GAEtB,IAAMC,EAAUD,EAAaE,cAAcF,EAAapB,UAMxD,OALIrW,EACA0X,EAAQ5X,mBAER4X,EAAQ3X,qBAEL2X,MAKflE,EAAAlmB,UAAA4kB,WAAA,SAAWC,EAAWtH,GAClB,IAAI+M,EAAgBzF,EAAUM,WAAWxkB,OAAOiC,KAAKsiB,gBAAgBtiB,KAAKsiB,gBAAgBzjB,OAAS,IACnG6oB,EAAgBA,EAAc3pB,OAAOiC,KAAKyjB,iBAAiBiE,EAAezF,EAAUM,aACpFviB,KAAKsiB,gBAAgB9hB,KAAKknB,IAG9BpE,EAAalmB,UAAA8kB,cAAb,SAAcD,GACV,IAAM0F,EAAY3nB,KAAKsiB,gBAAgBzjB,OAAS,EAChDmB,KAAKsiB,gBAAgBzjB,OAAS8oB,GAGlCrE,EAAAlmB,UAAAikB,YAAA,SAAYC,EAAY3G,GACpB,IAAI+M,EAAgBpG,EAAWiB,WAAWxkB,OAAOiC,KAAKsiB,gBAAgBtiB,KAAKsiB,gBAAgBzjB,OAAS,IACpG6oB,EAAgBA,EAAc3pB,OAAOiC,KAAKyjB,iBAAiBiE,EAAepG,EAAWiB,aACrFviB,KAAKsiB,gBAAgB9hB,KAAKknB,IAG9BpE,EAAclmB,UAAAqkB,eAAd,SAAeH,GACX,IAAMqG,EAAY3nB,KAAKsiB,gBAAgBzjB,OAAS,EAChDmB,KAAKsiB,gBAAgBzjB,OAAS8oB,GAErCrE,KClfDsE,EAAA,WACI,SAAAA,IACI5nB,KAAKub,SAAW,CAAC,IACjBvb,KAAK0e,SAAW,IAAI7E,EAAQ7Z,MAqDpC,OAlDI4nB,EAAGxqB,UAAA6hB,IAAH,SAAIC,GACA,OAAOlf,KAAK0e,SAAS9P,MAAMsQ,IAG/B0I,EAAAxqB,UAAA4jB,iBAAA,SAAiBC,EAAUtG,GACvBA,EAAUjB,aAAc,GAG5BkO,EAAAxqB,UAAAskB,qBAAA,SAAqBC,EAAqBhH,GACtCA,EAAUjB,aAAc,GAG5BkO,EAAAxqB,UAAAykB,aAAA,SAAaC,EAAanH,GACtB,IAEI0I,EAFErV,EAAUhO,KAAKub,SAASvb,KAAKub,SAAS1c,OAAS,GAC/Cid,EAAQ,GAGd9b,KAAKub,SAAS/a,KAAKsb,GAEdgG,EAAY5C,QACbmE,EAAYvB,EAAYuB,aAEpBA,EAAYA,EAAUQ,QAAO,SAASG,GAAY,OAAOA,EAAS6D,iBAClE/F,EAAYuB,UAAYA,EAAUxkB,OAASwkB,EAAaA,EAAY,KAChEA,GAAavB,EAAYgG,cAAchM,EAAO9N,EAASqV,IAE1DA,IAAavB,EAAY5B,MAAQ,MACtC4B,EAAYhG,MAAQA,IAI5B8L,EAAexqB,UAAA2kB,gBAAf,SAAgBD,GACZ9hB,KAAKub,SAAS1c,OAASmB,KAAKub,SAAS1c,OAAS,GAGlD+oB,EAAAxqB,UAAA4kB,WAAA,SAAWC,EAAWtH,GAClB,IAAM3M,EAAUhO,KAAKub,SAASvb,KAAKub,SAAS1c,OAAS,GACrDojB,EAAU/B,MAAM,GAAGhB,KAA2B,IAAnBlR,EAAQnP,QAAgBmP,EAAQ,GAAG+Z,YAGlEH,EAAAxqB,UAAAikB,YAAA,SAAYC,EAAY3G,GACpB,IAAM3M,EAAUhO,KAAKub,SAASvb,KAAKub,SAAS1c,OAAS,GAEjDyiB,EAAWC,cAAgBD,EAAWC,aAAa1iB,OACnDyiB,EAAWC,aAAa,GAAGrC,KAA2B,IAAnBlR,EAAQnP,QAAgBmP,EAAQ,GAAG+Z,WAEjEzG,EAAWpB,OAASoB,EAAWpB,MAAMrhB,SAC1CyiB,EAAWpB,MAAM,GAAGhB,KAAQoC,EAAWE,UAA+B,IAAnBxT,EAAQnP,QAAgB,OAGtF+oB,KCvDDI,EAAA,WACI,SAAAA,EAAYha,GACRhO,KAAK0e,SAAW,IAAI7E,EAAQ7Z,MAC5BA,KAAKioB,SAAWja,EAwExB,OArEIga,EAA6B5qB,UAAA8qB,8BAA7B,SAA8BC,GAC1B,IAAIC,EACJ,IAAKD,EACD,OAAO,EAEX,IAAK,IAAI9W,EAAI,EAAGA,EAAI8W,EAAUtpB,OAAQwS,IAElC,IADA+W,EAAOD,EAAU9W,IACRgX,UAAYD,EAAKC,SAASroB,KAAKioB,YAAcG,EAAK3Y,mBAGvD,OAAO,EAGf,OAAO,GAGXuY,EAAqB5qB,UAAAkrB,sBAArB,SAAsBC,GACdA,GAASA,EAAMrI,QACfqI,EAAMrI,MAAQqI,EAAMrI,MAAM2D,QAAO,SAAA2E,GAAS,OAAAA,EAAM1Y,iBAIxDkY,EAAO5qB,UAAAkR,QAAP,SAAQia,GACJ,OAAQA,IAASA,EAAMrI,OACO,IAAvBqI,EAAMrI,MAAMrhB,QAGvBmpB,EAAkB5qB,UAAAqrB,mBAAlB,SAAmB3G,GACf,SAAQA,IAAeA,EAAYhG,QAC5BgG,EAAYhG,MAAMjd,OAAS,GAGtCmpB,EAAiB5qB,UAAAsrB,kBAAjB,SAAkBlb,GACd,IAAKA,EAAKiC,mBAAoB,CAC1B,GAAIzP,KAAKsO,QAAQd,GACb,OAGJ,OAAOA,EAGX,IAAMmb,EAAoBnb,EAAK0S,MAAM,GAGrC,GAFAlgB,KAAKsoB,sBAAsBK,IAEvB3oB,KAAKsO,QAAQqa,GAOjB,OAHAnb,EAAKoC,mBACLpC,EAAKmC,wBAEEnC,GAGXwa,EAAgB5qB,UAAAwrB,iBAAhB,SAAiB9G,GACb,QAAIA,EAAY+G,YAIZ7oB,KAAKsO,QAAQwT,OAIZA,EAAY5C,OAASlf,KAAKyoB,mBAAmB3G,KAMzDkG,KAEKc,EAAe,SAAS9a,GAC1BhO,KAAK0e,SAAW,IAAI7E,EAAQ7Z,MAC5BA,KAAKioB,SAAWja,EAChBhO,KAAK+oB,MAAQ,IAAIf,EAAgBha,IAGrC8a,EAAa1rB,UAAY,CACrByd,aAAa,EACboE,IAAK,SAAUC,GACX,OAAOlf,KAAK0e,SAAS9P,MAAMsQ,IAG/B8B,iBAAkB,SAAUC,EAAUtG,GAClC,IAAIsG,EAASxR,qBAAsBwR,EAAS+H,SAG5C,OAAO/H,GAGXS,qBAAsB,SAAUuH,EAAWtO,GAGvCsO,EAAU5M,OAAS,IAGvB6M,YAAa,SAAUC,EAAYxO,KAGnCyO,aAAc,SAAUC,EAAa1O,GACjC,IAAI0O,EAAY5Z,qBAAsB4Z,EAAYhB,SAASroB,KAAKioB,UAGhE,OAAOoB,GAGXrH,WAAY,SAASC,EAAWtH,GAC5B,IAAM2O,EAAgBrH,EAAU/B,MAAM,GAAGA,MAIzC,OAHA+B,EAAUvT,OAAO1O,KAAK0e,UACtB/D,EAAUjB,aAAc,EAEjB1Z,KAAK+oB,MAAML,kBAAkBzG,EAAWqH,IAGnDlK,YAAa,SAAUC,EAAY1E,GAC/B,IAAI0E,EAAW5P,mBAGf,OAAO4P,GAGXgC,YAAa,SAASC,EAAY3G,GAC9B,OAAI2G,EAAWpB,OAASoB,EAAWpB,MAAMrhB,OAC9BmB,KAAKupB,oBAAoBjI,EAAY3G,GAErC3a,KAAKwpB,uBAAuBlI,EAAY3G,IAIvD8O,eAAgB,SAASC,EAAe/O,GACpC,IAAK+O,EAAcja,mBAEf,OADAia,EAAchb,OAAO1O,KAAK0e,UACnBgL,GAIfH,oBAAqB,SAASjI,EAAY3G,GAkBtC,IAAM2O,EAXN,SAAsBhI,GAClB,IAAMqI,EAAYrI,EAAWpB,MAC7B,OANJ,SAAwBoB,GACpB,IAAM6G,EAAY7G,EAAWpB,MAC7B,OAA4B,IAArBiI,EAAUtpB,UAAkBspB,EAAU,GAAGrM,OAAuC,IAA9BqM,EAAU,GAAGrM,MAAMjd,QAIxE+qB,CAAetI,GACRqI,EAAU,GAAGzJ,MAGjByJ,EAKWE,CAAavI,GAQnC,OAPAA,EAAW5S,OAAO1O,KAAK0e,UACvB/D,EAAUjB,aAAc,EAEnB1Z,KAAK+oB,MAAMza,QAAQgT,IACpBthB,KAAK8pB,YAAYxI,EAAWpB,MAAM,GAAGA,OAGlClgB,KAAK+oB,MAAML,kBAAkBpH,EAAYgI,IAGpDE,uBAAwB,SAASlI,EAAY3G,GACzC,IAAI2G,EAAW7R,mBAAf,CAIA,GAAwB,aAApB6R,EAAWyI,KAAqB,CAIhC,GAAI/pB,KAAKgqB,QAAS,CACd,GAAI1I,EAAW2I,UAAW,CACtB,IAAMC,EAAU,IAAI5P,GAAK6P,QAAQ,MAAApsB,OAAMujB,EAAWvT,MAAM/N,KAAKioB,UAAUprB,QAAQ,MAAO,IAAU,UAEhG,OADAqtB,EAAQD,UAAY3I,EAAW2I,UACxBjqB,KAAK0e,SAAS9P,MAAMsb,GAE/B,OAEJlqB,KAAKgqB,SAAU,EAGnB,OAAO1I,IAGX8I,gBAAiB,SAASlK,EAAOmK,GAC7B,GAAKnK,EAIL,IAAK,IAAIxf,EAAI,EAAGA,EAAIwf,EAAMrhB,OAAQ6B,IAAK,CACnC,IAAM2kB,EAAWnF,EAAMxf,GACvB,GAAI2pB,GAAUhF,aAAoB/K,GAAKgQ,cAAgBjF,EAAS2D,SAC5D,KAAM,CAAE/Q,QAAS,wEACb5J,MAAOgX,EAASjY,WAAY5L,SAAU6jB,EAASlY,YAAckY,EAASlY,WAAW3L,UAEzF,GAAI6jB,aAAoB/K,GAAKiQ,KACzB,KAAM,CAAEtS,QAAS,oBAAaoN,EAAS0E,KAAkC,gCACrE1b,MAAOgX,EAASjY,WAAY5L,SAAU6jB,EAASlY,YAAckY,EAASlY,WAAW3L,UAEzF,GAAI6jB,EAASzkB,OAASykB,EAASmF,UAC3B,KAAM,CAAEvS,QAAS,UAAGoN,EAASzkB,KAAoD,kDAC7EyN,MAAOgX,EAASjY,WAAY5L,SAAU6jB,EAASlY,YAAckY,EAASlY,WAAW3L,YAKjGqgB,aAAc,SAAUC,EAAanH,GAEjC,IAAIyN,EAEEqC,EAAW,GAIjB,GAFAzqB,KAAKoqB,gBAAgBtI,EAAY5B,MAAO4B,EAAY+G,WAE/C/G,EAAY5C,KA6Bb4C,EAAYpT,OAAO1O,KAAK0e,UACxB/D,EAAUjB,aAAc,MA9BL,CAEnB1Z,KAAK0qB,qBAAqB5I,GAM1B,IAHA,IAAM6H,EAAY7H,EAAY5B,MAE1ByK,EAAchB,EAAYA,EAAU9qB,OAAS,EACxCgC,EAAI,EAAGA,EAAI8pB,IAChBvC,EAAOuB,EAAU9oB,KACLunB,EAAKlI,OAEbuK,EAASjqB,KAAKR,KAAK0e,SAAS9P,MAAMwZ,IAClCuB,EAAUhpB,OAAOE,EAAG,GACpB8pB,KAGJ9pB,IAKA8pB,EAAc,EACd7I,EAAYpT,OAAO1O,KAAK0e,UAExBoD,EAAY5B,MAAQ,KAExBvF,EAAUjB,aAAc,EAiB5B,OAXIoI,EAAY5B,QACZlgB,KAAK8pB,YAAYhI,EAAY5B,OAC7BlgB,KAAK4qB,sBAAsB9I,EAAY5B,QAIvClgB,KAAK+oB,MAAMH,iBAAiB9G,KAC5BA,EAAYlS,mBACZ6a,EAAS9pB,OAAO,EAAG,EAAGmhB,IAGF,IAApB2I,EAAS5rB,OACF4rB,EAAS,GAEbA,GAGXC,qBAAsB,SAAS5I,GACvBA,EAAYhG,QACZgG,EAAYhG,MAAQgG,EAAYhG,MAC3B+H,QAAO,SAAA3Q,GACJ,IAAI1C,EAIJ,IAH0C,MAAtC0C,EAAE,GAAGiT,SAAS,GAAGnS,WAAWvF,QAC5ByE,EAAE,GAAGiT,SAAS,GAAGnS,WAAa,IAAIsG,GAAe,WAAE,KAElD9J,EAAI,EAAGA,EAAI0C,EAAErU,OAAQ2R,IACtB,GAAI0C,EAAE1C,GAAGV,aAAeoD,EAAE1C,GAAGqX,cACzB,OAAO,EAGf,OAAO,OAKvB+C,sBAAuB,SAAS1K,GAC5B,GAAKA,EAAL,CAGA,IAEI2K,EACAzC,EACA5X,EAJEsa,EAAY,GAMlB,IAAKta,EAAI0P,EAAMrhB,OAAS,EAAG2R,GAAK,EAAIA,IAEhC,IADA4X,EAAOlI,EAAM1P,cACO8J,GAAKgQ,YACrB,GAAKQ,EAAU1C,EAAK2B,MAEb,EACHc,EAAWC,EAAU1C,EAAK2B,iBACFzP,GAAKgQ,cACzBO,EAAWC,EAAU1C,EAAK2B,MAAQ,CAACe,EAAU1C,EAAK2B,MAAMhc,MAAM/N,KAAKioB,YAEvE,IAAM8C,EAAU3C,EAAKra,MAAM/N,KAAKioB,WACG,IAA/B4C,EAAShZ,QAAQkZ,GACjB7K,EAAMvf,OAAO6P,EAAG,GAEhBqa,EAASrqB,KAAKuqB,QAVlBD,EAAU1C,EAAK2B,MAAQ3B,IAiBvC0B,YAAa,SAAS5J,GAClB,GAAKA,EAAL,CAOA,IAHA,IAAM8K,EAAY,GACZC,EAAY,GAETC,EAAI,EAAGA,EAAIhL,EAAMrhB,OAAQqsB,IAAK,CACnC,IAAM9C,EAAOlI,EAAMgL,GACnB,GAAI9C,EAAK+C,MAAO,CACZ,IAAMxY,EAAMyV,EAAK2B,KACjBiB,EAAOrY,GAAOuN,EAAMvf,OAAOuqB,IAAK,GAC5BD,EAAUzqB,KAAKwqB,EAAOrY,GAAO,IACjCqY,EAAOrY,GAAKnS,KAAK4nB,IAIzB6C,EAAUtd,SAAQ,SAAAyd,GACd,GAAIA,EAAMvsB,OAAS,EAAG,CAClB,IAAMwsB,EAASD,EAAM,GACjBE,EAAS,GACPC,EAAS,CAAC,IAAIjR,GAAKkR,WAAWF,IACpCF,EAAMzd,SAAQ,SAAAya,GACU,MAAfA,EAAK+C,OAAmBG,EAAMzsB,OAAS,GACxC0sB,EAAM/qB,KAAK,IAAI8Z,GAAKkR,WAAWF,EAAQ,KAE3CA,EAAM9qB,KAAK4nB,EAAK3Z,OAChB4c,EAAOI,UAAYJ,EAAOI,WAAarD,EAAKqD,aAEhDJ,EAAO5c,MAAQ,IAAI6L,GAAKoR,MAAMH,UCjW/B,IAAAI,GAAA,CACX9R,QAAOA,EACP0E,cAAaA,EACbqN,4BAA2BA,EAC3BC,cAAaA,EACbjE,oBAAmBA,EACnBkB,aAAYA,GCXhB,IAAAgD,GAAe,WACX,IACI3T,EAGAkD,EAMA0Q,EAGAC,EAGAC,EAGAC,EAGAC,EAfAC,EAAY,GAiBVC,EAAc,GAUpB,SAASC,EAAeztB,GAWpB,IAVA,IAMI0R,EACAgc,EACArC,EAREsC,EAAOH,EAAY7b,EACnBic,EAAOpR,EACPqR,EAAOL,EAAY7b,EAAI2b,EACvBQ,EAAWN,EAAY7b,EAAI0b,EAAQrtB,OAAS6tB,EAC5CE,EAAOP,EAAY7b,GAAK3R,EACxBguB,EAAM1U,EAKLkU,EAAY7b,EAAImc,EAAUN,EAAY7b,IAAK,CAG9C,GAFAD,EAAIsc,EAAIC,WAAWT,EAAY7b,GAE3B6b,EAAYU,mBAjBO,KAiBcxc,EAA8B,CAE/D,GAAiB,OADjBgc,EAAWM,EAAIxY,OAAOgY,EAAY7b,EAAI,IAChB,CAClB0Z,EAAU,CAAC7b,MAAOge,EAAY7b,EAAGwc,eAAe,GAChD,IAAIC,EAAcJ,EAAIhb,QAAQ,KAAMwa,EAAY7b,EAAI,GAChDyc,EAAc,IACdA,EAAcN,GAElBN,EAAY7b,EAAIyc,EAChB/C,EAAQgD,KAAOL,EAAIrT,OAAO0Q,EAAQ7b,MAAOge,EAAY7b,EAAI0Z,EAAQ7b,OACjEge,EAAYc,aAAa3sB,KAAK0pB,GAC9B,SACG,GAAiB,MAAbqC,EAAkB,CACzB,IAAMa,EAAgBP,EAAIhb,QAAQ,KAAMwa,EAAY7b,EAAI,GACxD,GAAI4c,GAAiB,EAAG,CACpBlD,EAAU,CACN7b,MAAOge,EAAY7b,EACnB0c,KAAML,EAAIrT,OAAO6S,EAAY7b,EAAG4c,EAAgB,EAAIf,EAAY7b,GAChEwc,eAAe,GAEnBX,EAAY7b,GAAK0Z,EAAQgD,KAAKruB,OAAS,EACvCwtB,EAAYc,aAAa3sB,KAAK0pB,GAC9B,UAGR,MAGJ,GAnDe,KAmDV3Z,GAjDO,KAiDmBA,GAlDlB,IAkDyCA,GAhD1C,KAgDkEA,EAC1E,MAOR,GAHA2b,EAAUA,EAAQrZ,MAAMhU,EAASwtB,EAAY7b,EAAIoc,EAAMF,GACvDP,EAAaE,EAAY7b,GAEpB0b,EAAQrtB,OAAQ,CACjB,GAAIwc,EAAI4Q,EAAOptB,OAAS,EAGpB,OAFAqtB,EAAUD,IAAS5Q,GACnBiR,EAAe,IACR,EAEXD,EAAY5F,UAAW,EAG3B,OAAO+F,IAASH,EAAY7b,GAAKic,IAASpR,EA2S9C,OAxSAgR,EAAYgB,KAAO,WACflB,EAAaE,EAAY7b,EACzB4b,EAAU5rB,KAAM,CAAE0rB,UAAS1b,EAAG6b,EAAY7b,EAAG6K,EAACA,KAElDgR,EAAYiB,QAAU,SAAAC,IAEdlB,EAAY7b,EAAIub,GAAaM,EAAY7b,IAAMub,GAAYwB,IAAyBvB,KACpFD,EAAWM,EAAY7b,EACvBwb,EAA+BuB,GAEnC,IAAMC,EAAQpB,EAAUzP,MACxBuP,EAAUsB,EAAMtB,QAChBC,EAAaE,EAAY7b,EAAIgd,EAAMhd,EACnC6K,EAAImS,EAAMnS,GAEdgR,EAAYoB,OAAS,WACjBrB,EAAUzP,OAEd0P,EAAYqB,aAAe,SAAAC,GACvB,IAAMC,EAAMvB,EAAY7b,GAAKmd,GAAU,GACjCE,EAAO1V,EAAM2U,WAAWc,GAC9B,OA5FmB,KA4FXC,GAzFQ,KAyFmBA,GA3FlB,IA2F0CA,GA1F3C,KA0FoEA,GAIxFxB,EAAYyB,IAAM,SAAAC,GACV1B,EAAY7b,EAAI2b,IAChBD,EAAUA,EAAQrZ,MAAMwZ,EAAY7b,EAAI2b,GACxCA,EAAaE,EAAY7b,GAG7B,IAAM/E,EAAIsiB,EAAIC,KAAK9B,GACnB,OAAKzgB,GAIL6gB,EAAe7gB,EAAE,GAAG5M,QACH,iBAAN4M,EACAA,EAGS,IAAbA,EAAE5M,OAAe4M,EAAE,GAAKA,GARpB,MAWf4gB,EAAY4B,MAAQ,SAAAF,GAChB,OAAI5V,EAAM9D,OAAOgY,EAAY7b,KAAOud,EACzB,MAEXzB,EAAe,GACRyB,IAGX1B,EAAY6B,UAAY,SAAAH,GACpB,OAAI5V,EAAM9D,OAAOgY,EAAY7b,KAAOud,EACzB,KAEJA,GAGX1B,EAAY8B,KAAO,SAAAJ,GAIf,IAHA,IAAMK,EAAYL,EAAIlvB,OAGb6B,EAAI,EAAGA,EAAI0tB,EAAW1tB,IAC3B,GAAIyX,EAAM9D,OAAOgY,EAAY7b,EAAI9P,KAAOqtB,EAAI1Z,OAAO3T,GAC/C,OAAO,KAKf,OADA4rB,EAAe8B,GACRL,GAGX1B,EAAYgC,QAAU,SAAAhW,GAClB,IAAMuV,EAAMvV,GAAOgU,EAAY7b,EACzB8d,EAAYnW,EAAM9D,OAAOuZ,GAE/B,GAAkB,MAAdU,GAAoC,MAAdA,EAA1B,CAMA,IAHA,IAAMzvB,EAASsZ,EAAMtZ,OACf0vB,EAAkBX,EAEf/sB,EAAI,EAAGA,EAAI0tB,EAAkB1vB,EAAQgC,IAAK,CAE/C,OADiBsX,EAAM9D,OAAOxT,EAAI0tB,IAE9B,IAAK,KACD1tB,IACA,SACJ,IAAK,KACL,IAAK,KACD,MACJ,KAAKytB,EACD,IAAMjV,EAAMlB,EAAMqB,OAAO+U,EAAiB1tB,EAAI,GAC9C,OAAKwX,GAAe,IAARA,EAIL,CAACiW,EAAWjV,IAHfiT,EAAezrB,EAAI,GACZwY,IAOvB,OAAO,OAOXgT,EAAYmC,YAAc,SAAAT,GACtB,IAWIU,EAXAC,EAAQ,GACRC,EAAY,KACZC,GAAY,EACZC,EAAa,EACXC,EAAa,GACbC,EAAc,GACdlwB,EAASsZ,EAAMtZ,OACfmwB,EAAW3C,EAAY7b,EACzBye,EAAU5C,EAAY7b,EACtBA,EAAI6b,EAAY7b,EAChB0e,GAAO,EAIPT,EADe,iBAARV,EACI,SAAAoB,GAAQ,OAAAA,IAASpB,GAEjB,SAAAoB,GAAQ,OAAApB,EAAI7R,KAAKiT,IAGhC,EAAG,CACC,IAAI5C,EAAWpU,EAAM9D,OAAO7D,GAC5B,GAAmB,IAAfqe,GAAoBJ,EAASlC,IAC7BoC,EAAYxW,EAAMqB,OAAOyV,EAASze,EAAIye,IAElCF,EAAYvuB,KAAKmuB,GAGjBI,EAAYvuB,KAAK,KAErBmuB,EAAYI,EACZzC,EAAe9b,EAAIwe,GACnBE,GAAO,MACJ,CACH,GAAIN,EAAW,CACM,MAAbrC,GACwB,MAAxBpU,EAAM9D,OAAO7D,EAAI,KACjBA,IACAqe,IACAD,GAAY,GAEhBpe,IACA,SAEJ,OAAQ+b,GACJ,IAAK,KACD/b,IACA+b,EAAWpU,EAAM9D,OAAO7D,GACxBue,EAAYvuB,KAAK2X,EAAMqB,OAAOyV,EAASze,EAAIye,EAAU,IACrDA,EAAUze,EAAI,EACd,MACJ,IAAK,IAC2B,MAAxB2H,EAAM9D,OAAO7D,EAAI,KACjBA,IACAoe,GAAY,EACZC,KAEJ,MACJ,IAAK,IACL,IAAK,KACDH,EAAQrC,EAAYgC,QAAQ7d,KAExBue,EAAYvuB,KAAK2X,EAAMqB,OAAOyV,EAASze,EAAIye,GAAUP,GAErDO,GADAze,GAAKke,EAAM,GAAG7vB,OAAS,GACT,IAGdytB,EAAe9b,EAAIwe,GACnBL,EAAYpC,EACZ2C,GAAO,GAEX,MACJ,IAAK,IACDJ,EAAWtuB,KAAK,KAChBquB,IACA,MACJ,IAAK,IACDC,EAAWtuB,KAAK,KAChBquB,IACA,MACJ,IAAK,IACDC,EAAWtuB,KAAK,KAChBquB,IACA,MACJ,IAAK,IACL,IAAK,IACL,IAAK,IACD,IAAMO,EAAWN,EAAWnS,MACxB4P,IAAa6C,EACbP,KAGAvC,EAAe9b,EAAIwe,GACnBL,EAAYS,EACZF,GAAO,KAInB1e,EACQ3R,IACJqwB,GAAO,UAGVA,GAET,OAAOP,GAAwB,MAGnCtC,EAAYU,mBAAoB,EAChCV,EAAYc,aAAe,GAC3Bd,EAAY5F,UAAW,EAIvB4F,EAAYgD,KAAO,SAAAtB,GACf,GAAmB,iBAARA,EAAkB,CAEzB,IAAK,IAAI7C,EAAI,EAAGA,EAAI6C,EAAIlvB,OAAQqsB,IAC5B,GAAI/S,EAAM9D,OAAOgY,EAAY7b,EAAI0a,KAAO6C,EAAI1Z,OAAO6W,GAC/C,OAAO,EAGf,OAAO,EAEP,OAAO6C,EAAI7R,KAAKgQ,IAMxBG,EAAYiD,SAAW,SAAAvB,GAAO,OAAA5V,EAAM9D,OAAOgY,EAAY7b,KAAOud,GAE9D1B,EAAYkD,YAAc,WAAM,OAAApX,EAAM9D,OAAOgY,EAAY7b,IAEzD6b,EAAYmD,SAAW,WAAM,OAAArX,EAAM9D,OAAOgY,EAAY7b,EAAI,IAE1D6b,EAAYoD,SAAW,WAAM,OAAAtX,GAE7BkU,EAAYqD,eAAiB,WACzB,IAAMnf,EAAI4H,EAAM2U,WAAWT,EAAY7b,GAEvC,OAAQD,EA3TO,IA2TWA,EA9TR,IAES,KA4TqBA,GA7T7B,KA6T6DA,GAGpF8b,EAAYsD,MAAQ,SAACtW,EAAKuW,EAAYC,GAClC1X,EAAQkB,EACRgT,EAAY7b,EAAI6K,EAAI8Q,EAAaJ,EAAW,EAaxCE,EADA2D,EC9Wa,SAAAzX,EAAO2X,GAC5B,IAGIC,EACAC,EACAC,EACAC,EAGAC,EACAC,EACAC,EACAC,EACAhK,EAbEiK,EAAMpY,EAAMtZ,OACd2xB,EAAQ,EACRC,EAAa,EAKXxE,EAAS,GACXyE,EAAW,EAOf,SAASC,EAAUC,GACf,IAAML,EAAMJ,EAAsBO,EAC5BH,EAAM,MAASK,IAAWL,IAGhCtE,EAAOzrB,KAAK2X,EAAMtF,MAAM6d,EAAUP,EAAsB,IACxDO,EAAWP,EAAsB,GAGrC,IAAKA,EAAsB,EAAGA,EAAsBI,EAAKJ,IAErD,MADAE,EAAKlY,EAAM2U,WAAWqD,KACV,IAAQE,GAAM,KAAUA,EAAK,IAKzC,OAAQA,GACJ,KAAK,GACDI,IACAT,EAAmBG,EACnB,SACJ,KAAK,GACD,KAAMM,EAAa,EACf,OAAOX,EAAK,sBAAuBK,GAEvC,SACJ,KAAK,GACIM,GAAcE,IACnB,SACJ,KAAK,IACDH,IACAT,EAAcI,EACd,SACJ,KAAK,IACD,KAAMK,EAAQ,EACV,OAAOV,EAAK,sBAAuBK,GAElCK,GAAUC,GAAcE,IAC7B,SACJ,KAAK,GACD,GAAIR,EAAsBI,EAAM,EAAG,CAAEJ,IAAuB,SAC5D,OAAOL,EAAK,iBAAkBK,GAClC,KAAK,GACL,KAAK,GACL,KAAK,GAGD,IAFA7J,EAAU,EACV8J,EAAyBD,EACpBA,GAA4C,EAAGA,EAAsBI,EAAKJ,IAE3E,MADAG,EAAMnY,EAAM2U,WAAWqD,IACb,IAAV,CACA,GAAIG,GAAOD,EAAI,CAAE/J,EAAU,EAAG,MAC9B,GAAW,IAAPgK,EAAW,CACX,GAAIH,GAAuBI,EAAM,EAC7B,OAAOT,EAAK,iBAAkBK,GAElCA,KAGR,GAAI7J,EAAW,SACf,OAAOwJ,EAAK,cAAe/xB,OAAA8yB,OAAOC,aAAaT,GAAG,KAAMD,GAC5D,KAAK,GACD,GAAIK,GAAeN,GAAuBI,EAAM,EAAM,SAEtD,GAAW,KADXD,EAAMnY,EAAM2U,WAAWqD,EAAsB,IAGzC,IAAKA,GAA4C,EAAGA,EAAsBI,OACtED,EAAMnY,EAAM2U,WAAWqD,KACX,KAAgB,IAAPG,GAAsB,IAAPA,GAFuCH,UAI5E,GAAW,IAAPG,EAAW,CAGlB,IADAL,EAAmBG,EAAyBD,EACvCA,GAA4C,EAAGA,EAAsBI,EAAM,IAEjE,MADXD,EAAMnY,EAAM2U,WAAWqD,MACLD,EAA2BC,GAClC,IAAPG,GAC6C,IAA7CnY,EAAM2U,WAAWqD,EAAsB,IAJoCA,KAMnF,GAAIA,GAAuBI,EAAM,EAC7B,OAAOT,EAAK,uBAAwBM,GAExCD,IAEJ,SACJ,KAAK,GACD,GAAKA,EAAsBI,EAAM,GAAoD,IAA7CpY,EAAM2U,WAAWqD,EAAsB,GAC3E,OAAOL,EAAK,iBAAkBK,GAElC,SAIZ,OAAc,IAAVK,EAEWV,EADNG,EAAmBF,GAAiBG,EAA2BD,EACpD,8BAEA,sBAF+BF,GAIzB,IAAfU,EACAX,EAAK,sBAAuBE,IAGvCW,GAAU,GACH1E,GDwPU8E,CAAQ1X,EAAKwW,GAEb,CAACxW,GAGd6S,EAAUD,EAAO,GAEjBK,EAAe,IAGnBD,EAAY2E,IAAM,WACd,IAAI/Y,EACEkH,EAAakN,EAAY7b,GAAK2H,EAAMtZ,OAM1C,OAJIwtB,EAAY7b,EAAIub,IAChB9T,EAAU+T,EACVK,EAAY7b,EAAIub,GAEb,CACH5M,WAAUA,EACV4M,SAAUM,EAAY7b,EACtBwb,6BAA8B/T,EAC9BgZ,mBAAoB5E,EAAY7b,GAAK2H,EAAMtZ,OAAS,EACpDqyB,aAAc/Y,EAAMkU,EAAY7b,KAIjC6b,GExWI,IAAA8E,GAnCf,SAASC,EAAcC,GACnB,MAAO,CACHC,MAAO,GACPnjB,IAAK,SAAS4b,EAAMpR,GAGhBoR,EAAOA,EAAKnX,cAGR5S,KAAKsxB,MAAMj0B,eAAe0sB,GAG9B/pB,KAAKsxB,MAAMvH,GAAQpR,GAEvB4Y,YAAa,SAASpwB,GAAT,IAKZqwB,EAAAxxB,KAJG7C,OAAOs0B,KAAKtwB,GAAWwM,SACnB,SAAAoc,GACIyH,EAAKrjB,IAAI4b,EAAM5oB,EAAU4oB,QAGrC7c,IAAK,SAAS6c,GACV,OAAO/pB,KAAKsxB,MAAMvH,IAAWsH,GAAQA,EAAKnkB,IAAK6c,IAEnD2H,kBAAmB,WACf,OAAO1xB,KAAKsxB,OAEhBK,QAAS,WACL,OAAOP,EAAcpxB,OAEzBgZ,OAAQ,SAASqY,GACb,OAAOD,EAAaC,KAKjBD,CAAc,MCnChBQ,GAAqB,CAC9BC,eAAe,GAGNC,GAAyB,CAClCD,eAAe,GCHbE,GAAY,SAAStjB,EAAOJ,EAAO6F,EAAiB8d,EAAUC,EAAaliB,GAC7E/P,KAAKyO,MAAQA,EACbzO,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,EACjBlU,KAAKgyB,SAAWA,EAChBhyB,KAAKiyB,iBAAsC,IAAhBA,GAAuCA,EAClEjyB,KAAKwqB,WAAY,EACjBxqB,KAAKgQ,mBAAmBD,IAG5BgiB,GAAU30B,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC5C/L,KAAM,YACNiO,KAAI,WACA,OAAO,IAAIkjB,GAAU/xB,KAAKyO,MAAOzO,KAAK4N,OAAQ5N,KAAK6N,UAAW7N,KAAKgyB,SAAUhyB,KAAKiyB,YAAajyB,KAAK+P,mBAExGR,iBAAQ6C,GACJ,OAAOA,EAAMrE,OAAS/N,KAAK+N,UAAYqE,EAAMrE,QAAU,OAAIlM,GAE/DiM,cAAa,WACT,OAAO9N,KAAKiyB,aAEhB/jB,OAAM,SAACF,EAASQ,GACZxO,KAAK8M,YAAcolB,QAAQlyB,KAAKyO,OAC5BzO,KAAK8M,aACL0B,EAAOL,IAAInO,KAAKyO,MAAOzO,KAAK6N,UAAW7N,KAAK4N,OAAQ5N,KAAKgyB,aCkBrE,IAAMG,GAAS,SAASA,EAAOnkB,EAAS2P,EAASxQ,EAAUilB,GAEvD,IAAIC,EADJD,EAAeA,GAAgB,EAE/B,IAAM/F,EAAcP,KAEpB,SAAShsB,EAAMC,EAAKa,GAChB,MAAM,IAAIkX,EACN,CACIzJ,MAAOge,EAAY7b,EACnBhP,SAAU2L,EAAS3L,SACnBZ,KAAMA,GAAQ,SACdqX,QAASlY,GAEb4d,GAUR,SAASzd,EAAKH,EAAKsO,EAAOzN,GACjBoN,EAAQskB,OACT1wB,EAAO1B,KACH,IAAK4X,EACD,CACIzJ,MAAOA,MAAAA,EAAAA,EAASge,EAAY7b,EAC5BhP,SAAU2L,EAAS3L,SACnBZ,KAAMA,EAAO,GAAG7C,OAAA6C,EAAK2xB,cAAa,YAAa,UAC/Cta,QAASlY,GAEb4d,GACDzM,YAKf,SAASshB,EAAOC,EAAK1yB,GAEjB,IAAM0X,EAAUgb,aAAe7Z,SAAY6Z,EAAIn1B,KAAK+0B,GAAWhG,EAAYyB,IAAI2E,GAC/E,GAAIhb,EACA,OAAOA,EAGX3X,EAAMC,IAAuB,iBAAR0yB,EACf,oBAAaA,EAAG,WAAA10B,OAAUsuB,EAAYkD,cAAgB,KACtD,qBAIV,SAASmD,EAAWD,EAAK1yB,GACrB,GAAIssB,EAAY4B,MAAMwE,GAClB,OAAOA,EAEX3yB,EAAMC,GAAO,aAAAhC,OAAa00B,EAAG,WAAA10B,OAAUsuB,EAAYkD,cAAgB,MAGvE,SAASoD,EAAatkB,GAClB,IAAM7M,EAAW2L,EAAS3L,SAE1B,MAAO,CACHoxB,WAAYta,EAAkBjK,EAAOge,EAAYoD,YAAYtZ,KAAO,EACpE0c,SAAUrxB,GA+ClB,MAAO,CACH6qB,YAAWA,EACX1O,QAAOA,EACPxQ,SAAQA,EACR2lB,UAvCJ,SAAmBzZ,EAAK0Z,EAAW/U,GAC/B,IAAIvG,EACEub,EAAc,GACdC,EAAS5G,EAEf,IACI4G,EAAOtD,MAAMtW,GAAK,GAAO,SAActZ,EAAKsO,GACxC2P,EAAS,CACL/F,QAASlY,EACTsO,MAAOA,EAAQ+jB,OAGvB,IAAK,IAAI5f,EAAI,EAAGU,SAAIA,EAAI6f,EAAUvgB,GAAKA,IACnCiF,EAAS4a,EAAQnf,KACjB8f,EAAYxyB,KAAKiX,GAAU,MAGfwb,EAAOjC,MACX7R,WACRnB,EAAS,KAAMgV,GAGfhV,GAAS,EAAM,MAErB,MAAOxe,GACL,MAAM,IAAIsY,EAAU,CAChBzJ,MAAO7O,EAAE6O,MAAQ+jB,EACjBna,QAASzY,EAAEyY,SACZ0F,EAASxQ,EAAS3L,YAkBzBhE,MAAO,SAAU6b,EAAK2E,EAAUkV,GAC5B,IAAIhU,EAEAiU,EACAC,EACAC,EAHAC,EAAM,KAINC,EAAU,GAed,GAZIL,GAAkBA,EAAeM,oBACjCnB,EAAQoB,OAAS,WACHpH,EAAYyB,IAAI,iBAEtBhuB,EAAM,8EAKlBqzB,EAAcD,GAAkBA,EAAeC,WAAc,GAAAp1B,OAAGo0B,EAAOuB,cAAcR,EAAeC,YAAW,MAAO,GACtHC,EAAcF,GAAkBA,EAAeE,WAAc,KAAAr1B,OAAKo0B,EAAOuB,cAAcR,EAAeE,aAAgB,GAElHplB,EAAQlM,cAER,IADA,IAAM6xB,EAAgB3lB,EAAQlM,cAAc8xB,mBACnClzB,EAAI,EAAGA,EAAIizB,EAAc90B,OAAQ6B,IACtC2Y,EAAMsa,EAAcjzB,GAAGmzB,QAAQxa,EAAK,CAAErL,QAAOA,EAAE2P,QAAOA,EAAExQ,SAAQA,KAIpEgmB,GAAeD,GAAkBA,EAAeY,UAChDP,GAAYL,GAAkBA,EAAeY,OAAUZ,EAAeY,OAAS,IAAMX,GACrFE,EAAU1V,EAAQoW,sBACV5mB,EAAS3L,UAAY6xB,EAAQlmB,EAAS3L,WAAa,EAC3D6xB,EAAQlmB,EAAS3L,WAAa+xB,EAAQ10B,QAK1Cwa,EAAMka,GAFNla,EAAMA,EAAIxc,QAAQ,SAAU,OAERA,QAAQ,UAAW,IAAMu2B,EAC7CzV,EAAQvF,SAASjL,EAAS3L,UAAY6X,EAMtC,IACIgT,EAAYsD,MAAMtW,EAAKrL,EAAQ4hB,YAAY,SAAc7vB,EAAKsO,GAC1D,MAAM,IAAIyJ,EAAU,CAChBzJ,MAAKA,EACLzN,KAAM,QACNqX,QAASlY,EACTyB,SAAU2L,EAAS3L,UACpBmc,MAGPrD,GAAK3N,KAAKvP,UAAUI,MAAQwC,KAC5Bkf,EAAO,IAAI5E,GAAK0Z,QAAQ,KAAMh0B,KAAKqyB,QAAQ4B,WAC3C3Z,GAAK3N,KAAKvP,UAAU2P,SAAWmS,EAC/BA,EAAKA,MAAO,EACZA,EAAK2J,WAAY,EACjB3J,EAAKiS,iBAAmBA,GAAiBQ,UAE3C,MAAOnyB,GACL,OAAOwe,EAAS,IAAIlG,EAAUtY,EAAGme,EAASxQ,EAAS3L,WAWvD,IAAM0yB,EAAU7H,EAAY2E,MAC5B,IAAKkD,EAAQ/U,WAAY,CAErB,IAAIlH,EAAUic,EAAQlI,6BAEjB/T,IACDA,EAAU,qBACmB,MAAzBic,EAAQhD,aACRjZ,GAAW,iCACqB,MAAzBic,EAAQhD,aACfjZ,GAAW,iCACJic,EAAQjD,qBACfhZ,GAAW,iCAInBqb,EAAM,IAAIxb,EAAU,CAChBlX,KAAM,QACNqX,QAAOA,EACP5J,MAAO6lB,EAAQnI,SACfvqB,SAAU2L,EAAS3L,UACpBmc,GAGP,IAAMc,EAAS,SAAAjf,GAGX,OAFAA,EAAI8zB,GAAO9zB,GAAKme,EAAQ7d,QAGdN,aAAasY,IACftY,EAAI,IAAIsY,EAAUtY,EAAGme,EAASxQ,EAAS3L,WAGpCwc,EAASxe,IAGTwe,EAAS,KAAMkB,IAI9B,IAA+B,IAA3BlR,EAAQmmB,eAIR,OAAO1V,IAHP,IAAIkN,GAASpN,cAAcZ,EAASc,GAC/BQ,IAAIC,IAmCjBmT,QAASA,EAAU,CAgBf4B,QAAS,WAKL,IAJA,IAEIzmB,EAFE4mB,EAAQp0B,KAAKo0B,MACflV,EAAO,KAGE,CACT,KACI1R,EAAOxN,KAAKkqB,WAEZhL,EAAK1e,KAAKgN,GAGd,GAAI6e,EAAY5F,SACZ,MAEJ,GAAI4F,EAAYgD,KAAK,KACjB,MAIJ,GADA7hB,EAAOxN,KAAKq0B,aAERnV,EAAOA,EAAKnhB,OAAOyP,QAMvB,GAFAA,EAAO4mB,EAAME,cAAgBt0B,KAAKu0B,eAAiBH,EAAM92B,MAAK,GAAO,IACjE0C,KAAKmjB,WAAanjB,KAAKw0B,gBAAkBx0B,KAAKy0B,SAASn3B,QAAU0C,KAAK00B,SAEtExV,EAAK1e,KAAKgN,OACP,CAEH,IADA,IAAImnB,GAAiB,EACdtI,EAAY4B,MAAM,MACrB0G,GAAiB,EAErB,IAAKA,EACD,OAKZ,OAAOzV,GAKXgL,QAAS,WACL,GAAImC,EAAYc,aAAatuB,OAAQ,CACjC,IAAMqrB,EAAUmC,EAAYc,aAAa/L,QACzC,OAAO,IAAI9G,GAAY,QAAE4P,EAAQgD,KAAMhD,EAAQ8C,cAAe9C,EAAQ7b,MAAQ+jB,EAAcjlB,KAOpGsnB,SAAU,CACNG,YAAa,WACT,OAAOvC,EAAQ+B,MAAM92B,MAAK,GAAM,IAOpCu3B,OAAQ,SAAUC,GACd,IAAIzb,EACEhL,EAAQge,EAAY7b,EACtBukB,GAAY,EAGhB,GADA1I,EAAYgB,OACRhB,EAAY4B,MAAM,KAClB8G,GAAY,OACT,GAAID,EAEP,YADAzI,EAAYiB,UAKhB,GADAjU,EAAMgT,EAAYgC,UAOlB,OAFAhC,EAAYoB,SAEL,IAAInT,GAAW,OAAEjB,EAAIhF,OAAO,GAAIgF,EAAIG,OAAO,EAAGH,EAAIxa,OAAS,GAAIk2B,EAAW1mB,EAAQ+jB,EAAcjlB,GALnGkf,EAAYiB,WAapB5a,QAAS,WACL,IAAMsiB,EAAI3I,EAAY4B,MAAM,MAAQ5B,EAAYyB,IAAI,2DACpD,GAAIkH,EACA,OAAO1a,GAAKrK,MAAMwC,YAAYuiB,IAAM,IAAI1a,GAAY,QAAE0a,IAW9D13B,KAAM,WACF,IAAIysB,EACAnY,EACA+G,EACEtK,EAAQge,EAAY7b,EAG1B,IAAI6b,EAAYgD,KAAK,WAOrB,GAHAhD,EAAYgB,OAEZtD,EAAOsC,EAAYyB,IAAI,iCACvB,CAOA,GAFA/D,EAAOA,EAAK,IACZpR,EAAO3Y,KAAKi1B,eAAelL,MAEvBnY,EAAO+G,EAAKnb,UACAmb,EAAKuc,KAEb,OADA7I,EAAYoB,SACL7b,EAMf,GAFAA,EAAO5R,KAAKiT,UAAUrB,GAEjBya,EAAY4B,MAAM,KAOvB,OAFA5B,EAAYoB,SAEL,IAAInT,GAAS,KAAEyP,EAAMnY,EAAMvD,EAAQ+jB,EAAcjlB,GANpDkf,EAAYiB,QAAQ,sDAjBpBjB,EAAYoB,UA0BpB0H,gBAAiB,WACb,IAAIC,EACAxjB,EACEvD,EAAQge,EAAY7b,EAK1B,GAHA6b,EAAYgB,OAEZ+H,EAAY/I,EAAYyB,IAAI,YAC5B,CAKAsH,EAAYA,EAAUC,UAAU,EAAGD,EAAUv2B,OAAS,GAEtD,IACI4P,EADA2Z,EAAOpoB,KAAKs1B,eAWhB,GARIlN,IACA3Z,EAAQzO,KAAKyO,SAGb2Z,GAAQ3Z,IACRmD,EAAO,CAAC,IAAK0I,GAAgB,YAAE8N,EAAM3Z,EAAO,KAAM,KAAM4d,EAAY7b,EAAI4hB,EAAcjlB,GAAU,KAG/Fkf,EAAY4B,MAAM,KAOvB,OAFA5B,EAAYoB,SAEL,IAAInT,GAAS,KAAE8a,EAAWxjB,EAAMvD,EAAQ+jB,EAAcjlB,GANzDkf,EAAYiB,QAAQ,sDAlBpBjB,EAAYoB,UAoCpBwH,eAAgB,SAAUlL,GAItB,MAAO,CACHrZ,MAAS6kB,EAAElD,EAAQmD,SAAS,GAC5BC,QAASF,EAAEG,GACXC,GAASJ,EAAEG,IACb3L,EAAKnX,eAEP,SAAS2iB,EAAE/3B,EAAO03B,GACd,MAAO,CACH13B,MAAKA,EACL03B,KAAIA,GAKZ,SAASQ,IACL,MAAO,CAAClD,EAAOH,EAAQqD,UAAW,yBAI1CziB,UAAW,SAAU2iB,GACjB,IAEIC,EACApnB,EAHAqnB,EAAYF,GAAY,GACtBG,EAAgB,GAMtB,IAFA1J,EAAYgB,SAEC,CACT,GAAIuI,EACAA,GAAW,MACR,CAEH,KADAnnB,EAAQ4jB,EAAQ2D,mBAAqBh2B,KAAKi2B,cAAgB5D,EAAQ6D,cAE9D,MAGAznB,EAAMA,OAA+B,GAAtBA,EAAMA,MAAM5P,SAC3B4P,EAAQA,EAAMA,MAAM,IAGxBqnB,EAAUt1B,KAAKiO,GAGf4d,EAAY4B,MAAM,OAIlB5B,EAAY4B,MAAM,MAAQ4H,KAC1BA,GAAuB,EACvBpnB,EAASqnB,EAAUj3B,OAAS,EAAKi3B,EAAU,GACrC,IAAIxb,GAAKoR,MAAMoK,GACrBC,EAAcv1B,KAAKiO,GACnBqnB,EAAY,IAKpB,OADAzJ,EAAYoB,SACLoI,EAAuBE,EAAgBD,GAElDK,QAAS,WACL,OAAOn2B,KAAKo2B,aACLp2B,KAAKyR,SACLzR,KAAK60B,UACL70B,KAAKq2B,qBAShBJ,WAAY,WACR,IAAItjB,EACAlE,EAGJ,GAFA4d,EAAYgB,OACZ1a,EAAM0Z,EAAYyB,IAAI,iBAKtB,GAAKzB,EAAY4B,MAAM,KAAvB,CAKA,GADAxf,EAAQ4jB,EAAQiE,SAGZ,OADAjK,EAAYoB,SACL,IAAInT,GAAe,WAAE3H,EAAKlE,GAEjC4d,EAAYiB,eARZjB,EAAYiB,eAJZjB,EAAYiB,WAuBpBiJ,IAAK,WACD,IAAI9nB,EACEJ,EAAQge,EAAY7b,EAI1B,GAFA6b,EAAYU,mBAAoB,EAE3BV,EAAY8B,KAAK,QAYtB,OAPA1f,EAAQzO,KAAK60B,UAAY70B,KAAKgpB,YAAchpB,KAAKw2B,YACzCnK,EAAYyB,IAAI,+BAAiC,GAEzDzB,EAAYU,mBAAoB,EAEhC2F,EAAW,KAEJ,IAAIpY,GAAQ,SAAmBzY,IAAhB4M,EAAMA,OACxBA,aAAiB6L,GAAKmc,UACtBhoB,aAAiB6L,GAAKoc,SACtBjoB,EAAQ,IAAI6L,GAAc,UAAE7L,EAAOJ,GAAQA,EAAQ+jB,EAAcjlB,GAdjEkf,EAAYU,mBAAoB,GAyBxC/D,SAAU,WACN,IAAI2N,EACA5M,EACE1b,EAAQge,EAAY7b,EAG1B,GADA6b,EAAYgB,OACsB,MAA9BhB,EAAYkD,gBAA0BxF,EAAOsC,EAAYyB,IAAI,eAAgB,CAE7E,GAAW,OADX6I,EAAKtK,EAAYkD,gBACQ,MAAPoH,IAAetK,EAAYmD,WAAWnf,MAAM,OAAQ,CAElE,IAAMoH,EAAS4a,EAAQmC,aAAazK,GACpC,GAAItS,EAEA,OADA4U,EAAYoB,SACLhW,EAIf,OADA4U,EAAYoB,SACL,IAAInT,GAAa,SAAEyP,EAAM1b,EAAQ+jB,EAAcjlB,GAE1Dkf,EAAYiB,WAIhBsJ,cAAe,WACX,IAAIC,EACExoB,EAAQge,EAAY7b,EAE1B,GAAkC,MAA9B6b,EAAYkD,gBAA0BsH,EAAQxK,EAAYyB,IAAI,mBAC9D,OAAO,IAAIxT,GAAa,SAAE,WAAIuc,EAAM,IAAMxoB,EAAQ+jB,EAAcjlB,IAQxEqpB,SAAU,WACN,IAAIzM,EACE1b,EAAQge,EAAY7b,EAE1B,GAAkC,MAA9B6b,EAAYkD,gBAA0BxF,EAAOsC,EAAYyB,IAAI,cAC7D,OAAO,IAAIxT,GAAa,SAAEyP,EAAM1b,EAAQ+jB,EAAcjlB,IAK9D2pB,cAAe,WACX,IAAID,EACExoB,EAAQge,EAAY7b,EAE1B,GAAkC,MAA9B6b,EAAYkD,gBAA0BsH,EAAQxK,EAAYyB,IAAI,oBAC9D,OAAO,IAAIxT,GAAa,SAAE,WAAIuc,EAAM,IAAMxoB,EAAQ+jB,EAAcjlB,IAUxEsE,MAAO,WACH,IAAIvB,EAGJ,GAFAmc,EAAYgB,OAEsB,MAA9BhB,EAAYkD,gBAA0Brf,EAAMmc,EAAYyB,IAAI,mEACvD5d,EAAI,GAEL,OADAmc,EAAYoB,SACL,IAAInT,GAAU,MAAEpK,EAAI,QAAIrO,EAAWqO,EAAI,IAGtDmc,EAAYiB,WAGhByJ,aAAc,WACV1K,EAAYgB,OACZ,IAAMN,EAAoBV,EAAYU,kBACtCV,EAAYU,mBAAoB,EAChC,IAAMiI,EAAI3I,EAAYyB,IAAI,6BAE1B,GADAzB,EAAYU,kBAAoBA,EAC3BiI,EAAL,CAIA3I,EAAYiB,UACZ,IAAM7b,EAAQ6I,GAAKrK,MAAMwC,YAAYuiB,GACrC,OAAIvjB,GACA4a,EAAY8B,KAAK6G,GACVvjB,QAFX,EALI4a,EAAYoB,UAgBpB2I,UAAW,WACP,IAAI/J,EAAYqD,iBAAhB,CAIA,IAAMjhB,EAAQ4d,EAAYyB,IAAI,kCAC9B,OAAIrf,EACO,IAAI6L,GAAc,UAAE7L,EAAM,GAAIA,EAAM,SAD/C,IAUJ4nB,kBAAmB,WACf,IAAIW,EAGJ,GADAA,EAAK3K,EAAYyB,IAAI,sCAEjB,OAAO,IAAIxT,GAAsB,kBAAE0c,EAAG,KAS9CC,WAAY,WACR,IAAIC,EACE7oB,EAAQge,EAAY7b,EAE1B6b,EAAYgB,OAEZ,IAAM8J,EAAS9K,EAAY4B,MAAM,KAGjC,GAFgB5B,EAAY4B,MAAM,KAElC,CAMA,GADAiJ,EAAK7K,EAAYyB,IAAI,WAGjB,OADAzB,EAAYoB,SACL,IAAInT,GAAe,WAAE4c,EAAG1d,OAAO,EAAG0d,EAAGr4B,OAAS,GAAIqzB,QAAQiF,GAAS9oB,EAAQ+jB,EAAcjlB,GAEpGkf,EAAYiB,QAAQ,sCAThBjB,EAAYiB,YAkBxBtE,SAAU,WACN,IAAIe,EAEJ,GAAkC,MAA9BsC,EAAYkD,gBAA0BxF,EAAOsC,EAAYyB,IAAI,mBAAsB,OAAO/D,EAAK,IAWvGyK,aAAc,SAAU4C,GACpB,IAAIC,EACE7mB,EAAI6b,EAAY7b,EAChB8mB,IAAYF,EACdrN,EAAOqN,EAIX,GAFA/K,EAAYgB,OAERtD,GAAuC,MAA9BsC,EAAYkD,gBACjBxF,EAAOsC,EAAYyB,IAAI,yBAA2B,CAItD,KAFAuJ,EAAUr3B,KAAKo0B,MAAMmD,iBAEHD,GAAsC,OAA3BjL,EAAY8B,KAAK,OAAgC,OAAZpE,EAAK,IAEnE,YADAsC,EAAYiB,QAAQ,2CAInBgK,IACDvN,EAAOA,EAAK,IAGhB,IAAMzsB,EAAO,IAAIgd,GAAKkd,aAAazN,EAAMvZ,EAAGrD,GAC5C,OAAKmqB,GAAWjF,EAAQrB,OACpB3E,EAAYoB,SACLnwB,IAGP+uB,EAAYoB,SACL,IAAInT,GAAKmd,eAAen6B,EAAM+5B,EAAS7mB,EAAGrD,IAIzDkf,EAAYiB,WAMhB9K,OAAQ,SAASkV,GACb,IAAIvR,EACA3mB,EAEAylB,EACAxC,EACAD,EAHEnU,EAAQge,EAAY7b,EAK1B,GAAK6b,EAAY8B,KAAKuJ,EAAS,YAAc,YAA7C,CAIA,EAAG,CACCzS,EAAS,KACTkB,EAAW,KAEX,IADA,IAAIwR,GAAQ,IACH1S,EAASoH,EAAYyB,IAAI,4BAC9BtuB,EAAIQ,KAAK43B,aASJD,GAASn4B,EAAEwU,WAAWvF,OACvBvO,EAAK,wGAAyGmO,GAGlHspB,GAAQ,EACJxR,EACAA,EAAS3lB,KAAKhB,GAEd2mB,EAAW,CAAE3mB,GAIrBylB,EAASA,GAAUA,EAAO,GACrBkB,GACDrmB,EAAM,0CAEV0iB,EAAS,IAAIlI,GAAW,OAAE,IAAIA,GAAa,SAAE6L,GAAWlB,EAAQ5W,EAAQ+jB,EAAcjlB,GAClFsV,EACAA,EAAWjiB,KAAKgiB,GAEhBC,EAAa,CAAED,SAEd6J,EAAY4B,MAAM,MAQ3B,OANAuE,EAAO,OAEHkF,GACAlF,EAAO,MAGJ/P,IAMX4R,WAAY,WACR,OAAOr0B,KAAKwiB,QAAO,IAMvB4R,MAAO,CAiBH92B,KAAM,SAAUg6B,EAASO,GACrB,IAEIR,EAEAlR,EACAvU,EACAkmB,EACAC,EAPE9rB,EAAIogB,EAAYkD,cAClB9D,GAAY,EAEVpd,EAAQge,EAAY7b,EAKtBwnB,GAAW,EAEf,GAAU,MAAN/rB,GAAmB,MAANA,EAAjB,CAMA,GAJAogB,EAAYgB,OAEZlH,EAAWnmB,KAAKmmB,WAEF,CAeV,GAdA4R,EAAc1L,EAAY7b,EACtB6b,EAAY4B,MAAM,OAClB+J,EAAW3L,EAAYqB,cAAc,GACrC9b,EAAO5R,KAAK4R,MAAK,GAAMA,KACvB8gB,EAAW,KACXoF,GAAY,EACRE,GACA93B,EAAK,iFAAkF63B,EAAa,gBAI1F,IAAdF,IACAR,EAAUr3B,KAAKu3B,gBAED,IAAdM,IAAuBR,EAEvB,YADAhL,EAAYiB,UAIhB,GAAIgK,IAAYD,IAAYS,EAGxB,YADAzL,EAAYiB,UAQhB,IAJKgK,GAAWjF,EAAQ5G,cACpBA,GAAY,GAGZ6L,GAAWjF,EAAQrB,MAAO,CAC1B3E,EAAYoB,SACZ,IAAM2G,EAAQ,IAAI9Z,GAAK8Z,MAAU,KAAEjO,EAAUvU,EAAMvD,EAAQ+jB,EAAcjlB,GAAWkqB,GAAW5L,GAC/F,OAAI4L,EACO,IAAI/c,GAAKmd,eAAerD,EAAOiD,IAGjCS,GACD53B,EAAK,oDAAqD63B,EAAa,cAEpE3D,IAKnB/H,EAAYiB,YAMhBnH,SAAU,WAON,IANA,IAAIA,EACA3mB,EACA+Q,EACA0nB,EACAC,EACEC,EAAK,wDAEPD,EAAY7L,EAAY7b,EACxBhR,EAAI6sB,EAAYyB,IAAIqK,IAKpBF,EAAO,IAAI3d,GAAY,QAAE/J,EAAG/Q,GAAG,EAAO04B,EAAY9F,EAAcjlB,GAC5DgZ,EACAA,EAAS3lB,KAAKy3B,GAEd9R,EAAW,CAAE8R,GAEjB1nB,EAAI8b,EAAY4B,MAAM,KAE1B,OAAO9H,GAEXvU,KAAM,SAAUwmB,GACZ,IAKIvC,EACAwC,EACAtO,EACAuO,EACA7pB,EACAgkB,EACA8F,EAXE9D,EAAWpC,EAAQoC,SACnB+D,EAAW,CAAE5mB,KAAK,KAAM6mB,UAAU,GACpCC,EAAc,GACZ3C,EAAgB,GAChBD,EAAY,GAQd6C,GAAS,EAIb,IAFAtM,EAAYgB,SAEC,CACT,GAAI+K,EACA3F,EAAMJ,EAAQ2D,mBAAqB3D,EAAQ6D,iBACxC,CAEH,GADA7J,EAAYc,aAAatuB,OAAS,EAC9BwtB,EAAY8B,KAAK,OAAQ,CACzBqK,EAASC,UAAW,EAChBpM,EAAY4B,MAAM,OAAS4H,IAC3BA,GAAuB,IAE1BA,EAAuBE,EAAgBD,GACnCt1B,KAAK,CAAEi4B,UAAU,IACtB,MAEJhG,EAAMgC,EAASzL,YAAcyL,EAAS+B,YAAc/B,EAAS0B,WAAa1B,EAAS/hB,WAAa1S,KAAK1C,MAAK,GAG9G,IAAKm1B,IAAQkG,EACT,MAGJL,EAAW,KACP7F,EAAImG,mBACJnG,EAAImG,oBAERnqB,EAAQgkB,EACR,IAAI7a,EAAM,KAWV,GATIwgB,EAEI3F,EAAIhkB,OAA6B,GAApBgkB,EAAIhkB,MAAM5P,SACvB+Y,EAAM6a,EAAIhkB,MAAM,IAGpBmJ,EAAM6a,EAGN7a,IAAQA,aAAe0C,GAAKmc,UAAY7e,aAAe0C,GAAKoc,UAC5D,GAAIrK,EAAY4B,MAAM,KAAM,CAUxB,GATIyK,EAAY75B,OAAS,IACjBg3B,GACA/1B,EAAM,yCAEVu4B,GAA0B,KAG9B5pB,EAAQ4jB,EAAQ2D,mBAAqB3D,EAAQ6D,cAEjC,CACR,IAAIkC,EAKA,OAFA/L,EAAYiB,UACZkL,EAAS5mB,KAAO,GACT4mB,EAJP14B,EAAM,iDAOdw4B,EAAYvO,EAAOnS,EAAImS,UACpB,GAAIsC,EAAY8B,KAAK,OAAQ,CAChC,IAAKiK,EAAQ,CACTI,EAASC,UAAW,EAChBpM,EAAY4B,MAAM,OAAS4H,IAC3BA,GAAuB,IAE1BA,EAAuBE,EAAgBD,GACnCt1B,KAAK,CAAEupB,KAAM0I,EAAI1I,KAAM0O,UAAU,IACtC,MAEAF,GAAS,OAELH,IACRrO,EAAOuO,EAAW1gB,EAAImS,KACtBtb,EAAQ,MAIZA,GACAiqB,EAAYl4B,KAAKiO,GAGrBqnB,EAAUt1B,KAAK,CAAEupB,KAAKuO,EAAU7pB,QAAO8pB,OAAMA,IAEzClM,EAAY4B,MAAM,KAClB0K,GAAS,IAGbA,EAAoC,MAA3BtM,EAAY4B,MAAM,OAEb4H,KAENwC,GACAv4B,EAAM,yCAGV+1B,GAAuB,EAEnB6C,EAAY75B,OAAS,IACrB4P,EAAQ,IAAI6L,GAAU,MAAEoe,IAE5B3C,EAAcv1B,KAAK,CAAEupB,KAAIA,EAAEtb,MAAKA,EAAE8pB,OAAMA,IAExCxO,EAAO,KACP2O,EAAc,GACdL,GAA0B,GAMlC,OAFAhM,EAAYoB,SACZ+K,EAAS5mB,KAAOikB,EAAuBE,EAAgBD,EAChD0C,GAqBXlE,WAAY,WACR,IAAIvK,EAEA1Z,EACA8S,EACA0V,EAHAC,EAAS,GAITL,GAAW,EACf,KAAmC,MAA9BpM,EAAYkD,eAAuD,MAA9BlD,EAAYkD,eAClDlD,EAAYgD,KAAK,aAOrB,GAHAhD,EAAYgB,OAEZhd,EAAQgc,EAAYyB,IAAI,gEACb,CACP/D,EAAO1Z,EAAM,GAEb,IAAM0oB,EAAU/4B,KAAK4R,MAAK,GAS1B,GARAknB,EAASC,EAAQnnB,KACjB6mB,EAAWM,EAAQN,UAOdpM,EAAY4B,MAAM,KAEnB,YADA5B,EAAYiB,QAAQ,uBAYxB,GARAjB,EAAYc,aAAatuB,OAAS,EAE9BwtB,EAAY8B,KAAK,UACjB0K,EAAOrG,EAAOH,EAAQ2G,WAAY,uBAGtC7V,EAAUkP,EAAQ4G,QAId,OADA5M,EAAYoB,SACL,IAAInT,GAAK8Z,MAAgB,WAAErK,EAAM+O,EAAQ3V,EAAS0V,EAAMJ,GAE/DpM,EAAYiB,eAGhBjB,EAAYiB,WAIpBiK,YAAa,WACT,IAAInP,EACEiP,EAAU,GAEhB,GAAkC,MAA9BhL,EAAYkD,cAAhB,CAIA,OAAa,CAGT,GAFAlD,EAAYgB,SACZjF,EAAOpoB,KAAKk5B,gBACU,KAAT9Q,EAAa,CACtBiE,EAAYiB,UACZ,MAEJ+J,EAAQ72B,KAAK4nB,GACbiE,EAAYoB,SAEhB,OAAI4J,EAAQx4B,OAAS,EACVw4B,OADX,IAKJ6B,YAAa,WAGT,GAFA7M,EAAYgB,OAEPhB,EAAY4B,MAAM,KAAvB,CAKA,IAAMlE,EAAOsC,EAAYyB,IAAI,gCAE7B,GAAKzB,EAAY4B,MAAM,KAKvB,OAAIlE,GAAiB,KAATA,GACRsC,EAAYoB,SACL1D,QAGXsC,EAAYiB,UATRjB,EAAYiB,eAPZjB,EAAYiB,YAuBxBgJ,OAAQ,WACJ,IAAM7B,EAAWz0B,KAAKy0B,SAEtB,OAAOz0B,KAAKkqB,WAAauK,EAAS0B,WAAa1B,EAASzL,YAAcyL,EAAS8B,OAC3E9B,EAAS+B,YAAc/B,EAASn3B,QAAUm3B,EAAS/hB,WAAa1S,KAAKo0B,MAAM92B,MAAK,IAChFm3B,EAASwC,cAQjBjG,IAAK,WACD,OAAO3E,EAAY4B,MAAM,MAAQ5B,EAAYgD,KAAK,MAQtDmG,QAAS,WACL,IAAI/mB,EAGJ,GAAK4d,EAAYyB,IAAI,cAOrB,OANArf,EAAQ4d,EAAYyB,IAAI,WAEpBrf,EAAQ+jB,EAAOH,EAAQoC,SAASzL,SAAU,yBAC1Cva,EAAQ,KAAK1Q,OAAA0Q,EAAMsb,KAAKlX,MAAM,GAAE,MAEpC6f,EAAW,KACJ,IAAIpY,GAAK6e,OAAO,GAAI,iBAAiBp7B,OAAA0Q,EAAQ,OAexDmpB,QAAS,WACL,IAAIp4B,EACA+Q,EACAM,EACExC,EAAQge,EAAY7b,EAY1B,GAVAD,EAAIvQ,KAAKgU,eAGTxU,EAAI6sB,EAAYyB,IAAI,uBAEhBzB,EAAYyB,IAAI,+EAChBzB,EAAY4B,MAAM,MAAQ5B,EAAY4B,MAAM,MAAQjuB,KAAKo5B,aACzD/M,EAAYyB,IAAI,kBAAqBzB,EAAYyB,IAAI,gBACrD9tB,KAAKy0B,SAASmC,iBAId,GADAvK,EAAYgB,OACRhB,EAAY4B,MAAM,KAClB,GAAKpd,EAAI7Q,KAAKgkB,UAAS,GAAS,CAE5B,IADA,IAAIX,EAAY,GACTgJ,EAAY4B,MAAM,MACrB5K,EAAU7iB,KAAKqQ,GACfwS,EAAU7iB,KAAK,IAAIuxB,GAAU,MAC7BlhB,EAAI7Q,KAAKgkB,UAAS,GAEtBX,EAAU7iB,KAAKqQ,GAEXwb,EAAY4B,MAAM,MAEdzuB,EADA6jB,EAAUxkB,OAAS,EACf,IAAKyb,GAAU,MAAE,IAAI0M,GAAS3D,IAE9B,IAAI/I,GAAU,MAAEzJ,GAExBwb,EAAYoB,UAEZpB,EAAYiB,QAAQ,4BAGxBjB,EAAYiB,QAAQ,4BAGxBjB,EAAYoB,SAIpB,GAAIjuB,EAAK,OAAO,IAAI8a,GAAY,QAAE/J,EAAG/Q,EAAGA,aAAa8a,GAAKmc,SAAUpoB,EAAQ+jB,EAAcjlB,IAY9F6G,WAAY,WACR,IAAIzD,EAAI8b,EAAYkD,cAEpB,GAAU,MAANhf,EAAW,CACX8b,EAAYgB,OACZ,IAAMgM,EAAoBhN,EAAYyB,IAAI,gBAC1C,GAAIuL,EAEA,OADAhN,EAAYoB,SACL,IAAInT,GAAe,WAAE+e,GAEhChN,EAAYiB,UAGhB,GAAU,MAAN/c,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,EAAW,CAM/D,IALA8b,EAAY7b,IACF,MAAND,GAA2C,MAA9B8b,EAAYkD,gBACzBhf,EAAI,KACJ8b,EAAY7b,KAET6b,EAAYqB,gBAAkBrB,EAAY7b,IACjD,OAAO,IAAI8J,GAAe,WAAE/J,GACzB,OAAI8b,EAAYqB,cAAc,GAC1B,IAAIpT,GAAe,WAAE,KAErB,IAAIA,GAAe,WAAE,OAYpC0J,SAAU,SAAUsV,GAChB,IACInT,EACA1D,EACAlS,EACA/Q,EACA+iB,EACAgX,EACA7D,EAPErnB,EAAQge,EAAY7b,EAS1B,IADA8oB,GAAoB,IAAXA,GACDA,IAAW7W,EAAaziB,KAAKwiB,WAAe8W,IAAWC,EAAOlN,EAAY8B,KAAK,WAAc3uB,EAAIQ,KAAK43B,cACtG2B,EACA7D,EAAYlD,EAAOxyB,KAAKg5B,WAAY,sBAC7BtD,EACP51B,EAAM,qDACC2iB,EAEHF,EADAA,EACaA,EAAWxkB,OAAO0kB,GAElBA,GAGbF,GAAcziB,EAAM,kDACxByQ,EAAI8b,EAAYkD,cACZ9hB,MAAMC,QAAQlO,IACdA,EAAEmO,SAAQ,SAAA6rB,GAAO,OAAArT,EAAS3lB,KAAKg5B,MAC7BrT,EACFA,EAAS3lB,KAAKhB,GAEd2mB,EAAW,CAAE3mB,GAEjBA,EAAI,MAEE,MAAN+Q,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,KAK5D,GAAI4V,EAAY,OAAO,IAAI7L,GAAa,SAAE6L,EAAU5D,EAAYmT,EAAWrnB,EAAQ+jB,EAAcjlB,GAC7FoV,GAAcziB,EAAM,2EAE5BujB,UAAW,WAGP,IAFA,IAAIpX,EACAoX,GAEApX,EAAIjM,KAAKgkB,cAILX,EACAA,EAAU7iB,KAAKyL,GAEfoX,EAAY,CAAEpX,GAElBogB,EAAYc,aAAatuB,OAAS,EAC9BoN,EAAEypB,WAAarS,EAAUxkB,OAAS,GAClCiB,EAAM,2DAELusB,EAAY4B,MAAM,OACnBhiB,EAAEypB,WACF51B,EAAM,2DAEVusB,EAAYc,aAAatuB,OAAS,EAEtC,OAAOwkB,GAEX+V,UAAW,WACP,GAAK/M,EAAY4B,MAAM,KAAvB,CAEA,IACItb,EACAiF,EACA7I,EAKA0qB,EAREhF,EAAWz0B,KAAKy0B,SAwBtB,OAdM9hB,EAAM8hB,EAASmC,mBACjBjkB,EAAM6f,EAAO,mDAGjBzjB,EAAKsd,EAAYyB,IAAI,iBAEjBlW,EAAM6c,EAASI,UAAYxI,EAAYyB,IAAI,aAAezB,EAAYyB,IAAI,YAAc2G,EAASmC,mBAE7F6C,EAAMpN,EAAYyB,IAAI,YAI9B4E,EAAW,KAEJ,IAAIpY,GAAc,UAAE3H,EAAK5D,EAAI6I,EAAK6hB,KAO7CR,MAAO,WACH,IAAIS,EACJ,GAAIrN,EAAY4B,MAAM,OAASyL,EAAU15B,KAAKi0B,YAAc5H,EAAY4B,MAAM,KAC1E,OAAOyL,GAIfC,aAAc,WACV,IAAIV,EAAQj5B,KAAKi5B,QAKjB,OAHIA,IACAA,EAAQ,IAAI3e,GAAK0Z,QAAQ,KAAMiF,IAE5BA,GAGXjD,gBAAiB,WACb,IAAI+C,EACAD,EACAL,EAGJ,GADApM,EAAYgB,QACRhB,EAAYyB,IAAI,aAQhBgL,GADAC,EAAU/4B,KAAKo0B,MAAMxiB,MAAK,IACTA,KACjB6mB,EAAWM,EAAQN,SACdpM,EAAY4B,MAAM,MAV3B,CAeA,IAAM0L,EAAe35B,KAAK25B,eAC1B,GAAIA,EAEA,OADAtN,EAAYoB,SACRqL,EACO,IAAIxe,GAAK8Z,MAAMwF,WAAW,KAAMd,EAAQa,EAAc,KAAMlB,GAEhE,IAAIne,GAAKuf,gBAAgBF,GAEpCtN,EAAYiB,eAZJjB,EAAYiB,WAkBxBnK,QAAS,WACL,IAAIE,EACAnD,EACA+J,EAUJ,GARAoC,EAAYgB,OAERrf,EAAQ8rB,kBACR7P,EAAY0I,EAAatG,EAAY7b,KAGzC6S,EAAYrjB,KAAKqjB,eAECnD,EAAQlgB,KAAKi5B,SAAU,CACrC5M,EAAYoB,SACZ,IAAMtK,EAAU,IAAI7I,GAAY,QAAE+I,EAAWnD,EAAOlS,EAAQ+rB,eAI5D,OAHI/rB,EAAQ8rB,kBACR3W,EAAQ8G,UAAYA,GAEjB9G,EAEPkJ,EAAYiB,WAGpBiH,YAAa,WACT,IAAIxK,EACAtb,EAEAurB,EAEAvO,EACAN,EACAlX,EALE5F,EAAQge,EAAY7b,EAEpBD,EAAI8b,EAAYkD,cAKtB,GAAU,MAANhf,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,EAK3C,GAHA8b,EAAYgB,OAEZtD,EAAO/pB,KAAKgpB,YAAchpB,KAAKs1B,eACrB,CAWN,IAVArhB,EAA6B,iBAAT8V,KAGhBtb,EAAQzO,KAAKg2B,qBAETgE,GAAQ,GAIhB3N,EAAYc,aAAatuB,OAAS,GAC7B4P,EAAO,CAmBR,GAfA0c,GAASlX,GAAc8V,EAAKlrB,OAAS,GAAKkrB,EAAKpN,MAAMlO,MAK7CA,EAFJsb,EAAK,GAAGtb,OAAuC,OAA9Bsb,EAAK,GAAGtb,MAAMoE,MAAM,EAAG,GACpCwZ,EAAY4B,MAAM,KACV,IAAI8D,GAAU,IAEd/xB,KAAKi6B,gBAAgB,QAAQ,GAMjCj6B,KAAKk6B,iBAKb,OAFA7N,EAAYoB,SAEL,IAAInT,GAAgB,YAAEyP,EAAMtb,GAAO,EAAO0c,EAAO9c,EAAQ+jB,EAAcjlB,GAG7EsB,IACDA,EAAQzO,KAAKyO,SAGbA,EACAgd,EAAYzrB,KAAKyrB,YACVxX,IAOPxF,EAAQzO,KAAKi6B,mBAIrB,GAAIxrB,IAAUzO,KAAKgxB,OAASgJ,GAExB,OADA3N,EAAYoB,SACL,IAAInT,GAAgB,YAAEyP,EAAMtb,EAAOgd,EAAWN,EAAO9c,EAAQ+jB,EAAcjlB,GAGlFkf,EAAYiB,eAGhBjB,EAAYiB,WAGpB4M,eAAgB,WACZ,IAAM7rB,EAAQge,EAAY7b,EACpBH,EAAQgc,EAAYyB,IAAI,2BAC9B,GAAIzd,EACA,OAAO,IAAIiK,GAAc,UAAEjK,EAAM,GAAIhC,EAAQ+jB,IAcrD6H,gBAAiB,SAAUE,GACvB,IAAI3pB,EACAhR,EACA46B,EACA3rB,EACEsf,EAAMoM,GAAe,IACrB9rB,EAAQge,EAAY7b,EACpBiH,EAAS,GAEf,SAAS4iB,IACL,IAAMlL,EAAO9C,EAAYkD,cACzB,MAAmB,iBAARxB,EACAoB,IAASpB,EAETA,EAAI7R,KAAKiT,GAGxB,IAAIkL,IAAJ,CAGA5rB,EAAQ,GACR,IACIjP,EAAIQ,KAAKkqB,WAELzb,EAAMjO,KAAKhB,KAGfA,EAAIQ,KAAKs2B,WAEL7nB,EAAMjO,KAAKhB,GAEX6sB,EAAYgD,KAAK,OACjB5gB,EAAMjO,KAAK,IAAK8Z,GAAc,UAAE,IAAK+R,EAAY7b,IACjD6b,EAAY4B,MAAM,aAEjBzuB,GAIT,GAFA46B,EAAOC,IAEH5rB,EAAM5P,OAAS,EAAG,CAElB,GADA4P,EAAQ,IAAI6L,GAAe,WAAE7L,GACzB2rB,EACA,OAAO3rB,EAGPgJ,EAAOjX,KAAKiO,GAGe,MAA3B4d,EAAYmD,YACZ/X,EAAOjX,KAAK,IAAI8Z,GAAKyX,UAAU,IAAK1jB,IAO5C,GAJAge,EAAYgB,OAEZ5e,EAAQ4d,EAAYmC,YAAYT,GAErB,CAIP,GAHqB,iBAAVtf,GACP3O,EAAM,aAAa/B,OAAA0Q,OAAU,SAEZ,IAAjBA,EAAM5P,QAA6B,MAAb4P,EAAM,GAE5B,OADA4d,EAAYoB,SACL,IAAInT,GAAKyX,UAAU,GAAI1jB,GAGlC,IAAIyG,SACJ,IAAKtE,EAAI,EAAGA,EAAI/B,EAAM5P,OAAQ2R,IAE1B,GADAsE,EAAOrG,EAAM+B,GACT/C,MAAMC,QAAQoH,GAEd2C,EAAOjX,KAAK,IAAI8Z,GAAK6e,OAAOrkB,EAAK,GAAIA,EAAK,IAAI,EAAMzG,EAAOlB,QAE1D,CACGqD,IAAM/B,EAAM5P,OAAS,IACrBiW,EAAOA,EAAKjB,QAGhB,IAAM6a,EAAQ,IAAIpU,GAAK6e,OAAO,IAAMrkB,GAAM,EAAMzG,EAAOlB,GACjC,aAEJ+O,KAAKpH,IACnB5U,EAAK,8FAA+FmO,EAAO,cAF7F,cAIJ6N,KAAKpH,IACf5U,EAAK,wGAAyGmO,EAAO,cAEzHqgB,EAAM4L,cAAgB,yBACtB5L,EAAM6L,UAAY,2BAClB9iB,EAAOjX,KAAKkuB,GAIpB,OADArC,EAAYoB,SACL,IAAInT,GAAKkR,WAAW/T,GAAQ,GAEvC4U,EAAYiB,YAahBkN,OAAU,WACN,IAAIve,EACAwe,EACEpsB,EAAQge,EAAY7b,EAEpBkqB,EAAMrO,EAAYyB,IAAI,eAE5B,GAAI4M,EAAK,CACL,IAAM39B,GAAW29B,EAAM16B,KAAK26B,gBAAkB,OAAS,GAEvD,GAAK1e,EAAOjc,KAAKy0B,SAASI,UAAY70B,KAAKy0B,SAAS8B,MAQhD,OAPAkE,EAAWz6B,KAAK46B,cAAc,IAEzBvO,EAAY4B,MAAM,OACnB5B,EAAY7b,EAAInC,EAChBvO,EAAM,gEAEV26B,EAAWA,GAAY,IAAIngB,GAAU,MAAEmgB,GAChC,IAAIngB,GAAW,OAAE2B,EAAMwe,EAAU19B,EAASsR,EAAQ+jB,EAAcjlB,GAGvEkf,EAAY7b,EAAInC,EAChBvO,EAAM,gCAKlB66B,cAAe,WACX,IAAIE,EAEAC,EACArsB,EAFE1R,EAAU,GAKhB,IAAKsvB,EAAY4B,MAAM,KAAQ,OAAO,KACtC,GAEI,GADA4M,EAAI76B,KAAK+6B,eACF,CAGH,OADAtsB,GAAQ,EADRqsB,EAAaD,GAGT,IAAK,MACDC,EAAa,OACbrsB,GAAQ,EACR,MACJ,IAAK,OACDqsB,EAAa,WACbrsB,GAAQ,EAIhB,GADA1R,EAAQ+9B,GAAcrsB,GACjB4d,EAAY4B,MAAM,KAAQ,aAE9B4M,GAET,OADAnI,EAAW,KACJ31B,GAGXg+B,aAAc,WACV,IAAM99B,EAAMovB,EAAYyB,IAAI,uDAC5B,GAAI7wB,EACA,OAAOA,EAAI,IAInB+9B,aAAc,SAAUC,GACpB,IAEIz7B,EACA0T,EACAgoB,EAJEzG,EAAWz0B,KAAKy0B,SAChBnnB,EAAQ,GAIV6tB,GAAU,EACd9O,EAAYgB,OACZ,GACIhB,EAAYgB,OACRhB,EAAYyB,IAAI,sBAChBqN,GAAU,GAEd9O,EAAYiB,WAEZ9tB,EAAIi1B,EAASU,gBAAgB7zB,KAAKtB,KAA9By0B,IAAyCA,EAAS/hB,WAAa+hB,EAASzL,YAAcyL,EAASG,eAE/FtnB,EAAM9M,KAAKhB,GACJ6sB,EAAY4B,MAAM,OACzB/a,EAAIlT,KAAKw2B,WACTnK,EAAYgB,QACPna,GAAK+nB,EAAcpJ,eAAiBxF,EAAYyB,IAAI,uCACrDzB,EAAYiB,UACZpa,EAAIlT,KAAK01B,YAETrJ,EAAYgB,QACZ6N,EAASl7B,KAAKo7B,gBAAgB,KAAMloB,EAAEmoB,UAElChP,EAAYiB,YAGhBjB,EAAYiB,UACZ9tB,EAAIQ,KAAKyO,SAET4d,EAAY4B,MAAM,KACd/a,IAAM1T,GACN8N,EAAM9M,KAAK,IAAK8Z,GAAU,MAAE,IAAKA,GAAkB,cAAEpH,EAAEnE,GAAImE,EAAEooB,OAAQpoB,EAAEmoB,OAAQH,EAASA,EAAOnsB,GAAK,KAAMmsB,EAASA,EAAOG,OAAS,KAAMnoB,EAAEtF,UAC3IpO,EAAI0T,GACGA,GAAK1T,GACZ8N,EAAM9M,KAAK,IAAK8Z,GAAU,MAAE,IAAKA,GAAgB,YAAEpH,EAAG1T,EAAG,KAAM,KAAM6sB,EAAY7b,EAAI4hB,EAAcjlB,GAAU,KACxGguB,IACD7tB,EAAMA,EAAMzO,OAAS,GAAG0U,WAAY,GAExC4nB,GAAU,GACH37B,GACP8N,EAAM9M,KAAK,IAAI8Z,GAAU,MAAE9a,IAC3B27B,GAAU,GAEVr7B,EAAM,yCAGVA,EAAM,sBAAyB,gBAGlCN,GAGT,GADA6sB,EAAYoB,SACRngB,EAAMzO,OAAS,EACf,OAAO,IAAIyb,GAAe,WAAEhN,IAIpCstB,cAAe,SAAUK,GACrB,IAEIz7B,EAFEi1B,EAAWz0B,KAAKy0B,SAChBgG,EAAW,GAEjB,GAEI,GADAj7B,EAAIQ,KAAKg7B,aAAaC,GACf,CAEH,GADAR,EAASj6B,KAAKhB,IACT6sB,EAAY4B,MAAM,KAAQ,MACrBwM,EAASA,EAAS57B,OAAS,GAAG0U,YACpCknB,EAASA,EAAS57B,OAAS,GAAG0U,WAAY,QAI9C,GADA/T,EAAIi1B,EAASzL,YAAcyL,EAASG,cAC7B,CAEH,GADA6F,EAASj6B,KAAKhB,IACT6sB,EAAY4B,MAAM,KAAQ,MACrBwM,EAASA,EAAS57B,OAAS,GAAG0U,YACpCknB,EAASA,EAAS57B,OAAS,GAAG0U,WAAY,UAIjD/T,GAET,OAAOi7B,EAAS57B,OAAS,EAAI47B,EAAW,MAG5Cc,4BAA6B,SAAUC,EAAUntB,EAAO4b,EAAWgR,GAC/D,IAAMR,EAAWz6B,KAAK46B,cAAcK,GAE9B/a,EAAQlgB,KAAKi5B,QAEd/Y,GACDpgB,EAAM,iEAGVusB,EAAYoB,SAEZ,IAAMgO,EAAS,IAAK,EAAUvb,EAAOua,EAAUpsB,EAAQ+jB,EAAcjlB,GAKrE,OAJIa,EAAQ8rB,kBACR2B,EAAOxR,UAAYA,GAGhBwR,GAGXC,eAAgB,WACZ,IAAIzR,EACE5b,EAAQge,EAAY7b,EAO1B,GALIxC,EAAQ8rB,kBACR7P,EAAY0I,EAAatkB,IAE7Bge,EAAYgB,OAERhB,EAAY6B,UAAU,KAAM,CAC5B,GAAI7B,EAAY8B,KAAK,UACjB,OAAOnuB,KAAKu7B,4BAA4BjhB,GAAKqhB,MAAOttB,EAAO4b,EAAW2H,IAG1E,GAAIvF,EAAY8B,KAAK,cACjB,OAAOnuB,KAAKu7B,4BAA4BjhB,GAAKshB,UAAWvtB,EAAO4b,EAAW6H,IAIlFzF,EAAYiB,WAShBmG,OAAQ,WACJ,IAAIxX,EACArK,EACA7U,EACEsR,EAAQge,EAAY7b,EAG1B,GAFc6b,EAAYyB,IAAI,eAErB,CAaL,GATI/wB,GAHJ6U,EAAO5R,KAAK67B,cAGE,CACNA,WAAYjqB,EACZ6O,UAAU,GAIJ,CAAEA,UAAU,GAGrBxE,EAAOjc,KAAKy0B,SAASI,UAAY70B,KAAKy0B,SAAS8B,MAMhD,OAJKlK,EAAY4B,MAAM,OACnB5B,EAAY7b,EAAInC,EAChBvO,EAAM,kCAEH,IAAIwa,GAAW,OAAE2B,EAAM,KAAMlf,EAASsR,EAAQ+jB,EAAcjlB,GAGnEkf,EAAY7b,EAAInC,EAChBvO,EAAM,iCAKlB+7B,WAAY,WAGR,GADAxP,EAAYgB,QACPhB,EAAY4B,MAAM,KAEnB,OADA5B,EAAYiB,UACL,KAEX,IAAM1b,EAAOya,EAAYyB,IAAI,qBAC7B,OAAIlc,EAAK,IACLya,EAAYoB,SACL7b,EAAK,GAAGiC,SAGfwY,EAAYiB,UACL,OAGfwO,cAAe,SAAUrtB,EAAOsb,EAAMgS,GAWlC,OAVAttB,EAAQzO,KAAKi6B,gBAAgB,SAC7B8B,EAA0C,MAA9B1P,EAAYkD,cACnB9gB,EAKKA,EAAMA,QACZA,EAAQ,MALHstB,GAA0C,MAA9B1P,EAAYkD,eACzBzvB,EAAM,GAAG/B,OAAOgsB,EAAM,gDAMvB,CAACtb,EAAOstB,IAEnBC,YAAa,SAAU9b,EAAOzR,EAAO+S,EAAUya,GAO3C,GANA/b,EAAQlgB,KAAK25B,eACbtN,EAAYgB,OACPnN,GAAUsB,IACX/S,EAAQzO,KAAKs2B,SACbpW,EAAQlgB,KAAK25B,gBAEZzZ,GAAUsB,EAkBX6K,EAAYoB,aAlBS,CACrBpB,EAAYiB,UACZ,IAAI9tB,EAAI,GAER,IADAiP,EAAQzO,KAAKs2B,SACNjK,EAAY4B,MAAM,MACrBzuB,EAAEgB,KAAKiO,GACPA,EAAQzO,KAAKs2B,SAEb7nB,GAASjP,EAAEX,OAAS,GACpBW,EAAEgB,KAAKiO,GACPA,EAAQjP,EACRy8B,GAAgB,GAGhB/b,EAAQlgB,KAAK25B,eAOrB,MAAO,CAACzZ,EAAOzR,EAAOwtB,IAO1BvH,OAAQ,WACJ,IACI3K,EACAtb,EACAyR,EACAgc,EACAC,EACAC,EACAC,EAPEhuB,EAAQge,EAAY7b,EAQtBurB,GAAW,EACXva,GAAW,EACXya,GAAgB,EAEpB,GAAkC,MAA9B5P,EAAYkD,cAAhB,CAGA,GADA9gB,EAAQzO,KAAa,UAAOA,KAAKyzB,UAAYzzB,KAAK07B,iBAE9C,OAAOjtB,EAOX,GAJA4d,EAAYgB,OAEZtD,EAAOsC,EAAYyB,IAAI,aAEvB,CAOA,OALAoO,EAAwBnS,EACF,KAAlBA,EAAK1V,OAAO,IAAa0V,EAAKlY,QAAQ,IAAK,GAAK,IAChDqqB,EAAwB,IAAIn+B,OAAAgsB,EAAKlX,MAAMkX,EAAKlY,QAAQ,IAAK,GAAK,KAG1DqqB,GACJ,IAAK,WACDC,GAAgB,EAChBJ,GAAW,EACX,MACJ,IAAK,aACDK,GAAgB,EAChBL,GAAW,EACX,MACJ,IAAK,aACL,IAAK,iBACDI,GAAgB,EAChB,MACJ,IAAK,YACL,IAAK,YACDE,GAAa,EACb7a,GAAW,EACX,MACJ,IAAK,kBAGL,IAAK,SACDA,GAAW,EACX,MACJ,QACI6a,GAAa,EAMrB,GAFAhQ,EAAYc,aAAatuB,OAAS,EAE9Bs9B,GACA1tB,EAAQzO,KAAKs2B,WAETx2B,EAAM,YAAA/B,OAAYgsB,EAAI,qBAEvB,GAAIqS,GACP3tB,EAAQzO,KAAKk2B,eAETp2B,EAAM,YAAA/B,OAAYgsB,EAAI,qBAEvB,GAAIsS,EAAY,CAEnB5tB,GADM6tB,EAAiBt8B,KAAK87B,cAAcrtB,EAAOsb,EAAMgS,IAChC,GACvBA,EAAWO,EAAe,GAG9B,GAAIP,EAAU,CACV,IAQUO,EARNC,EAAev8B,KAAKg8B,YAAY9b,EAAOzR,EAAO+S,EAAUya,GAK5D,GAJA/b,EAAQqc,EAAa,GACrB9tB,EAAQ8tB,EAAa,GACrBN,EAAgBM,EAAa,IAExBrc,IAAUmc,EACXhQ,EAAYiB,UACZvD,EAAOsC,EAAYyB,IAAI,aAEvBrf,GADM6tB,EAAiBt8B,KAAK87B,cAAcrtB,EAAOsb,EAAMgS,IAChC,IACvBA,EAAWO,EAAe,MAGtBpc,GADAqc,EAAev8B,KAAKg8B,YAAY9b,EAAOzR,EAAO+S,EAAUya,IACnC,GACrBxtB,EAAQ8tB,EAAa,GACrBN,EAAgBM,EAAa,IAKzC,GAAIrc,GAAS+b,IAAmBF,GAAYttB,GAAS4d,EAAY4B,MAAM,KAEnE,OADA5B,EAAYoB,SACL,IAAInT,GAAW,OAAEyP,EAAMtb,EAAOyR,EAAO7R,EAAQ+jB,EAAcjlB,EAC9Da,EAAQ8rB,gBAAkBnH,EAAatkB,GAAS,KAChDmT,GAIR6K,EAAYiB,QAAQ,qCAWxB7e,MAAO,WACH,IAAIjP,EACEk5B,EAAc,GACdrqB,EAAQge,EAAY7b,EAE1B,GAEI,IADAhR,EAAIQ,KAAKk2B,gBAELwC,EAAYl4B,KAAKhB,IACZ6sB,EAAY4B,MAAM,MAAQ,YAE9BzuB,GAET,GAAIk5B,EAAY75B,OAAS,EACrB,OAAO,IAAIyb,GAAU,MAAEoe,EAAarqB,EAAQ+jB,IAGpD3G,UAAW,WACP,GAAkC,MAA9BY,EAAYkD,cACZ,OAAOlD,EAAYyB,IAAI,kBAG/B0O,IAAK,WACD,IAAIxtB,EACAxP,EAGJ,GADA6sB,EAAYgB,OACRhB,EAAY4B,MAAM,KAElB,OADAjf,EAAIhP,KAAKy8B,aACApQ,EAAY4B,MAAM,MACvB5B,EAAYoB,UACZjuB,EAAI,IAAI8a,GAAe,WAAE,CAACtL,KACxB0tB,QAAS,EACJl9B,QAEX6sB,EAAYiB,QAAQ,gBAGxBjB,EAAYiB,WAEhBqP,aAAc,WACVtQ,EAAYgB,OAGZ,IAAMhd,EAAQgc,EAAYyB,IAAI,iBAC9B,GAAIzd,EACA,OAAO,IAAIiK,GAAKsiB,QAAQvsB,EAAM,IAGlCgc,EAAYiB,WAEhBuP,eAAgB,WACZ,IAAIpxB,EACAuD,EACAD,EACA+tB,EACAC,EAEJ,GADAtxB,EAAIzL,KAAKg9B,UACF,CAEH,IADAD,EAAW1Q,EAAYqB,cAAc,IAE7BrB,EAAYgD,KAAK,YADZ,CAQT,GAHAhD,EAAYgB,SAEZte,EAAKsd,EAAY4B,MAAM,MAAQ5B,EAAY4B,MAAM,MACxC,CACL,IAAI5f,EAAQge,EAAY7b,GACxBzB,EAAKsd,EAAY8B,KAAK,QAElBjuB,EAAK,4BAA6BmO,EAAO,cAIjD,IAAKU,EAAI,CAAEsd,EAAYoB,SAAU,MAIjC,KAFAze,EAAIhP,KAAKg9B,WAED,CAAE3Q,EAAYiB,UAAW,MACjCjB,EAAYoB,SAEZhiB,EAAEwxB,YAAa,EACfjuB,EAAEiuB,YAAa,EACfH,EAAY,IAAIxiB,GAAc,UAAEvL,EAAI,CAAC+tB,GAAarxB,EAAGuD,GAAI+tB,GACzDA,EAAW1Q,EAAYqB,cAAc,GAEzC,OAAOoP,GAAarxB,IAG5BgxB,SAAU,WACN,IAAIhxB,EACAuD,EACAD,EACA+tB,EACAC,EAEJ,GADAtxB,EAAIzL,KAAK68B,iBACF,CAEH,IADAE,EAAW1Q,EAAYqB,cAAc,IAEjC3e,EAAKsd,EAAYyB,IAAI,cAAiBiP,IAAa1Q,EAAY4B,MAAM,MAAQ5B,EAAY4B,MAAM,SAI/Fjf,EAAIhP,KAAK68B,mBAKTpxB,EAAEwxB,YAAa,EACfjuB,EAAEiuB,YAAa,EACfH,EAAY,IAAIxiB,GAAc,UAAEvL,EAAI,CAAC+tB,GAAarxB,EAAGuD,GAAI+tB,GACzDA,EAAW1Q,EAAYqB,cAAc,GAEzC,OAAOoP,GAAarxB,IAG5ButB,WAAY,WACR,IAAIhqB,EACAC,EAEAymB,EADErnB,EAAQge,EAAY7b,EAI1B,GADAxB,EAAIhP,KAAK01B,WAAU,GACZ,CACH,KACSrJ,EAAYgD,KAAK,qBAAwBhD,EAAY4B,MAAM,OAGhEhf,EAAIjP,KAAK01B,WAAU,KAInBA,EAAY,IAAIpb,GAAc,UAAE,KAAMob,GAAa1mB,EAAGC,EAAGZ,EAAQ+jB,GAErE,OAAOsD,GAAa1mB,IAG5B0mB,UAAW,SAAUwH,GACjB,IAAIzlB,EACA0lB,EACAC,EAMJ,GADA3lB,EAASzX,KAAKq9B,aAAaH,GAC3B,CAIA,GADAC,EAPW9Q,EAAY8B,KAAK,MAQf,CAET,KADAiP,EAAOp9B,KAAK01B,UAAUwH,IAIlB,OAFAzlB,EAAS,IAAI6C,GAAc,UAAE6iB,EAAS1lB,EAAQ2lB,GAKtD,OAAO3lB,IAEX4lB,aAAc,SAAUH,GACpB,IAAIzlB,EACA0lB,EACAC,EAGMvE,EAFJzoB,EAAOpQ,KAab,GADAyX,GAVUohB,EAAOzoB,EAAKktB,iBAAiBJ,IAAgB9sB,EAAKmtB,qBAAqBL,KAC/DA,EAGPrE,EAFIzoB,EAAKgrB,gBAAgB8B,GASpC,CAIA,GADAC,EAPW9Q,EAAY8B,KAAK,OAQf,CAET,KADAiP,EAAOp9B,KAAKq9B,aAAaH,IAIrB,OAFAzlB,EAAS,IAAI6C,GAAc,UAAE6iB,EAAS1lB,EAAQ2lB,GAKtD,OAAO3lB,IAEX6lB,iBAAkB,SAAUJ,GACxB,GAAI7Q,EAAY8B,KAAK,OAAQ,CACzB,IAAM1W,EAASzX,KAAKu9B,qBAAqBL,GAIzC,OAHIzlB,IACAA,EAAO+lB,QAAU/lB,EAAO+lB,QAErB/lB,IAGf8lB,qBAAsB,SAAUL,GAiB5B,IAAIO,EAEJ,GADApR,EAAYgB,OACPhB,EAAY8B,KAAK,KAAtB,CAKA,GADAsP,EAtBA,SAA2CC,GACvC,IAAID,EAGJ,GAFApR,EAAYgB,OACZoQ,EAAOC,EAAGhI,UAAUwH,GACpB,CAIA,GAAK7Q,EAAY4B,MAAM,KAKvB,OADA5B,EAAYoB,SACLgQ,EAJHpR,EAAYiB,eAJZjB,EAAYiB,UAiBbqQ,CAAkC39B,MAGrC,OADAqsB,EAAYoB,SACLgQ,EAIX,GADAA,EAAOz9B,KAAKo7B,gBAAgB8B,GAC5B,CAIA,GAAK7Q,EAAY4B,MAAM,KAKvB,OADA5B,EAAYoB,SACLgQ,EAJHpR,EAAYiB,QAAQ,qBAAqBvvB,OAAAsuB,EAAYkD,cAAgB,WAJrElD,EAAYiB,eAXZjB,EAAYiB,WAqBpB8N,gBAAiB,SAAU8B,EAAaU,GACpC,IAEI5uB,EACAC,EACAsB,EACAxB,EALE0lB,EAAWz0B,KAAKy0B,SAChBpmB,EAAQge,EAAY7b,EAMpBqoB,EAAO,WACT,OAAO74B,KAAKy8B,YAAchI,EAAS/hB,WAAa+hB,EAASI,UAAYJ,EAASG,eAC/EtzB,KAAKtB,MAQR,GALIgP,EADA4uB,GAGI/E,IAqCJ,OAjCIxM,EAAY4B,MAAM,KAEdlf,EADAsd,EAAY4B,MAAM,KACb,KAEA,IAGT5B,EAAY4B,MAAM,KAEdlf,EADAsd,EAAY4B,MAAM,KACb,KAEA,IAGT5B,EAAY4B,MAAM,OAEdlf,EADAsd,EAAY4B,MAAM,KACb,KACE5B,EAAY4B,MAAM,KACpB,KAEA,KAGTlf,GACAE,EAAI4pB,KAEAtoB,EAAI,IAAI+J,GAAc,UAAEvL,EAAIC,EAAGC,EAAGZ,EAAQ+jB,GAAc,GAExDtyB,EAAM,uBAEF89B,IACRrtB,EAAI,IAAI+J,GAAc,UAAE,IAAKtL,EAAG,IAAIsL,GAAY,QAAE,QAASjM,EAAQ+jB,GAAc,IAE9E7hB,GAQfysB,QAAS,WACL,IACIQ,EADE/I,EAAWz0B,KAAKy0B,SAGlBpI,EAAYgD,KAAK,aACjBmO,EAASnR,EAAY4B,MAAM,MAG/B,IAAI4M,EAAI76B,KAAKw8B,OAAS/H,EAAS2B,aACvB3B,EAAShjB,SAAWgjB,EAASzL,YAC7ByL,EAAS+B,YAAc/B,EAASn3B,QAChCm3B,EAASI,QAAO,IAASJ,EAASsC,gBAClC/2B,KAAK28B,gBAAkBlI,EAASG,cAOxC,OALI4I,IACA3C,EAAEoC,YAAa,EACfpC,EAAI,IAAIvgB,GAAa,SAAEugB,IAGpBA,GAUX3E,WAAY,WACR,IACI12B,EACAq+B,EAFEpJ,EAAW,GAGXpmB,EAAQge,EAAY7b,EAE1B,KACIhR,EAAIQ,KAAKkqB,YACC1qB,EAAEwtB,gBAIZxtB,EAAIQ,KAAKy8B,YAAcz8B,KAAKs2B,oBAEXhc,GAAK6P,UAClB3qB,EAAI,MAGJA,IACAi1B,EAASj0B,KAAKhB,GAET6sB,EAAYgD,KAAK,aAClBwO,EAAQxR,EAAY4B,MAAM,OAEtBwG,EAASj0B,KAAK,IAAI8Z,GAAc,UAAEujB,EAAOxvB,EAAQ+jB,MAfzDqC,EAASj0B,KAAKhB,SAmBbA,GACT,GAAIi1B,EAAS51B,OAAS,EAClB,OAAO,IAAIyb,GAAe,WAAEma,IAGpC+B,SAAU,WACN,IAAMzM,EAAOsC,EAAYyB,IAAI,8BAC7B,GAAI/D,EACA,OAAOA,EAAK,IAGpBuL,aAAc,WACV,IAEIrpB,EACA+oB,EAHAjL,EAAO,GACL1b,EAAQ,GAIdge,EAAYgB,OAEZ,IAAMyQ,EAAiBzR,EAAYyB,IAAI,yBACvC,GAAIgQ,EAGA,OAFA/T,EAAO,CAAC,IAAIzP,GAAY,QAAEwjB,EAAe,KACzCzR,EAAYoB,SACL1D,EAGX,SAAS1Z,EAAM8nB,GACX,IAAM3nB,EAAI6b,EAAY7b,EAChBpC,EAAQie,EAAYyB,IAAIqK,GAC9B,GAAI/pB,EAEA,OADAC,EAAM7N,KAAKgQ,GACJuZ,EAAKvpB,KAAK4N,EAAM,IAK/B,IADAiC,EAAM,UAEGA,EAAM,sCAKf,GAAK0Z,EAAKlrB,OAAS,GAAMwR,EAAM,sBAAuB,CASlD,IARAgc,EAAYoB,SAII,KAAZ1D,EAAK,KACLA,EAAK3I,QACL/S,EAAM+S,SAEL4T,EAAI,EAAGA,EAAIjL,EAAKlrB,OAAQm2B,IACzB/oB,EAAI8d,EAAKiL,GACTjL,EAAKiL,GAAsB,MAAhB/oB,EAAEoI,OAAO,IAA8B,MAAhBpI,EAAEoI,OAAO,GACvC,IAAIiG,GAAY,QAAErO,GACD,MAAhBA,EAAEoI,OAAO,GACN,IAAIiG,GAAa,SAAE,IAAIvc,OAAAkO,EAAE4G,MAAM,GAAI,IAAMxE,EAAM2mB,GAAK5C,EAAcjlB,GAClE,IAAImN,GAAa,SAAE,IAAIvc,OAAAkO,EAAE4G,MAAM,GAAI,IAAMxE,EAAM2mB,GAAK5C,EAAcjlB,GAE9E,OAAO4c,EAEXsC,EAAYiB,cAK5B6E,GAAOuB,cAAgB,SAAAqK,GACnB,IAAI9xB,EAAI,GAER,IAAK,IAAM+xB,KAAQD,EACf,GAAI5gC,OAAOE,eAAeC,KAAKygC,EAAMC,GAAO,CACxC,IAAMvvB,EAAQsvB,EAAKC,GACnB/xB,GAAK,WAAiB,MAAZ+xB,EAAK,GAAc,GAAK,KAAOA,EAAS,MAAAjgC,OAAA0Q,UAAqC,MAA5BoiB,OAAOpiB,GAAOoE,OAAO,GAAc,GAAK,KAI3G,OAAO5G,GCxmFX,IAAM+a,GAAW,SAASb,EAAU1D,EAAYiT,EAAWrnB,EAAO6F,EAAiBnE,GAC/E/P,KAAKyiB,WAAaA,EAClBziB,KAAK01B,UAAYA,EACjB11B,KAAKi+B,gBAAkBvI,EACvB11B,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,EACjBlU,KAAKmmB,SAAWnmB,KAAKk+B,YAAY/X,GACjCnmB,KAAKm+B,oBAAiBt8B,EACtB7B,KAAKgQ,mBAAmBD,GACxB/P,KAAKqN,UAAUrN,KAAKmmB,SAAUnmB,OAGlCgnB,GAAS5pB,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC3C/L,KAAM,WAEN8N,gBAAOC,GACC3O,KAAKmmB,WACLnmB,KAAKmmB,SAAWxX,EAAQoM,WAAW/a,KAAKmmB,WAExCnmB,KAAKyiB,aACLziB,KAAKyiB,WAAa9T,EAAQoM,WAAW/a,KAAKyiB,aAE1CziB,KAAK01B,YACL11B,KAAK01B,UAAY/mB,EAAQC,MAAM5O,KAAK01B,aAI5CjO,cAAc,SAAAtB,EAAU1D,EAAYwb,GAChC9X,EAAWnmB,KAAKk+B,YAAY/X,GAC5B,IAAM5B,EAAc,IAAIyC,GAASb,EAAU1D,GAAcziB,KAAKyiB,WAC1D,KAAMziB,KAAKoN,WAAYpN,KAAKmN,WAAYnN,KAAK+P,kBAGjD,OAFAwU,EAAY0Z,eAAmBG,EAAwBH,GAAoCj+B,KAAKi+B,eAAtBA,EAC1E1Z,EAAY8Z,WAAar+B,KAAKq+B,WACvB9Z,GAGX2Z,qBAAYI,GACR,OAAKA,GAGc,iBAARA,GACP,IAAInM,GAAOnyB,KAAKxC,MAAMwQ,QAAShO,KAAKxC,MAAM+gC,cAAev+B,KAAK6N,UAAW7N,KAAK4N,QAAQklB,UAClFwL,EACA,CAAC,aACD,SAAShL,EAAK7b,GACV,GAAI6b,EACA,MAAM,IAAIxb,EAAU,CAChBzJ,MAAOilB,EAAIjlB,MACX4J,QAASqb,EAAIrb,SACdjY,KAAKxC,MAAMmgB,QAAS3d,KAAK6N,UAAUrM,UAE1C88B,EAAM7mB,EAAO,GAAG0O,YAGrBmY,GAhBI,CAAC,IAAIvqB,EAAQ,GAAI,KAAK,EAAO/T,KAAK4N,OAAQ5N,KAAK6N,aAmB9D2wB,qBAAoB,WAChB,IAAMC,EAAK,IAAI1qB,EAAQ,GAAI,KAAK,EAAO/T,KAAK4N,OAAQ5N,KAAK6N,WAAY6wB,EAAO,CAAC,IAAI1X,GAAS,CAACyX,GAAK,KAAM,KAAMz+B,KAAK4N,OAAQ5N,KAAK6N,YAE9H,OADA6wB,EAAK,GAAGL,YAAa,EACdK,GAGXruB,eAAM+B,GACF,IAEIusB,EACAnuB,EAHE2V,EAAWnmB,KAAKmmB,SAChBoK,EAAMpK,EAAStnB,OAMrB,GAAa,KADb8/B,GADAvsB,EAAQA,EAAMwsB,iBACD//B,SACK0xB,EAAMoO,EACpB,OAAO,EAEP,IAAKnuB,EAAI,EAAGA,EAAImuB,EAAMnuB,IAClB,GAAI2V,EAAS3V,GAAG/B,QAAU2D,EAAM5B,GAC5B,OAAO,EAKnB,OAAOmuB,GAGXC,cAAa,WACT,GAAI5+B,KAAKm+B,eACL,OAAOn+B,KAAKm+B,eAGhB,IAAIhY,EAAWnmB,KAAKmmB,SAAS7V,KAAK,SAASO,GACvC,OAAOA,EAAEmD,WAAWvF,OAASoC,EAAEpC,MAAMA,OAASoC,EAAEpC,UACjDF,KAAK,IAAI8B,MAAM,6BAUlB,OARI8V,EACoB,MAAhBA,EAAS,IACTA,EAAS/E,QAGb+E,EAAW,GAGPnmB,KAAKm+B,eAAiBhY,GAGlC0Y,qBAAoB,WAChB,OAAQ7+B,KAAKq+B,YACgB,IAAzBr+B,KAAKmmB,SAAStnB,QACa,MAA3BmB,KAAKmmB,SAAS,GAAG1X,QACsB,MAAtCzO,KAAKmmB,SAAS,GAAGnS,WAAWvF,OAAuD,KAAtCzO,KAAKmmB,SAAS,GAAGnS,WAAWvF,QAGlFI,cAAKb,GACD,IAAMiwB,EAAiBj+B,KAAK01B,WAAa11B,KAAK01B,UAAU7mB,KAAKb,GACzDmY,EAAWnmB,KAAKmmB,SAChB1D,EAAaziB,KAAKyiB,WAKtB,OAHA0D,EAAWA,GAAYA,EAAS7V,KAAI,SAAU9Q,GAAK,OAAOA,EAAEqP,KAAKb,MACjEyU,EAAaA,GAAcA,EAAWnS,KAAI,SAASkS,GAAU,OAAOA,EAAO3T,KAAKb,MAEzEhO,KAAKynB,cAActB,EAAU1D,EAAYwb,IAGpD/vB,OAAM,SAACF,EAASQ,GACZ,IAAIgC,EAIJ,IAHMxC,GAAYA,EAAQoG,eAAwD,KAAtCpU,KAAKmmB,SAAS,GAAGnS,WAAWvF,OACpED,EAAOL,IAAI,IAAKnO,KAAKmN,WAAYnN,KAAKoN,YAErCoD,EAAI,EAAGA,EAAIxQ,KAAKmmB,SAAStnB,OAAQ2R,IACxBxQ,KAAKmmB,SAAS3V,GAChBtC,OAAOF,EAASQ,IAIhCqZ,YAAW,WACP,OAAO7nB,KAAKi+B,kBC1IpB,IAAMvS,GAAQ,SAASjd,GACnB,IAAKA,EACD,MAAM,IAAIhP,MAAM,oCAEfgO,MAAMC,QAAQe,GAIfzO,KAAKyO,MAAQA,EAHbzO,KAAKyO,MAAQ,CAAEA,IAOvBid,GAAMtuB,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CACxC/L,KAAM,QAEN8N,gBAAOC,GACC3O,KAAKyO,QACLzO,KAAKyO,MAAQE,EAAQoM,WAAW/a,KAAKyO,SAI7CI,cAAKb,GACD,OAA0B,IAAtBhO,KAAKyO,MAAM5P,OACJmB,KAAKyO,MAAM,GAAGI,KAAKb,GAEnB,IAAI0d,GAAM1rB,KAAKyO,MAAM6B,KAAI,SAAUO,GACtC,OAAOA,EAAEhC,KAAKb,QAK1BE,OAAM,SAACF,EAASQ,GACZ,IAAIgC,EACJ,IAAKA,EAAI,EAAGA,EAAIxQ,KAAKyO,MAAM5P,OAAQ2R,IAC/BxQ,KAAKyO,MAAM+B,GAAGtC,OAAOF,EAASQ,GAC1BgC,EAAI,EAAIxQ,KAAKyO,MAAM5P,QACnB2P,EAAOL,IAAKH,GAAWA,EAAQ2D,SAAY,IAAM,SCpCjE,IAAMirB,GAAU,SAASnuB,GACrBzO,KAAKyO,MAAQA,GAGjBmuB,GAAQx/B,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC1C/L,KAAM,UAENsN,OAAM,SAACF,EAASQ,GACZ,GAAmB,MAAfxO,KAAKyO,MAAiB,KAAM,CAAE7N,KAAM,SAAUqX,QAAS,4BAC3DzJ,EAAOL,IAAInO,KAAKyO,UAIxBmuB,GAAQkC,KAAO,IAAIlC,GAAQ,QAC3BA,GAAQmC,MAAQ,IAAInC,GAAQ,SCX5B,IAAMoC,GAAO5nB,EAab,IAAMkT,GAAc,SAASP,EAAMtb,EAAOgd,EAAWN,EAAO9c,EAAO6F,EAAiBqL,EAAQyJ,GACxFhpB,KAAK+pB,KAAOA,EACZ/pB,KAAKyO,MAASA,aAAiB9B,EAAQ8B,EAAQ,IAAIid,GAAM,CAACjd,EAAQ,IAAIsjB,GAAUtjB,GAAS,OACzFzO,KAAKyrB,UAAYA,EAAY,IAAA1tB,OAAI0tB,EAAU5X,QAAW,GACtD7T,KAAKmrB,MAAQA,EACbnrB,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,EACjBlU,KAAKuf,OAASA,IAAU,EACxBvf,KAAKgpB,cAAyBnnB,IAAbmnB,EAA0BA,EACpCe,EAAK1V,QAA8B,MAAnB0V,EAAK1V,OAAO,GACnCrU,KAAKwqB,WAAY,EACjBxqB,KAAKqN,UAAUrN,KAAKyO,MAAOzO,OC7B/B,SAASi/B,GAAUC,GACf,MAAO,WAAWnhC,OAAAmhC,EAAIjV,UAAU2I,WAAe,MAAA70B,OAAAmhC,EAAIjV,UAAU4I,kBAGjE,SAASsM,GAAaD,GAClB,IAAIE,EAAuBF,EAAIjV,UAAU4I,SAIzC,MAHK,gBAAgB3W,KAAKkjB,KACtBA,EAAuB,UAAArhC,OAAUqhC,IAE9B,gDAAArhC,OAAgDqhC,EAAqBviC,QAAQ,cAAc,SAAUmS,GAIxG,MAHS,MAALA,IACAA,EAAI,KAED,KAAAjR,OAAKiR,0CACckwB,EAAIjV,UAAU2I,mBAGhD,SAAS3I,GAAUjc,EAASkxB,EAAKG,GAC7B,IAAI5nB,EAAS,GACb,GAAIzJ,EAAQ8rB,kBAAoB9rB,EAAQ2D,SACpC,OAAQ3D,EAAQ8rB,iBACZ,IAAK,WACDriB,EAASwnB,GAAUC,GACnB,MACJ,IAAK,aACDznB,EAAS0nB,GAAaD,GACtB,MACJ,IAAK,MACDznB,EAASwnB,GAAUC,IAAQG,GAAiB,IAAMF,GAAaD,GAI3E,OAAOznB,EDAX6S,GAAYltB,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC9C/L,KAAM,cAENsN,OAAM,SAACF,EAASQ,GACZA,EAAOL,IAAInO,KAAK+pB,MAAQ/b,EAAQ2D,SAAW,IAAM,MAAO3R,KAAKmN,WAAYnN,KAAKoN,YAC9E,IACIpN,KAAKyO,MAAMP,OAAOF,EAASQ,GAE/B,MAAOhP,GAGH,MAFAA,EAAE6O,MAAQrO,KAAK4N,OACfpO,EAAEgC,SAAWxB,KAAK6N,UAAUrM,SACtBhC,EAEVgP,EAAOL,IAAInO,KAAKyrB,WAAczrB,KAAKuf,QAAWvR,EAAQsxB,UAAYtxB,EAAQ2D,SAAa,GAAK,KAAM3R,KAAK6N,UAAW7N,KAAK4N,SAG3HiB,cAAKb,GACD,IAAwBuxB,EAA4BC,EAAhDC,GAAa,EAAiB1V,EAAO/pB,KAAK+pB,KAAkBf,EAAWhpB,KAAKgpB,SAC5D,iBAATe,IAGPA,EAAwB,IAAhBA,EAAKlrB,QAAkBkrB,EAAK,aAAc6S,GAC9C7S,EAAK,GAAGtb,MA/CxB,SAAkBT,EAAS+b,GACvB,IACIvZ,EADA/B,EAAQ,GAENuE,EAAI+W,EAAKlrB,OACT2P,EAAS,CAACL,IAAK,SAAUlC,GAAIwC,GAASxC,IAC5C,IAAKuE,EAAI,EAAGA,EAAIwC,EAAGxC,IACfuZ,EAAKvZ,GAAG3B,KAAKb,GAASE,OAAOF,EAASQ,GAE1C,OAAOC,EAuCqBixB,CAAS1xB,EAAS+b,GACtCf,GAAW,GAIF,SAATe,GAAmB/b,EAAQmJ,OAAS6nB,GAAK1qB,SACzCmrB,GAAa,EACbF,EAAWvxB,EAAQmJ,KACnBnJ,EAAQmJ,KAAO6nB,GAAKzqB,iBAExB,IAII,GAHAvG,EAAQsO,eAAe9b,KAAK,IAC5Bg/B,EAAax/B,KAAKyO,MAAMI,KAAKb,IAExBhO,KAAKgpB,UAAgC,oBAApBwW,EAAW5+B,KAC7B,KAAM,CAAEqX,QAAS,8CACb5J,MAAOrO,KAAKoN,WAAY5L,SAAUxB,KAAKmN,WAAW3L,UAE1D,IAAIiqB,EAAYzrB,KAAKyrB,UACfkU,EAAkB3xB,EAAQsO,eAAeK,MAK/C,OAJK8O,GAAakU,EAAgBlU,YAC9BA,EAAYkU,EAAgBlU,WAGzB,IAAInB,GAAYP,EACnByV,EACA/T,EACAzrB,KAAKmrB,MACLnrB,KAAKoN,WAAYpN,KAAKmN,WAAYnN,KAAKuf,OACvCyJ,GAER,MAAOxpB,GAKH,KAJuB,iBAAZA,EAAE6O,QACT7O,EAAE6O,MAAQrO,KAAKoN,WACf5N,EAAEgC,SAAWxB,KAAKmN,WAAW3L,UAE3BhC,EAEF,QACAigC,IACAzxB,EAAQmJ,KAAOooB,KAK3BK,cAAa,WACT,OAAO,IAAItV,GAAYtqB,KAAK+pB,KACxB/pB,KAAKyO,MACL,aACAzO,KAAKmrB,MACLnrB,KAAKoN,WAAYpN,KAAKmN,WAAYnN,KAAKuf,WErGnD,IAAM4K,GAAU,SAAS1b,EAAOue,EAAe3e,EAAO6F,GAClDlU,KAAKyO,MAAQA,EACbzO,KAAKgtB,cAAgBA,EACrBhtB,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,EACjBlU,KAAKwqB,WAAY,GAGrBL,GAAQ/sB,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC1C/L,KAAM,UAENsN,OAAM,SAACF,EAASQ,GACRxO,KAAKiqB,WACLzb,EAAOL,IAAIwkB,GAAa3kB,EAAShO,MAAOA,KAAKmN,WAAYnN,KAAKoN,YAElEoB,EAAOL,IAAInO,KAAKyO,QAGpB4Z,kBAASra,GACL,IAAM6xB,EAAe7xB,EAAQ2D,UAA8B,MAAlB3R,KAAKyO,MAAM,GACpD,OAAOzO,KAAKgtB,eAAiB6S,KCpBrC,IAAMC,GAAc,CAChBjxB,KAAM,WACF,IAAMgC,EAAI7Q,KAAK+/B,OACTvgC,EAAIQ,KAAKggC,OACf,GAAIxgC,EACA,MAAMA,EAEV,IAAK4+B,EAAwBvtB,GACzB,OAAOA,EAAI+rB,GAAQkC,KAAOlC,GAAQmC,OAG1CtwB,MAAO,SAAUoC,GACb7Q,KAAK+/B,OAASlvB,GAElB/Q,MAAO,SAAUN,GACbQ,KAAKggC,OAASxgC,GAElBygC,MAAO,WACHjgC,KAAK+/B,OAAS//B,KAAKggC,OAAS,OCN9BhM,GAAU,SAAS3Q,EAAWnD,EAAO6Z,EAAehqB,GACtD/P,KAAKqjB,UAAYA,EACjBrjB,KAAKkgB,MAAQA,EACblgB,KAAKkgC,SAAW,GAChBlgC,KAAKmgC,WAAa,KAClBngC,KAAKogC,YAAc,KACnBpgC,KAAK+5B,cAAgBA,EACrB/5B,KAAKgQ,mBAAmBD,GACxB/P,KAAKwqB,WAAY,EAEjBxqB,KAAKqN,UAAUrN,KAAKqjB,UAAWrjB,MAC/BA,KAAKqN,UAAUrN,KAAKkgB,MAAOlgB,OAG/Bg0B,GAAQ52B,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC1C/L,KAAM,UACNy/B,WAAW,EAEXvyB,cAAkB,WAAA,OAAO,GAEzBY,gBAAOC,GACC3O,KAAK8b,MACL9b,KAAK8b,MAAQnN,EAAQoM,WAAW/a,KAAK8b,OAAO,GACrC9b,KAAKqjB,YACZrjB,KAAKqjB,UAAY1U,EAAQoM,WAAW/a,KAAKqjB,YAEzCrjB,KAAKkgB,OAASlgB,KAAKkgB,MAAMrhB,SACzBmB,KAAKkgB,MAAQvR,EAAQoM,WAAW/a,KAAKkgB,SAI7CrR,cAAKb,GACD,IAAIqV,EACAid,EACAtc,EACAxT,EACA+vB,EACAC,GAAwB,EAE5B,GAAIxgC,KAAKqjB,YAAcid,EAAStgC,KAAKqjB,UAAUxkB,QAAS,CAOpD,IANAwkB,EAAY,IAAI5V,MAAM6yB,GACtBR,GAAYhgC,MAAM,CACdc,KAAM,SACNqX,QAAS,6DAGRzH,EAAI,EAAGA,EAAI8vB,EAAQ9vB,IAAK,CACzBwT,EAAWhkB,KAAKqjB,UAAU7S,GAAG3B,KAAKb,GAClC,IAAK,IAAIqN,EAAI,EAAGA,EAAI2I,EAASmC,SAAStnB,OAAQwc,IAC1C,GAAI2I,EAASmC,SAAS9K,GAAGpH,WAAY,CACjCssB,GAAc,EACd,MAGRld,EAAU7S,GAAKwT,EACXA,EAASia,iBACTuC,GAAwB,GAIhC,GAAID,EAAa,CACb,IAAME,EAAmB,IAAIhzB,MAAM6yB,GACnC,IAAK9vB,EAAI,EAAGA,EAAI8vB,EAAQ9vB,IACpBwT,EAAWX,EAAU7S,GACrBiwB,EAAiBjwB,GAAKwT,EAASjW,MAAMC,GAEzC,IAAM0yB,EAAgBrd,EAAU,GAAGjW,WAC7BuzB,EAAmBtd,EAAU,GAAGlW,WACtC,IAAIglB,GAAOnkB,EAAShO,KAAKxC,MAAM+gC,cAAeoC,EAAkBD,GAAe5N,UAC3E2N,EAAiBlyB,KAAK,KACtB,CAAC,cACD,SAAS+kB,EAAK7b,GACNA,IACA4L,EAAYud,EAAmBnpB,OAK/CqoB,GAAYG,aAEZO,GAAwB,EAG5B,IAEIpY,EACAyY,EAHA3gB,EAAQlgB,KAAKkgB,MAAQT,EAAgBzf,KAAKkgB,OAAS,KACjDiD,EAAU,IAAI6Q,GAAQ3Q,EAAWnD,EAAOlgB,KAAK+5B,cAAe/5B,KAAK+P,kBAIvEoT,EAAQ2d,gBAAkB9gC,KAC1BmjB,EAAQjE,KAAOlf,KAAKkf,KACpBiE,EAAQ0F,UAAY7oB,KAAK6oB,UACzB1F,EAAQ4d,aAAe/gC,KAAK+gC,aAExB/gC,KAAKiqB,YACL9G,EAAQ8G,UAAYjqB,KAAKiqB,WAGxBuW,IACDtgB,EAAMrhB,OAAS,GAKnBskB,EAAQgO,iBAAoB,SAAU9U,GAIlC,IAHA,IAEI3D,EAFAlI,EAAI,EACFwC,EAAIqJ,EAAOxd,OAET2R,IAAMwC,IAAMxC,EAEhB,GADAkI,EAAQ2D,EAAQ7L,GAAI2gB,iBACL,OAAOzY,EAE1B,OAAOsoB,GARgB,CASzBhzB,EAAQqO,QAASsV,UAGnB,IAAMsP,EAAYjzB,EAAQqO,OAC1B4kB,EAAU/f,QAAQiC,GAGlB,IAAI+d,EAAelzB,EAAQqV,UACtB6d,IACDlzB,EAAQqV,UAAY6d,EAAe,IAEvCA,EAAahgB,QAAQlhB,KAAKqjB,YAGtBF,EAAQjE,MAAQiE,EAAQ4d,eAAiB5d,EAAQ4W,gBACjD5W,EAAQge,YAAYnzB,GAKxB,IAAMozB,EAAUje,EAAQjD,MACxB,IAAK1P,EAAI,EAAI4X,EAAOgZ,EAAQ5wB,GAAKA,IACzB4X,EAAKiZ,YACLD,EAAQ5wB,GAAK4X,EAAKvZ,KAAKb,IAI/B,IAAMszB,EAAmBtzB,EAAQuzB,aAAevzB,EAAQuzB,YAAY1iC,QAAW,EAG/E,IAAK2R,EAAI,EAAI4X,EAAOgZ,EAAQ5wB,GAAKA,IACX,cAAd4X,EAAKxnB,MAELsf,EAAQkI,EAAKvZ,KAAKb,GAAS6V,QAAO,SAASxS,GACvC,QAAKA,aAAaiZ,IAAgBjZ,EAAE2X,YAIvB7F,EAAQ6F,SAAS3X,EAAE0Y,SAIpCqX,EAAQzgC,OAAOwS,MAAMiuB,EAAS,CAAC5wB,EAAG,GAAGzS,OAAOmiB,IAC5C1P,GAAK0P,EAAMrhB,OAAS,EACpBskB,EAAQqe,cACc,iBAAfpZ,EAAKxnB,OAEZsf,EAAQkI,EAAKvZ,KAAKb,GAASkS,MAAM2D,QAAO,SAASxS,GAC7C,QAAKA,aAAaiZ,IAAgBjZ,EAAE2X,aAMxCoY,EAAQzgC,OAAOwS,MAAMiuB,EAAS,CAAC5wB,EAAG,GAAGzS,OAAOmiB,IAC5C1P,GAAK0P,EAAMrhB,OAAS,EACpBskB,EAAQqe,cAKhB,IAAKhxB,EAAI,EAAI4X,EAAOgZ,EAAQ5wB,GAAKA,IACxB4X,EAAKiZ,YACND,EAAQ5wB,GAAK4X,EAAOA,EAAKvZ,KAAOuZ,EAAKvZ,KAAKb,GAAWoa,GAK7D,IAAK5X,EAAI,EAAI4X,EAAOgZ,EAAQ5wB,GAAKA,IAE7B,GAAI4X,aAAgB4L,IAAW5L,EAAK/E,WAAuC,IAA1B+E,EAAK/E,UAAUxkB,QAExDupB,EAAK/E,UAAU,IAAM+E,EAAK/E,UAAU,GAAGwb,uBAAwB,CAC/DuC,EAAQzgC,OAAO6P,IAAK,GAEpB,IAAS6K,EAAI,EAAIwlB,EAAUzY,EAAKlI,MAAM7E,GAAKA,IACnCwlB,aAAmBl0B,IACnBk0B,EAAQ7wB,mBAAmBoY,EAAKrY,kBAC1B8wB,aAAmBvW,IAAiBuW,EAAQ7X,UAC9CoY,EAAQzgC,SAAS6P,EAAG,EAAGqwB,IAY/C,GAHAI,EAAU7f,QACV8f,EAAa9f,QAETpT,EAAQuzB,YACR,IAAK/wB,EAAI8wB,EAAiB9wB,EAAIxC,EAAQuzB,YAAY1iC,OAAQ2R,IACtDxC,EAAQuzB,YAAY/wB,GAAGixB,gBAAgBpe,GAI/C,OAAOF,GAGXge,qBAAYnzB,GACR,IACIwC,EACAkxB,EAFExhB,EAAQlgB,KAAKkgB,MAGnB,GAAKA,EAEL,IAAK1P,EAAI,EAAGA,EAAI0P,EAAMrhB,OAAQ2R,IACJ,WAAlB0P,EAAM1P,GAAG5P,QACT8gC,EAAcxhB,EAAM1P,GAAG3B,KAAKb,MACR0zB,EAAY7iC,QAAiC,IAAvB6iC,EAAY7iC,SAClDqhB,EAAMvf,OAAOwS,MAAM+M,EAAO,CAAC1P,EAAG,GAAGzS,OAAO2jC,IACxClxB,GAAKkxB,EAAY7iC,OAAS,GAE1BqhB,EAAMvf,OAAO6P,EAAG,EAAGkxB,GAEvB1hC,KAAKwhC,eAKjB5B,cAAa,WAST,OARe,IAAI5L,GAAQh0B,KAAKqjB,UAAWrjB,KAAKkgB,MAAM5P,KAAI,SAAUe,GAChE,OAAIA,EAAEuuB,cACKvuB,EAAEuuB,gBAEFvuB,KAEXrR,KAAK+5B,cAAe/5B,KAAK+P,mBAKjC4xB,mBAAU/vB,GACN,OAAQA,GAAwB,IAAhBA,EAAK/S,QAIzB+iC,eAAc,SAAChwB,EAAM5D,GACjB,IAAM6zB,EAAe7hC,KAAKqjB,UAAUrjB,KAAKqjB,UAAUxkB,OAAS,GAC5D,QAAKgjC,EAAa5D,kBAGd4D,EAAanM,YACZmM,EAAanM,UAAU7mB,KACpB,IAAI0M,EAASa,KAAKpO,EACdA,EAAQqO,WAMxBmlB,WAAU,WACNxhC,KAAK8hC,UAAY,KACjB9hC,KAAKmgC,WAAa,KAClBngC,KAAKogC,YAAc,KACnBpgC,KAAKkgC,SAAW,IAGpB6B,UAAS,WAqBL,OApBK/hC,KAAKmgC,aACNngC,KAAKmgC,WAAcngC,KAAKkgB,MAAalgB,KAAKkgB,MAAM/K,QAAO,SAAU6sB,EAAM3wB,GAOnE,GANIA,aAAaiZ,KAA8B,IAAfjZ,EAAE2X,WAC9BgZ,EAAK3wB,EAAE0Y,MAAQ1Y,GAKJ,WAAXA,EAAEzQ,MAAqByQ,EAAE6N,MAAQ7N,EAAE6N,KAAK6iB,UAAW,CACnD,IAAMhE,EAAO1sB,EAAE6N,KAAK6iB,YACpB,IAAK,IAAM/D,KAAQD,EAEXA,EAAK1gC,eAAe2gC,KACpBgE,EAAKhE,GAAQ3sB,EAAE6N,KAAK8J,SAASgV,IAIzC,OAAOgE,IACR,IAjB6B,IAmB7BhiC,KAAKmgC,YAGhB8B,WAAU,WAiBN,OAhBKjiC,KAAKogC,cACNpgC,KAAKogC,YAAepgC,KAAKkgB,MAAalgB,KAAKkgB,MAAM/K,QAAO,SAAU6sB,EAAM3wB,GACpE,GAAIA,aAAaiZ,KAA8B,IAAfjZ,EAAE2X,SAAmB,CACjD,IAAMkZ,EAA0B,IAAlB7wB,EAAE0Y,KAAKlrB,QAAkBwS,EAAE0Y,KAAK,aAAc6S,GACxDvrB,EAAE0Y,KAAK,GAAGtb,MAAQ4C,EAAE0Y,KAEnBiY,EAAK,WAAIE,IAIVF,EAAK,IAAIjkC,OAAAmkC,IAAQ1hC,KAAK6Q,GAHtB2wB,EAAK,WAAIE,IAAU,CAAE7wB,GAM7B,OAAO2wB,IACR,IAb8B,IAe9BhiC,KAAKogC,aAGhBpX,kBAASe,GACL,IAAMoY,EAAOniC,KAAK+hC,YAAYhY,GAC9B,GAAIoY,EACA,OAAOniC,KAAKoiC,WAAWD,IAI/B3L,kBAASzM,GACL,IAAMoY,EAAOniC,KAAKiiC,aAAalY,GAC/B,GAAIoY,EACA,OAAOniC,KAAKoiC,WAAWD,IAI/BE,gBAAe,WACX,IAAK,IAAI3hC,EAAIV,KAAKkgB,MAAMrhB,OAAQ6B,EAAI,EAAGA,IAAK,CACxC,IAAMyhC,EAAOniC,KAAKkgB,MAAMxf,EAAI,GAC5B,GAAIyhC,aAAgB7X,GAChB,OAAOtqB,KAAKoiC,WAAWD,KAKnCC,oBAAWE,GACP,IAAMlyB,EAAOpQ,KACb,SAASuiC,EAAqBJ,GAC1B,OAAIA,EAAK1zB,iBAAiBsjB,KAAcoQ,EAAKn1B,QACT,iBAArBm1B,EAAK1zB,MAAMA,MAClB,IAAI0jB,GAAOnyB,KAAKxC,MAAMwQ,QAAShO,KAAKxC,MAAM+gC,cAAe4D,EAAKh1B,WAAYg1B,EAAK1zB,MAAMrB,YAAY0lB,UAC7FqP,EAAK1zB,MAAMA,MACX,CAAC,QAAS,cACV,SAAS6kB,EAAK7b,GACN6b,IACA6O,EAAKn1B,QAAS,GAEdyK,IACA0qB,EAAK1zB,MAAQgJ,EAAO,GACpB0qB,EAAK1W,UAAYhU,EAAO,IAAM,GAC9B0qB,EAAKn1B,QAAS,MAI1Bm1B,EAAKn1B,QAAS,EAGXm1B,GAGAA,EAGf,GAAK10B,MAAMC,QAAQ40B,GAGd,CACD,IAAME,EAAQ,GAId,OAHAF,EAAQ30B,SAAQ,SAASqF,GACrBwvB,EAAMhiC,KAAK+hC,EAAqBjlC,KAAK8S,EAAM4C,OAExCwvB,EAPP,OAAOD,EAAqBjlC,KAAK8S,EAAMkyB,IAW/C7X,SAAQ,WACJ,IAAKzqB,KAAKkgB,MAAS,MAAO,GAE1B,IAEI1P,EACA4X,EAHEqa,EAAY,GACZviB,EAAQlgB,KAAKkgB,MAInB,IAAK1P,EAAI,EAAI4X,EAAOlI,EAAM1P,GAAKA,IACvB4X,EAAKiY,WACLoC,EAAUjiC,KAAK4nB,GAIvB,OAAOqa,GAGXC,qBAAYta,GACR,IAAMlI,EAAQlgB,KAAKkgB,MACfA,EACAA,EAAMgB,QAAQkH,GAEdpoB,KAAKkgB,MAAQ,CAAEkI,GAEnBpoB,KAAKqN,UAAU+a,EAAMpoB,OAGzB2iC,KAAK,SAAA3e,EAAU5T,EAAMyT,GACjBzT,EAAOA,GAAQpQ,KACf,IACIqQ,EACAuyB,EAFE1iB,EAAQ,GAGRvN,EAAMqR,EAASjW,QAErB,OAAI4E,KAAO3S,KAAKkgC,SAAmBlgC,KAAKkgC,SAASvtB,IAEjD3S,KAAKyqB,WAAW9c,SAAQ,SAAUya,GAC9B,GAAIA,IAAShY,EACT,IAAK,IAAIiL,EAAI,EAAGA,EAAI+M,EAAK/E,UAAUxkB,OAAQwc,IAEvC,GADAhL,EAAQ2T,EAAS3T,MAAM+X,EAAK/E,UAAUhI,IAC3B,CACP,GAAI2I,EAASmC,SAAStnB,OAASwR,GAC3B,IAAKwT,GAAUA,EAAOuE,GAAO,CACzBwa,EAAcxa,EAAKua,KAAK,IAAI3b,GAAShD,EAASmC,SAAStT,MAAMxC,IAASD,EAAMyT,GAC5E,IAAK,IAAIhjB,EAAI,EAAGA,EAAI+hC,EAAY/jC,SAAUgC,EACtC+hC,EAAY/hC,GAAGob,KAAKzb,KAAK4nB,GAE7B3a,MAAMrQ,UAAUoD,KAAK2S,MAAM+M,EAAO0iB,SAGtC1iB,EAAM1f,KAAK,CAAE4nB,KAAIA,EAAEnM,KAAM,KAE7B,UAKhBjc,KAAKkgC,SAASvtB,GAAOuN,EACdA,IAGXhS,OAAM,SAACF,EAASQ,GACZ,IAAIgC,EACA6K,EAKA4O,EAEA7B,EACAnM,EANA4mB,EAAY,GAQhB70B,EAAQ80B,SAAY90B,EAAQ80B,UAAY,EAEnC9iC,KAAKkf,MACNlR,EAAQ80B,WAGZ,IAEIC,EAFEC,EAAah1B,EAAQ2D,SAAW,GAAKlE,MAAMO,EAAQ80B,SAAW,GAAGv0B,KAAK,MACtE00B,EAAYj1B,EAAQ2D,SAAW,GAAKlE,MAAMO,EAAQ80B,UAAUv0B,KAAK,MAGnE20B,EAAmB,EACnBC,EAAkB,EACtB,IAAK3yB,EAAI,EAAI4X,EAAOpoB,KAAKkgB,MAAM1P,GAAKA,IAC5B4X,aAAgB+B,IACZgZ,IAAoB3yB,GACpB2yB,IAEJN,EAAUriC,KAAK4nB,IACRA,EAAKgb,WAAahb,EAAKgb,aAC9BP,EAAUliC,OAAOuiC,EAAkB,EAAG9a,GACtC8a,IACAC,KACqB,WAAd/a,EAAKxnB,MACZiiC,EAAUliC,OAAOwiC,EAAiB,EAAG/a,GACrC+a,KAEAN,EAAUriC,KAAK4nB,GAOvB,GAJAya,EAtCyB,GAsCI9kC,OAAO8kC,IAI/B7iC,KAAKkf,KAAM,EACZ+K,EAAY0I,GAAa3kB,EAAShO,KAAMijC,MAGpCz0B,EAAOL,IAAI8b,GACXzb,EAAOL,IAAI80B,IAGf,IAAMnnB,EAAQ9b,KAAK8b,MACbunB,EAAUvnB,EAAMjd,OAClBykC,SAIJ,IAFAP,EAAM/0B,EAAQ2D,SAAW,IAAO,MAAA5T,OAAMklC,GAEjCzyB,EAAI,EAAGA,EAAI6yB,EAAS7yB,IAErB,GAAM8yB,GADNrnB,EAAOH,EAAMtL,IACW3R,OAOxB,IANI2R,EAAI,GAAKhC,EAAOL,IAAI40B,GAExB/0B,EAAQoG,eAAgB,EACxB6H,EAAK,GAAG/N,OAAOF,EAASQ,GAExBR,EAAQoG,eAAgB,EACnBiH,EAAI,EAAGA,EAAIioB,EAAYjoB,IACxBY,EAAKZ,GAAGnN,OAAOF,EAASQ,GAIhCA,EAAOL,KAAKH,EAAQ2D,SAAW,IAAM,QAAUqxB,GAInD,IAAKxyB,EAAI,EAAI4X,EAAOya,EAAUryB,GAAKA,IAAK,CAEhCA,EAAI,IAAMqyB,EAAUhkC,SACpBmP,EAAQsxB,UAAW,GAGvB,IAAMiE,EAAkBv1B,EAAQsxB,SAC5BlX,EAAKta,cAAcsa,KACnBpa,EAAQsxB,UAAW,GAGnBlX,EAAKla,OACLka,EAAKla,OAAOF,EAASQ,GACd4Z,EAAK3Z,OACZD,EAAOL,IAAIia,EAAK3Z,MAAMyC,YAG1BlD,EAAQsxB,SAAWiE,GAEdv1B,EAAQsxB,UAAYlX,EAAKtY,YAC1BtB,EAAOL,IAAIH,EAAQ2D,SAAW,GAAM,KAAA5T,OAAKilC,IAEzCh1B,EAAQsxB,UAAW,EAItBt/B,KAAKkf,OACN1Q,EAAOL,IAAKH,EAAQ2D,SAAW,IAAM,KAAA5T,OAAKklC,EAAY,MACtDj1B,EAAQ80B,YAGPt0B,EAAOF,WAAcN,EAAQ2D,WAAY3R,KAAK6oB,WAC/Cra,EAAOL,IAAI,OAInB2Z,cAAc,SAAAhM,EAAO9N,EAASqV,GAC1B,IAAK,IAAIpX,EAAI,EAAGA,EAAIoX,EAAUxkB,OAAQoN,IAClCjM,KAAKwjC,aAAa1nB,EAAO9N,EAASqV,EAAUpX,KAIpDu3B,aAAa,SAAA1nB,EAAO9N,EAASgW,GAEzB,SAASyf,EAAkBC,EAAeC,GACtC,IAAIC,EAAkBvoB,EACtB,GAA6B,IAAzBqoB,EAAc7kC,OACd+kC,EAAmB,IAAIvwB,EAAMqwB,EAAc,QACxC,CACH,IAAMG,EAAe,IAAIp2B,MAAMi2B,EAAc7kC,QAC7C,IAAKwc,EAAI,EAAGA,EAAIqoB,EAAc7kC,OAAQwc,IAClCwoB,EAAaxoB,GAAK,IAAItH,EAClB,KACA2vB,EAAcroB,GACdsoB,EAAgB1vB,WAChB0vB,EAAgB/1B,OAChB+1B,EAAgB91B,WAGxB+1B,EAAmB,IAAIvwB,EAAM,IAAI2T,GAAS6c,IAE9C,OAAOD,EAGX,SAASE,EAAeC,EAAkBJ,GACtC,IAAI/L,EAGJ,OAFAA,EAAU,IAAI7jB,EAAQ,KAAMgwB,EAAkBJ,EAAgB1vB,WAAY0vB,EAAgB/1B,OAAQ+1B,EAAgB91B,WACvG,IAAImZ,GAAS,CAAC4Q,IAO7B,SAASoM,EAAuBC,EAAeC,EAASC,EAAiBC,GACrE,IAAIC,EAAiBxC,EAAcyC,EAenC,GAbAD,EAAkB,GAIdJ,EAAcplC,OAAS,GAEvBgjC,GADAwC,EAAkB5kB,EAAgBwkB,IACHtnB,MAC/B2nB,EAAoBF,EAAiB3c,cAAchI,EAAgBoiB,EAAa1b,YAGhFme,EAAoBF,EAAiB3c,cAAc,IAGnDyc,EAAQrlC,OAAS,EAAG,CAMpB,IAAImV,EAAamwB,EAAgBnwB,WAE3BuwB,EAAWL,EAAQ,GAAG/d,SAAS,GACjCnS,EAAWJ,oBAAsB2wB,EAASvwB,WAAWJ,oBACrDI,EAAauwB,EAASvwB,YAG1BswB,EAAkBne,SAAS3lB,KAAK,IAAIuT,EAChCC,EACAuwB,EAAS91B,MACT01B,EAAgBlwB,WAChBkwB,EAAgBv2B,OAChBu2B,EAAgBt2B,YAEpBy2B,EAAkBne,SAAWme,EAAkBne,SAASpoB,OAAOmmC,EAAQ,GAAG/d,SAAStT,MAAM,IAS7F,GAL0C,IAAtCyxB,EAAkBne,SAAStnB,QAC3BwlC,EAAgB7jC,KAAK8jC,GAIrBJ,EAAQrlC,OAAS,EAAG,CACpB,IAAI2lC,EAAaN,EAAQrxB,MAAM,GAC/B2xB,EAAaA,EAAWl0B,KAAI,SAAU0T,GAClC,OAAOA,EAASyD,cAAczD,EAASmC,SAAU,OAErDke,EAAkBA,EAAgBtmC,OAAOymC,GAE7C,OAAOH,EAMX,SAASI,EAA4BR,EAAeS,EAAUP,EAAiBC,EAAkB3sB,GAC7F,IAAI4D,EACJ,IAAKA,EAAI,EAAGA,EAAI4oB,EAAcplC,OAAQwc,IAAK,CACvC,IAAMgpB,EAAkBL,EAAuBC,EAAc5oB,GAAIqpB,EAAUP,EAAiBC,GAC5F3sB,EAAOjX,KAAK6jC,GAEhB,OAAO5sB,EAGX,SAASktB,EAA2Bxe,EAAU9C,GAC1C,IAAI7S,EAAGo0B,EAEP,GAAwB,IAApBze,EAAStnB,OAGb,GAAyB,IAArBwkB,EAAUxkB,OAKd,IAAK2R,EAAI,EAAIo0B,EAAMvhB,EAAU7S,GAAKA,IAE1Bo0B,EAAI/lC,OAAS,EACb+lC,EAAIA,EAAI/lC,OAAS,GAAK+lC,EAAIA,EAAI/lC,OAAS,GAAG4oB,cAAcmd,EAAIA,EAAI/lC,OAAS,GAAGsnB,SAASpoB,OAAOooB,IAG5Fye,EAAIpkC,KAAK,IAAIwmB,GAASb,SAV1B9C,EAAU7iB,KAAK,CAAE,IAAIwmB,GAASb,KAsItC,SAAS0e,EAAe90B,EAAgB+0B,GACpC,IAAMvgB,EAAcugB,EAAWrd,cAAcqd,EAAW3e,SAAU2e,EAAWriB,WAAYqiB,EAAW7G,gBAEpG,OADA1Z,EAAYvU,mBAAmBD,GACxBwU,EAIX,IAAI/T,EAAGu0B,EAKP,IAhIA,SAASC,EAAsBlpB,EAAO9N,EAASi3B,GAW3C,IAAIz0B,EAAG6K,EAAG2Z,EAAGkQ,EAAiBC,EAAcC,EAAqBR,EAAKnG,EAA+B5/B,EAAQgjC,EACjFjK,EACpByN,EAFkEC,GAAoB,EAwB9F,IARAJ,EAAkB,GAIlBC,EAAe,CACX,IAGC30B,EAAI,EAAIiuB,EAAKwG,EAAW9e,SAAS3V,GAAKA,IAEvC,GAAiB,MAAbiuB,EAAGhwB,MAAe,CAClB,IAAM82B,GAzBNF,OAAAA,GADoBzN,EA0BsB6G,GAxBhChwB,iBAAiB4E,IAI/BgyB,EAAgBzN,EAAQnpB,MAAMA,iBACCuY,GAIxBqe,EARI,MAwBP,GAAuB,OAAnBE,EAAyB,CAGzBZ,EAA2BO,EAAiBC,GAE5C,IACIK,EADEC,EAAc,GAEdC,EAAuB,GAI7B,IAHAF,EAAWR,EAAsBS,EAAaz3B,EAASu3B,GACvDD,EAAoBA,GAAqBE,EAEpCxQ,EAAI,EAAGA,EAAIyQ,EAAY5mC,OAAQm2B,IAAK,CAErCyP,EAA2BU,EAAc,CADbrB,EAAeL,EAAkBgC,EAAYzQ,GAAIyJ,GAAKA,IAClBA,EAAIwG,EAAYS,GAEpFP,EAAeO,EACfR,EAAkB,QAElBA,EAAgB1kC,KAAKi+B,OAGtB,CAUH,IATA6G,GAAoB,EAEpBF,EAAsB,GAItBT,EAA2BO,EAAiBC,GAGvC9pB,EAAI,EAAGA,EAAI8pB,EAAatmC,OAAQwc,IAIjC,GAHAupB,EAAMO,EAAa9pB,GAGI,IAAnBrN,EAAQnP,OAGJ+lC,EAAI/lC,OAAS,GACb+lC,EAAI,GAAGze,SAAS3lB,KAAK,IAAIuT,EAAQ0qB,EAAGzqB,WAAY,GAAIyqB,EAAGxqB,WAAYwqB,EAAG7wB,OAAQ6wB,EAAG5wB,YAErFu3B,EAAoB5kC,KAAKokC,QAIzB,IAAK5P,EAAI,EAAGA,EAAIhnB,EAAQnP,OAAQm2B,IAAK,CAGjC,IAAMqP,EAAkBL,EAAuBY,EAAK52B,EAAQgnB,GAAIyJ,EAAIwG,GAEpEG,EAAoB5kC,KAAK6jC,GAMrCc,EAAeC,EACfF,EAAkB,GAQ1B,IAFAP,EAA2BO,EAAiBC,GAEvC30B,EAAI,EAAGA,EAAI20B,EAAatmC,OAAQ2R,KACjC3R,EAASsmC,EAAa30B,GAAG3R,QACZ,IACTid,EAAMtb,KAAK2kC,EAAa30B,IACxBqxB,EAAesD,EAAa30B,GAAG3R,EAAS,GACxCsmC,EAAa30B,GAAG3R,EAAS,GAAKgjC,EAAapa,cAAcoa,EAAa1b,SAAU8e,EAAWxiB,aAInG,OAAO6iB,EAaSN,CADpBD,EAAW,GACyC/2B,EAASgW,GAGzD,GAAIhW,EAAQnP,OAAS,EAEjB,IADAkmC,EAAW,GACNv0B,EAAI,EAAGA,EAAIxC,EAAQnP,OAAQ2R,IAAK,CAEjC,IAAMm1B,EAAe33B,EAAQwC,GAAGF,IAAIu0B,EAAevjC,KAAKtB,KAAMgkB,EAASjU,mBAEvE41B,EAAanlC,KAAKwjB,GAClB+gB,EAASvkC,KAAKmlC,QAIlBZ,EAAW,CAAC,CAAC/gB,IAIrB,IAAKxT,EAAI,EAAGA,EAAIu0B,EAASlmC,OAAQ2R,IAC7BsL,EAAMtb,KAAKukC,EAASv0B,OCr0BhC,IAAMo1B,GAAO,SAASC,EAAWC,EAAaC,GAC1C/lC,KAAK6lC,UAAYA,EAAYpmB,EAAgBomB,GAAWG,OAAS,GACjEhmC,KAAK8lC,YAAcA,EAAcrmB,EAAgBqmB,GAAaE,OAAS,GACnED,EACA/lC,KAAK+lC,WAAaA,EACXF,GAAaA,EAAUhnC,SAC9BmB,KAAK+lC,WAAaF,EAAU,KAIpCD,GAAKxoC,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CACvC/L,KAAM,OAENuT,MAAK,WACD,OAAO,IAAIyxB,GAAKnmB,EAAgBzf,KAAK6lC,WAAYpmB,EAAgBzf,KAAK8lC,aAAc9lC,KAAK+lC,aAG7F73B,OAAM,SAACF,EAASQ,GAEZ,IAAMy3B,EAAcj4B,GAAWA,EAAQi4B,YACT,IAA1BjmC,KAAK6lC,UAAUhnC,OACf2P,EAAOL,IAAInO,KAAK6lC,UAAU,KAClBI,GAAejmC,KAAK+lC,WAC5Bv3B,EAAOL,IAAInO,KAAK+lC,aACRE,GAAejmC,KAAK8lC,YAAYjnC,QACxC2P,EAAOL,IAAInO,KAAK8lC,YAAY,KAIpC50B,SAAQ,WACJ,IAAIV,EAAG01B,EAAYlmC,KAAK6lC,UAAUt3B,KAAK,KACvC,IAAKiC,EAAI,EAAGA,EAAIxQ,KAAK8lC,YAAYjnC,OAAQ2R,IACrC01B,GAAa,WAAIlmC,KAAK8lC,YAAYt1B,IAEtC,OAAO01B,GAGX32B,iBAAQ6C,GACJ,OAAOpS,KAAKmmC,GAAG/zB,EAAMlB,YAAc,OAAIrP,GAG3CskC,YAAGC,GACC,OAAOpmC,KAAKkR,WAAWqhB,gBAAkB6T,EAAW7T,eAGxD8T,SAAQ,WACJ,OAAOC,OAAO,wDAAyD,MAAMpqB,KAAKlc,KAAK+N,UAG3FO,QAAO,WACH,OAAiC,IAA1BtO,KAAK6lC,UAAUhnC,QAA4C,IAA5BmB,KAAK8lC,YAAYjnC,QAG3D0nC,WAAU,WACN,OAAOvmC,KAAK6lC,UAAUhnC,QAAU,GAAiC,IAA5BmB,KAAK8lC,YAAYjnC,QAG1DyR,aAAI0N,GACA,IAAIxN,EAEJ,IAAKA,EAAI,EAAGA,EAAIxQ,KAAK6lC,UAAUhnC,OAAQ2R,IACnCxQ,KAAK6lC,UAAUr1B,GAAKwN,EAAShe,KAAK6lC,UAAUr1B,IAAI,GAGpD,IAAKA,EAAI,EAAGA,EAAIxQ,KAAK8lC,YAAYjnC,OAAQ2R,IACrCxQ,KAAK8lC,YAAYt1B,GAAKwN,EAAShe,KAAK8lC,YAAYt1B,IAAI,IAI5Dg2B,UAAS,WACL,IAAIpb,EAEAqb,EACAC,EAFEjvB,EAAS,GAaf,IAAKivB,KATLD,EAAU,SAAUE,GAMhB,OAJIvb,EAAM/tB,eAAespC,KAAgBlvB,EAAOivB,KAC5CjvB,EAAOivB,GAAaC,GAGjBA,GAGOn7B,EAEVA,EAAgBnO,eAAeqpC,KAC/Btb,EAAQ5f,EAAgBk7B,GAExB1mC,KAAKsQ,IAAIm2B,IAIjB,OAAOhvB,GAGXmvB,OAAM,WACF,IACID,EACAn2B,EAFEq2B,EAAU,GAIhB,IAAKr2B,EAAI,EAAGA,EAAIxQ,KAAK6lC,UAAUhnC,OAAQ2R,IAEnCq2B,EADAF,EAAa3mC,KAAK6lC,UAAUr1B,KACLq2B,EAAQF,IAAe,GAAK,EAGvD,IAAKn2B,EAAI,EAAGA,EAAIxQ,KAAK8lC,YAAYjnC,OAAQ2R,IAErCq2B,EADAF,EAAa3mC,KAAK8lC,YAAYt1B,KACPq2B,EAAQF,IAAe,GAAK,EAMvD,IAAKA,KAHL3mC,KAAK6lC,UAAY,GACjB7lC,KAAK8lC,YAAc,GAEAe,EAEf,GAAIA,EAAQxpC,eAAespC,GAAa,CACpC,IAAMG,EAAQD,EAAQF,GAEtB,GAAIG,EAAQ,EACR,IAAKt2B,EAAI,EAAGA,EAAIs2B,EAAOt2B,IACnBxQ,KAAK6lC,UAAUrlC,KAAKmmC,QAErB,GAAIG,EAAQ,EACf,IAAKt2B,EAAI,EAAGA,GAAKs2B,EAAOt2B,IACpBxQ,KAAK8lC,YAAYtlC,KAAKmmC,GAMtC3mC,KAAK6lC,UAAUG,OACfhmC,KAAK8lC,YAAYE,UC/HzB,IAAMe,GAAY,SAASt4B,EAAOu4B,GAE9B,GADAhnC,KAAKyO,MAAQw4B,WAAWx4B,GACpBy4B,MAAMlnC,KAAKyO,OACX,MAAM,IAAIhP,MAAM,8BAEpBO,KAAKgnC,KAAQA,GAAQA,aAAgBpB,GAAQoB,EACzC,IAAIpB,GAAKoB,EAAO,CAACA,QAAQnlC,GAC7B7B,KAAKqN,UAAUrN,KAAKgnC,KAAMhnC,OAG9B+mC,GAAU3pC,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC5C/L,KAAM,YAEN8N,gBAAOC,GACH3O,KAAKgnC,KAAOr4B,EAAQC,MAAM5O,KAAKgnC,OAKnCn4B,cAAKb,GACD,OAAOhO,MAGXmnC,QAAO,WACH,OAAO,IAAIl3B,EAAM,CAACjQ,KAAKyO,MAAOzO,KAAKyO,MAAOzO,KAAKyO,SAGnDP,OAAM,SAACF,EAASQ,GACZ,GAAKR,GAAWA,EAAQi4B,cAAiBjmC,KAAKgnC,KAAKT,aAC/C,MAAM,IAAI9mC,MAAM,sFAAA1B,OAAsFiC,KAAKgnC,KAAK91B,aAGpH,IAAMzC,EAAQzO,KAAKkP,OAAOlB,EAAShO,KAAKyO,OACpC24B,EAAWvW,OAAOpiB,GAOtB,GALc,IAAVA,GAAeA,EAAQ,MAAYA,GAAS,OAE5C24B,EAAW34B,EAAMa,QAAQ,IAAIzS,QAAQ,MAAO,KAG5CmR,GAAWA,EAAQ2D,SAAU,CAE7B,GAAc,IAAVlD,GAAezO,KAAKgnC,KAAKX,WAEzB,YADA73B,EAAOL,IAAIi5B,GAKX34B,EAAQ,GAAKA,EAAQ,IACrB24B,EAAW,EAAW5tB,OAAO,IAIrChL,EAAOL,IAAIi5B,GACXpnC,KAAKgnC,KAAK94B,OAAOF,EAASQ,IAM9B2D,QAAQ,SAAAnE,EAASe,EAAIqD,GAEjB,IAAI3D,EAAQzO,KAAK8O,SAASd,EAASe,EAAI/O,KAAKyO,MAAO2D,EAAM3D,OACrDu4B,EAAOhnC,KAAKgnC,KAAK7yB,QAErB,GAAW,MAAPpF,GAAqB,MAAPA,EACd,GAA8B,IAA1Bi4B,EAAKnB,UAAUhnC,QAA4C,IAA5BmoC,EAAKlB,YAAYjnC,OAChDmoC,EAAO50B,EAAM40B,KAAK7yB,QACdnU,KAAKgnC,KAAKjB,aACViB,EAAKjB,WAAa/lC,KAAKgnC,KAAKjB,iBAE7B,GAAoC,IAAhC3zB,EAAM40B,KAAKnB,UAAUhnC,QAA4C,IAA5BmoC,EAAKlB,YAAYjnC,YAE1D,CAGH,GAFAuT,EAAQA,EAAMi1B,UAAUrnC,KAAKgnC,KAAKR,aAE9Bx4B,EAAQi4B,aAAe7zB,EAAM40B,KAAK91B,aAAe81B,EAAK91B,WACtD,MAAM,IAAIzR,MAAM,kEACV,eAAA1B,OAAeipC,EAAK91B,WAAoB,WAAAnT,OAAAqU,EAAM40B,KAAK91B,WAAU,OAGvEzC,EAAQzO,KAAK8O,SAASd,EAASe,EAAI/O,KAAKyO,MAAO2D,EAAM3D,WAE3C,MAAPM,GACPi4B,EAAKnB,UAAYmB,EAAKnB,UAAU9nC,OAAOqU,EAAM40B,KAAKnB,WAAWG,OAC7DgB,EAAKlB,YAAckB,EAAKlB,YAAY/nC,OAAOqU,EAAM40B,KAAKlB,aAAaE,OACnEgB,EAAKJ,UACS,MAAP73B,IACPi4B,EAAKnB,UAAYmB,EAAKnB,UAAU9nC,OAAOqU,EAAM40B,KAAKlB,aAAaE,OAC/DgB,EAAKlB,YAAckB,EAAKlB,YAAY/nC,OAAOqU,EAAM40B,KAAKnB,WAAWG,OACjEgB,EAAKJ,UAET,OAAO,IAAIG,GAAUt4B,EAAOu4B,IAGhCz3B,iBAAQ6C,GACJ,IAAIpD,EAAGC,EAEP,GAAMmD,aAAiB20B,GAAvB,CAIA,GAAI/mC,KAAKgnC,KAAK14B,WAAa8D,EAAM40B,KAAK14B,UAClCU,EAAIhP,KACJiP,EAAImD,OAIJ,GAFApD,EAAIhP,KAAKsnC,QACTr4B,EAAImD,EAAMk1B,QACqB,IAA3Bt4B,EAAEg4B,KAAKz3B,QAAQN,EAAE+3B,MACjB,OAIR,OAAOr6B,EAAK6C,eAAeR,EAAEP,MAAOQ,EAAER,SAG1C64B,MAAK,WACD,OAAOtnC,KAAKqnC,UAAU,CAAExoC,OAAQ,KAAMmN,SAAU,IAAKG,MAAO,SAGhEk7B,mBAAUE,GACN,IAEI/2B,EACAk2B,EACAtb,EACAoc,EAEAC,EAPAh5B,EAAQzO,KAAKyO,MACXu4B,EAAOhnC,KAAKgnC,KAAK7yB,QAKnBuzB,EAAqB,GAGzB,GAA2B,iBAAhBH,EAA0B,CACjC,IAAK/2B,KAAKhF,EACFA,EAAgBgF,GAAGnT,eAAekqC,MAClCG,EAAqB,IACFl3B,GAAK+2B,GAGhCA,EAAcG,EAgBlB,IAAKhB,KAdLe,EAAY,SAAUd,EAAYb,GAC9B,OAAI1a,EAAM/tB,eAAespC,IACjBb,EACAr3B,GAAiB2c,EAAMub,GAAcvb,EAAMoc,GAE3C/4B,GAAiB2c,EAAMub,GAAcvb,EAAMoc,GAGxCA,GAGJb,GAGOY,EACVA,EAAYlqC,eAAeqpC,KAC3Bc,EAAaD,EAAYb,GACzBtb,EAAQ5f,EAAgBk7B,GAExBM,EAAK12B,IAAIm3B,IAMjB,OAFAT,EAAKJ,SAEE,IAAIG,GAAUt4B,EAAOu4B,MCvKpC,IAAMxb,GAAa,SAAS/c,EAAO8E,GAG/B,GAFAvT,KAAKyO,MAAQA,EACbzO,KAAKuT,UAAYA,GACZ9E,EACD,MAAM,IAAIhP,MAAM,2CAIxB+rB,GAAWpuB,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC7C/L,KAAM,aAEN8N,gBAAOC,GACH3O,KAAKyO,MAAQE,EAAQoM,WAAW/a,KAAKyO,QAGzCI,cAAKb,GACD,IACI25B,EADEp0B,EAAYvT,KAAKuT,UAEjBwJ,EAAS/O,EAAQgP,WACjBJ,EAAgB5c,KAAK08B,OAEvBkL,GAAc,EA2BlB,OA1BIhrB,GACA5O,EAAQ4O,gBAER5c,KAAKyO,MAAM5P,OAAS,EACpB8oC,EAAc,IAAInc,GAAWxrB,KAAKyO,MAAM6B,KAAI,SAAU9Q,GAClD,OAAKA,EAAEqP,KAGArP,EAAEqP,KAAKb,GAFHxO,KAGXQ,KAAKuT,WACoB,IAAtBvT,KAAKyO,MAAM5P,SACdmB,KAAKyO,MAAM,GAAGiuB,QAAW18B,KAAKyO,MAAM,GAAGwuB,YAAejvB,EAAQyO,SAC9DmrB,GAAc,GAElBD,EAAc3nC,KAAKyO,MAAM,GAAGI,KAAKb,IAEjC25B,EAAc3nC,KAEd4c,GACA5O,EAAQ8O,oBAER9c,KAAK08B,SAAU18B,KAAKi9B,YAAelgB,GAAW6qB,GACxCD,aAAuBZ,KAC7BY,EAAc,IAAIt0B,EAAMs0B,IAE5BA,EAAYp0B,UAAYo0B,EAAYp0B,WAAaA,EAC1Co0B,GAGXz5B,OAAM,SAACF,EAASQ,GACZ,IAAK,IAAI9N,EAAI,EAAGA,EAAIV,KAAKyO,MAAM5P,OAAQ6B,IACnCV,KAAKyO,MAAM/N,GAAGwN,OAAOF,EAASQ,IACzBxO,KAAKuT,WAAa7S,EAAI,EAAIV,KAAKyO,MAAM5P,SAClC6B,EAAI,EAAIV,KAAKyO,MAAM5P,UAAYmB,KAAKyO,MAAM/N,EAAI,aAAcqxB,KAC5D/xB,KAAKyO,MAAM/N,EAAI,aAAcqxB,IAAyC,MAA5B/xB,KAAKyO,MAAM/N,EAAI,GAAG+N,QAC5DD,EAAOL,IAAI,MAM3ByqB,kBAAiB,WACb54B,KAAKyO,MAAQzO,KAAKyO,MAAMoV,QAAO,SAAShT,GACpC,QAASA,aAAasZ,UChElC,IAAM0d,GAA0B,CAE5B/5B,cAAa,WACT,OAAO,GAGXY,gBAAOC,GACC3O,KAAKy6B,WACLz6B,KAAKy6B,SAAW9rB,EAAQC,MAAM5O,KAAKy6B,WAEnCz6B,KAAKkgB,QACLlgB,KAAKkgB,MAAQvR,EAAQoM,WAAW/a,KAAKkgB,SAI7C4nB,aAAc,WACV,GAAK9nC,KAAKy6B,UAAahtB,MAAMC,QAAQ1N,KAAKy6B,SAAShsB,UAAUzO,KAAKy6B,SAAShsB,MAAM5P,OAAS,GAO1F,IAHA,IACIkpC,EAAMz0B,EADJ00B,EAAahoC,KAAKy6B,SAAShsB,MAGxBJ,EAAQ,EAAGA,EAAQ25B,EAAWnpC,SAAUwP,EAG3B,aAFlB05B,EAAOC,EAAW35B,IAETzN,MAAsByN,EAAQ,EAAI25B,EAAWnpC,SAAWkpC,EAAKx0B,WAA+B,MAAlBw0B,EAAKx0B,YAGhE,WAFpBD,EAAS00B,EAAW35B,EAAQ,IAElBzN,MAAqB0S,EAAMC,YACjCy0B,EAAW35B,GAAQ,IAAImd,GAAW,CAACuc,EAAMz0B,IACzC00B,EAAWrnC,OAAO0N,EAAQ,EAAG,GAC7B25B,EAAW35B,GAAOkF,WAAY,IAM9C00B,iBAAQj6B,GACJhO,KAAK8nC,eAEL,IAAIrwB,EAASzX,KAGb,GAAIgO,EAAQuzB,YAAY1iC,OAAS,EAAG,CAChC,IAAMwkB,EAAY,IAAK2D,GAAS,GAAI,KAAM,KAAMhnB,KAAKoN,WAAYpN,KAAKmN,YAAaqxB,wBACnF/mB,EAAS,IAAIuc,GAAQ3Q,EAAWrV,EAAQuzB,cACjCxZ,YAAa,EACpBtQ,EAAOzH,mBAAmBhQ,KAAK+P,kBAC/B/P,KAAKqN,UAAUoK,EAAQzX,MAM3B,cAHOgO,EAAQuzB,mBACRvzB,EAAQk6B,UAERzwB,GAGX0wB,oBAAWn6B,GAGP,IAAIwC,EACA/B,EAHJzO,KAAK8nC,eAIL,IAAM7rB,EAAOjO,EAAQk6B,UAAUnqC,OAAO,CAACiC,OAGvC,IAAKwQ,EAAI,EAAGA,EAAIyL,EAAKpd,OAAQ2R,IAAK,CAC9B,GAAIyL,EAAKzL,GAAG5P,OAASZ,KAAKY,KAGtB,OAFAoN,EAAQuzB,YAAY5gC,OAAO6P,EAAG,GAEvBxQ,KAGXyO,EAAQwN,EAAKzL,GAAGiqB,oBAAoB/O,GAChCzP,EAAKzL,GAAGiqB,SAAShsB,MAAQwN,EAAKzL,GAAGiqB,SACrCxe,EAAKzL,GAAK/C,MAAMC,QAAQe,GAASA,EAAQ,CAACA,GAsB9C,OAZAzO,KAAKy6B,SAAW,IAAI/O,GAAM1rB,KAAKooC,QAAQnsB,GAAM3L,KAAI,SAAA2L,GAG7C,IAFAA,EAAOA,EAAK3L,KAAI,SAAA+3B,GAAY,OAAAA,EAASt6B,MAAQs6B,EAAW,IAAItW,GAAUsW,MAEjE73B,EAAIyL,EAAKpd,OAAS,EAAG2R,EAAI,EAAGA,IAC7ByL,EAAKtb,OAAO6P,EAAG,EAAG,IAAIuhB,GAAU,QAGpC,OAAO,IAAIvG,GAAWvP,OAE1Bjc,KAAKqN,UAAUrN,KAAKy6B,SAAUz6B,MAGvB,IAAIg0B,GAAQ,GAAI,KAG3BoU,iBAAQ9xB,GACJ,GAAmB,IAAfA,EAAIzX,OACJ,MAAO,GACJ,GAAmB,IAAfyX,EAAIzX,OACX,OAAOyX,EAAI,GAIX,IAFA,IAAMmB,EAAS,GACT6wB,EAAOtoC,KAAKooC,QAAQ9xB,EAAIzD,MAAM,IAC3BnS,EAAI,EAAGA,EAAI4nC,EAAKzpC,OAAQ6B,IAC7B,IAAK,IAAI2a,EAAI,EAAGA,EAAI/E,EAAI,GAAGzX,OAAQwc,IAC/B5D,EAAOjX,KAAK,CAAC8V,EAAI,GAAG+E,IAAItd,OAAOuqC,EAAK5nC,KAG5C,OAAO+W,GAIfgqB,yBAAgBpe,GACPA,IAGLrjB,KAAKkgB,MAAQ,CAAC,IAAI8T,GAAQvU,EAAgB4D,GAAY,CAACrjB,KAAKkgB,MAAM,MAClElgB,KAAKqN,UAAUrN,KAAKkgB,MAAOlgB,SC3H7BuoC,GAAS,SACXxe,EACAtb,EACAyR,EACA7R,EACA6F,EACA+V,EACAzI,EACAzR,GARW,IAUPS,EAgDPghB,EAAAxxB,KA/COqjB,EAAY,IAAK2D,GAAS,GAAI,KAAM,KAAMhnB,KAAK4N,OAAQ5N,KAAK6N,WAAY2wB,uBAI5E,GAFAx+B,KAAK+pB,KAAQA,EACb/pB,KAAKyO,MAASA,aAAiB9B,EAAQ8B,EAASA,EAAQ,IAAIsjB,GAAUtjB,GAASA,EAC3EyR,EAAO,CACP,GAAIzS,MAAMC,QAAQwS,GAAQ,CACtB,IAAMsoB,EAAkBxoC,KAAKyoC,kBAAkBvoB,GAE3CwoB,GAAyB,EAC7BxoB,EAAMvS,SAAQ,SAAAya,GACQ,YAAdA,EAAKxnB,MAAsBwnB,EAAKlI,QAAOwoB,EAAyBA,GAA0BlX,EAAKiX,kBAAkBrgB,EAAKlI,OAAO,OAGjIsoB,IAAoBhnB,GACpBxhB,KAAK2oC,aAAc,EACnB3oC,KAAKuhB,aAAerB,IACbwoB,GAA2C,IAAjBxoB,EAAMrhB,QAAiB2iB,GAAa/S,EAIrEzO,KAAKkgB,MAAQA,GAHblgB,KAAK2oC,aAAc,EACnB3oC,KAAKuhB,aAAerB,EAAM,GAAGA,MAAQA,EAAM,GAAGA,MAAQA,OAIvD,GACGsoB,EAAkBxoC,KAAKyoC,kBAAkBvoB,EAAMA,SAE7BsB,GAAa/S,GAIjCzO,KAAKkgB,MAAQ,CAACA,GACdlgB,KAAKkgB,MAAM,GAAGmD,UAAY,IAAK2D,GAAS,GAAI,KAAM,KAAM3Y,EAAO6F,GAAkBsqB,yBAJjFx+B,KAAK2oC,aAAc,EACnB3oC,KAAKuhB,aAAerB,EAAMA,OAMlC,IAAKlgB,KAAK2oC,YACN,IAAKn4B,EAAI,EAAGA,EAAIxQ,KAAKkgB,MAAMrhB,OAAQ2R,IAC/BxQ,KAAKkgB,MAAM1P,GAAGuwB,cAAe,EAGrC/gC,KAAKqN,UAAUgW,EAAWrjB,MAC1BA,KAAKqN,UAAUrN,KAAKkgB,MAAOlgB,MAE/BA,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,EACjBlU,KAAKiqB,UAAYA,EACjBjqB,KAAKwhB,SAAWA,IAAY,EAC5BxhB,KAAKgQ,mBAAmBD,GACxB/P,KAAKwqB,WAAY,GAGrB+d,GAAOnrC,UAAYD,OAAOgU,OAAO,IAAIxE,OACjC/L,KAAM,UAEHinC,KAEHY,kBAAiB,SAACvoB,EAAO0oB,GACrB,YADqB,IAAAA,IAAAA,GAAiB,GACjCA,EAGM1oB,EAAM2D,QAAO,SAAUrW,GAAQ,MAAsB,gBAAdA,EAAK5M,MAAwC,YAAd4M,EAAK5M,QAAwB/B,SAAWqhB,EAAMrhB,OAFpHqhB,EAAM2D,QAAO,SAAUrW,GAAQ,OAAsB,gBAAdA,EAAK5M,MAAwC,YAAd4M,EAAK5M,QAAwB4M,EAAK2d,SAAQtsB,SAAWqhB,EAAMrhB,QAMhJgqC,YAAW,SAAC3oB,GACR,QAAKzS,MAAMC,QAAQwS,IAGRA,EAAM2D,QAAO,SAAUrW,GAAQ,MAAsB,YAAdA,EAAK5M,MAAoC,YAAd4M,EAAK5M,QAAwB/B,SAAWqhB,EAAMrhB,QAI/H6P,OAAM,SAACC,GACH,IAAMF,EAAQzO,KAAKyO,MAAOyR,EAAQlgB,KAAKkgB,MAAOqB,EAAevhB,KAAKuhB,aAE9DrB,EACAlgB,KAAKkgB,MAAQvR,EAAQoM,WAAWmF,GACzBqB,IACPvhB,KAAKuhB,aAAe5S,EAAQoM,WAAWwG,IAEvC9S,IACAzO,KAAKyO,MAAQE,EAAQC,MAAMH,KAInCX,cAAa,WACT,OAAO9N,KAAKkgB,QAAUlgB,KAAKojC,aAG/BA,UAAS,WACL,MAAO,aAAepjC,KAAK+pB,MAG/B7b,OAAO,SAAAF,EAASQ,GACZ,IAAMC,EAAQzO,KAAKyO,MAAOyR,EAAQlgB,KAAKkgB,OAASlgB,KAAKuhB,aACrD/S,EAAOL,IAAInO,KAAK+pB,KAAM/pB,KAAKmN,WAAYnN,KAAKoN,YACxCqB,IACAD,EAAOL,IAAI,KACXM,EAAMP,OAAOF,EAASQ,IAEtBxO,KAAK2oC,YACL3oC,KAAK8oC,cAAc96B,EAASQ,EAAQxO,KAAKuhB,cAClCrB,EACPlgB,KAAK8oC,cAAc96B,EAASQ,EAAQ0R,GAEpC1R,EAAOL,IAAI,MAInBU,KAAI,SAACb,GACD,IAAI+6B,EAAiBC,EAAmBv6B,EAAQzO,KAAKyO,MAAOyR,EAAQlgB,KAAKkgB,OAASlgB,KAAKuhB,cAIvFwnB,EAAkB/6B,EAAQk6B,UAC1Bc,EAAoBh7B,EAAQuzB,YAE5BvzB,EAAQk6B,UAAY,GACpBl6B,EAAQuzB,YAAc,GAElB9yB,IACAA,EAAQA,EAAMI,KAAKb,IACTS,OAASzO,KAAK6oC,YAAYp6B,EAAMA,SACtCA,EAAQ,IAAIsjB,GAAUtjB,EAAMA,MAAM6B,KAAI,SAAAoC,GAAW,OAAAA,EAAQjE,SAAOF,KAAK,MAAOvO,KAAKoN,WAAYpN,KAAKmN,aAItG+S,IACAA,EAAQlgB,KAAKipC,SAASj7B,EAASkS,IAE/BzS,MAAMC,QAAQwS,IAAUA,EAAM,GAAGA,OAASzS,MAAMC,QAAQwS,EAAM,GAAGA,QAAUA,EAAM,GAAGA,MAAMrhB,WACzDmB,KAAKyoC,kBAAkBvoB,EAAM,GAAGA,OAAO,IACvClgB,KAAKwhB,UAAa/S,KAE/Cy6B,EADiBl7B,EAAQlM,cAAcqnC,KAAKxd,SAAS7C,aAAa1rB,UAAU0sB,aACjE5J,EAAM,GAAGA,QACpBA,EAAQA,EAAM,GAAGA,OACXvS,SAAQ,SAAAya,GAAQ,OAAAA,EAAK+C,OAAQ,OAW3C,OARInrB,KAAK2oC,aAAezoB,IACpBA,EAAM,GAAGiR,iBAAmBnjB,EAAQqO,OAAO,GAAG8U,iBAAiBQ,UAC/DzR,EAAQA,EAAM5P,KAAI,SAAU8X,GAAQ,OAAOA,EAAKvZ,KAAKb,OAIzDA,EAAQk6B,UAAYa,EACpB/6B,EAAQuzB,YAAcyH,EACf,IAAIT,GAAOvoC,KAAK+pB,KAAMtb,EAAOyR,EAAOlgB,KAAKoN,WAAYpN,KAAKmN,WAAYnN,KAAKiqB,UAAWjqB,KAAKwhB,SAAUxhB,KAAK+P,mBAGrHk5B,SAAS,SAAAj7B,EAASkS,GACd,IAAIkpB,EAAiB,EACjBC,EAAmB,EACnBC,GAAe,EACfC,GAAgB,EAEfvpC,KAAK2oC,cACNzoB,EAAQ,CAACA,EAAM,GAAGrR,KAAKb,KAG3B,IAAIw7B,EAAqB,GACzB,GAAIx7B,EAAQqO,OAAOxd,OAAS,EACxB,mBAASwP,GACL,IAAMo7B,EAAQz7B,EAAQqO,OAAOhO,GAU7B,GARmB,YAAfo7B,EAAM7oC,MACN6oC,EAAMvpB,OACNupB,EAAMvpB,MAAMrhB,OAAS,GAEjB4qC,IAAUA,EAAMvqB,MAAQuqB,EAAMpmB,WAAaomB,EAAMpmB,UAAUxkB,OAAS,IACpE2qC,EAAqBA,EAAmBzrC,OAAO0rC,EAAMpmB,YAGzDmmB,EAAmB3qC,OAAS,EAAG,CAG/B,IAFA,IAAI6qC,EAAQ,GACNl7B,EAAS,CAAEL,IAAK,SAAUlC,GAAKy9B,GAASz9B,IACrCvL,EAAI,EAAGA,EAAI8oC,EAAmB3qC,OAAQ6B,IAC3C8oC,EAAmB9oC,GAAGwN,OAAOF,EAASQ,GAEtC,OAAO0N,KAAKwtB,EAAM7sC,QAAQ,OAAQ,MAClCysC,GAAe,EACfD,MAEAE,GAAgB,EAChBH,OAtBH/6B,EAAQ,EAAGA,EAAQL,EAAQqO,OAAOxd,OAAQwP,MAA1CA,GA4Bb,IAAMs7B,EAAkBP,EAAiB,GAAKC,EAAmB,IAAME,IAAkBD,EAOzF,OALKtpC,KAAKwhB,UAAY4nB,EAAiB,GAA0B,IAArBC,IAA2BE,GAAiBD,IAChFK,KAEJzpB,EAAM,GAAGhB,MAAO,GAEbgB,GAGX8I,SAAQ,SAACe,GACL,GAAI/pB,KAAKkgB,MAEL,OAAO8T,GAAQ52B,UAAU4rB,SAAS1rB,KAAK0C,KAAKkgB,MAAM,GAAI6J,IAI9D4Y,KAAI,WACA,GAAI3iC,KAAKkgB,MAEL,OAAO8T,GAAQ52B,UAAUulC,KAAKxvB,MAAMnT,KAAKkgB,MAAM,GAAIjN,YAI3DwX,SAAQ,WACJ,GAAIzqB,KAAKkgB,MAEL,OAAO8T,GAAQ52B,UAAUqtB,SAAStX,MAAMnT,KAAKkgB,MAAM,KAI3D4oB,cAAa,SAAC96B,EAASQ,EAAQ0R,GAC3B,IACI1P,EADEmS,EAAUzC,EAAMrhB,OAKtB,GAHAmP,EAAQ80B,SAAoC,GAAL,EAAnB90B,EAAQ80B,UAGxB90B,EAAQ2D,SAAU,CAElB,IADAnD,EAAOL,IAAI,KACNqC,EAAI,EAAGA,EAAImS,EAASnS,IACrB0P,EAAM1P,GAAGtC,OAAOF,EAASQ,GAI7B,OAFAA,EAAOL,IAAI,UACXH,EAAQ80B,WAKZ,IAAMG,EAAY,KAAKllC,OAAA0P,MAAMO,EAAQ80B,UAAUv0B,KAAK,OAASy0B,EAAa,GAAAjlC,OAAGklC,EAAS,MACtF,GAAKtgB,EAEE,CAGH,IAFAnU,EAAOL,IAAI,YAAK60B,IAChB9iB,EAAM,GAAGhS,OAAOF,EAASQ,GACpBgC,EAAI,EAAGA,EAAImS,EAASnS,IACrBhC,EAAOL,IAAI60B,GACX9iB,EAAM1P,GAAGtC,OAAOF,EAASQ,GAE7BA,EAAOL,IAAI,UAAG80B,EAAS,WARvBz0B,EAAOL,IAAI,YAAK80B,EAAS,MAW7Bj1B,EAAQ80B,eCtQhB,IAAMjJ,GAAkB,SAAS1W,EAAS9G,GACtCrc,KAAKmjB,QAAUA,EACfnjB,KAAKqc,OAASA,EACdrc,KAAKqN,UAAUrN,KAAKmjB,QAASnjB,OAGjC65B,GAAgBz8B,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAClD/L,KAAM,kBACNygC,WAAW,EAEX3yB,gBAAOC,GACH3O,KAAKmjB,QAAUxU,EAAQC,MAAM5O,KAAKmjB,UAGtCtU,cAAKb,GACD,IAAMqO,EAASrc,KAAKqc,QAAUoD,EAAgBzR,EAAQqO,QACtD,OAAO,IAAIwd,GAAgB75B,KAAKmjB,QAAS9G,IAG7CutB,kBAAS57B,GACL,OAAOhO,KAAKmjB,QAAQtU,KAAK7O,KAAKqc,OAAS,IAAId,EAASa,KAAKpO,EAAShO,KAAKqc,OAAOte,OAAOiQ,EAAQqO,SAAWrO,MCpBhH,IAAMgxB,GAAO5nB,EAGPyyB,GAAY,SAAS96B,EAAI+6B,EAAU/M,GACrC/8B,KAAK+O,GAAKA,EAAG8E,OACb7T,KAAK8pC,SAAWA,EAChB9pC,KAAK+8B,SAAWA,GAGpB8M,GAAUzsC,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC5C/L,KAAM,YAEN8N,gBAAOC,GACH3O,KAAK8pC,SAAWn7B,EAAQoM,WAAW/a,KAAK8pC,WAG5Cj7B,cAAKb,GACD,IAA4Ee,EAAxEC,EAAIhP,KAAK8pC,SAAS,GAAGj7B,KAAKb,GAAUiB,EAAIjP,KAAK8pC,SAAS,GAAGj7B,KAAKb,GAElE,GAAIA,EAAQgP,SAAShd,KAAK+O,IAAK,CAQ3B,GAPAA,EAAiB,OAAZ/O,KAAK+O,GAAc,IAAM/O,KAAK+O,GAC/BC,aAAa+3B,IAAa93B,aAAagB,IACvCjB,EAAIA,EAAEm4B,WAENl4B,aAAa83B,IAAa/3B,aAAaiB,IACvChB,EAAIA,EAAEk4B,YAELn4B,EAAEmD,UAAYlD,EAAEkD,QAAS,CAC1B,IACKnD,aAAa66B,IAAa56B,aAAa46B,KAC5B,MAAT76B,EAAED,IAAcf,EAAQmJ,OAAS6nB,GAAKzqB,gBAEzC,OAAO,IAAIs1B,GAAU7pC,KAAK+O,GAAI,CAACC,EAAGC,GAAIjP,KAAK+8B,UAE/C,KAAM,CAAEn8B,KAAM,YACVqX,QAAS,gCAGjB,OAAOjJ,EAAEmD,QAAQnE,EAASe,EAAIE,GAE9B,OAAO,IAAI46B,GAAU7pC,KAAK+O,GAAI,CAACC,EAAGC,GAAIjP,KAAK+8B,WAInD7uB,OAAM,SAACF,EAASQ,GACZxO,KAAK8pC,SAAS,GAAG57B,OAAOF,EAASQ,GAC7BxO,KAAK+8B,UACLvuB,EAAOL,IAAI,KAEfK,EAAOL,IAAInO,KAAK+O,IACZ/O,KAAK+8B,UACLvuB,EAAOL,IAAI,KAEfnO,KAAK8pC,SAAS,GAAG57B,OAAOF,EAASQ,MCvDzC,IAAAu7B,GAAA,WACI,SAAAA,EAAYhgB,EAAM/b,EAASK,EAAO6F,GAC9BlU,KAAK+pB,KAAOA,EAAKnX,cACjB5S,KAAKqO,MAAQA,EACbrO,KAAKgO,QAAUA,EACfhO,KAAKkU,gBAAkBA,EAEvBlU,KAAK2Y,KAAO3K,EAAQqO,OAAO,GAAG8U,iBAAiBjkB,IAAIlN,KAAK+pB,MA2ChE,OAxCIggB,EAAA3sC,UAAA4sC,QAAA,WACI,OAAO9X,QAAQlyB,KAAK2Y,OAGxBoxB,EAAI3sC,UAAAE,KAAJ,SAAKsU,GAAL,IAmCC4f,EAAAxxB,KAlCSyN,MAAMC,QAAQkE,KAChBA,EAAO,CAACA,IAEZ,IAAMq4B,EAAWjqC,KAAK2Y,KAAKsxB,UACV,IAAbA,IACAr4B,EAAOA,EAAKtB,KAAI,SAAAtB,GAAK,OAAAA,EAAEH,KAAK2iB,EAAKxjB,aAErC,IAAMk8B,EAAgB,SAAAp1B,GAAQ,QAAgB,YAAdA,EAAKlU,OAsBrC,OAlBAgR,EAAOA,EACFiS,OAAOqmB,GACP55B,KAAI,SAAAwE,GACD,GAAkB,eAAdA,EAAKlU,KAAuB,CAC5B,IAAMupC,EAAWr1B,EAAKrG,MAAMoV,OAAOqmB,GACnC,OAAwB,IAApBC,EAAStrC,OAELiW,EAAK4nB,QAA6B,MAAnByN,EAAS,GAAGp7B,GACpB+F,EAEJq1B,EAAS,GAET,IAAI3e,GAAW2e,GAG9B,OAAOr1B,MAGE,IAAbm1B,EACOjqC,KAAK2Y,KAALxF,MAAAnT,KvCsKZ,SAAuBoqC,EAAIC,EAAMC,GACtC,GAAIA,GAA6B,IAArBr3B,UAAUpU,OAAc,IAAK,IAA4B0rC,EAAxB/5B,EAAI,EAAGwB,EAAIq4B,EAAKxrC,OAAY2R,EAAIwB,EAAGxB,KACxE+5B,GAAQ/5B,KAAK65B,IACRE,IAAIA,EAAK98B,MAAMrQ,UAAUyV,MAAMvV,KAAK+sC,EAAM,EAAG75B,IAClD+5B,EAAG/5B,GAAK65B,EAAK75B,IAGrB,OAAO45B,EAAGrsC,OAAOwsC,GAAM98B,MAAMrQ,UAAUyV,MAAMvV,KAAK+sC,IuC7KvBG,CAAA,CAAAxqC,KAAKgO,SAAY4D,GAAM,IAGrC5R,KAAK2Y,WAAL3Y,KAAa4R,IAE3Bm4B,KC7CKxf,GAAO,SAASR,EAAMnY,EAAMvD,EAAO6F,GACrClU,KAAK+pB,KAAOA,EACZ/pB,KAAK4R,KAAOA,EACZ5R,KAAKyqC,KAAgB,SAAT1gB,EACZ/pB,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,GAGrBqW,GAAKntB,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CACvC/L,KAAM,OAEN8N,gBAAOC,GACC3O,KAAK4R,OACL5R,KAAK4R,KAAOjD,EAAQoM,WAAW/a,KAAK4R,QAe5C/C,cAAKb,GAAL,IA6DCwjB,EAAAxxB,KAzDS0qC,EAAqB18B,EAAQ+O,OACnC/O,EAAQ+O,QAAU/c,KAAKyqC,MACnBzqC,KAAKyqC,MAAQz8B,EAAQyO,SACrBzO,EAAQuO,YAGZ,IAOI9E,EAPEiF,EAAW,YACT8U,EAAKiZ,MAAQz8B,EAAQyO,SACrBzO,EAAQ0O,WAEZ1O,EAAQ+O,OAAS2tB,GAIfC,EAAa,IAAIC,GAAe5qC,KAAK+pB,KAAM/b,EAAShO,KAAKoN,WAAYpN,KAAKmN,YAEhF,GAAIw9B,EAAWX,UACX,IACIvyB,EAASkzB,EAAWrtC,KAAK0C,KAAK4R,MAC9B8K,IACF,MAAOld,GAEL,GAAIA,EAAEnC,eAAe,SAAWmC,EAAEnC,eAAe,UAC7C,MAAMmC,EAEV,KAAM,CACFoB,KAAMpB,EAAEoB,MAAQ,UAChBqX,QAAS,qCAA+BjY,KAAK+pB,KAAS,KAAAhsB,OAAAyB,EAAEyY,QAAU,KAAAla,OAAKyB,EAAEyY,SAAY,IACrF5J,MAAOrO,KAAKoN,WACZ5L,SAAUxB,KAAKmN,WAAW3L,SAC1B2U,KAAM3W,EAAEozB,WACRxc,OAAQ5W,EAAEqrC,cAKtB,GAAIpzB,MAAAA,EAcA,OAXMA,aAAkB9K,IAKhB8K,EAAS,IAAIsa,GAJZta,IAAqB,IAAXA,EAIYA,EAAOvG,WAHP,OAO/BuG,EAAO7J,OAAS5N,KAAK4N,OACrB6J,EAAO5J,UAAY7N,KAAK6N,UACjB4J,EAGX,IAAM7F,EAAO5R,KAAK4R,KAAKtB,KAAI,SAAAtB,GAAK,OAAAA,EAAEH,KAAKb,MAGvC,OAFA0O,IAEO,IAAI6N,GAAKvqB,KAAK+pB,KAAMnY,EAAM5R,KAAKoN,WAAYpN,KAAKmN,aAG3De,OAAM,SAACF,EAASQ,GACZA,EAAOL,IAAI,UAAGnO,KAAK+pB,KAAO,KAAE/pB,KAAKmN,WAAYnN,KAAKoN,YAElD,IAAK,IAAI1M,EAAI,EAAGA,EAAIV,KAAK4R,KAAK/S,OAAQ6B,IAClCV,KAAK4R,KAAKlR,GAAGwN,OAAOF,EAASQ,GACzB9N,EAAI,EAAIV,KAAK4R,KAAK/S,QAClB2P,EAAOL,IAAI,MAInBK,EAAOL,IAAI,QCzGnB,IAAMsoB,GAAW,SAAS1M,EAAM1b,EAAO6F,GACnClU,KAAK+pB,KAAOA,EACZ/pB,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,GAGrBuiB,GAASr5B,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC3C/L,KAAM,WAENiO,cAAKb,GACD,IAAIgb,EAAUe,EAAO/pB,KAAK+pB,KAM1B,GAJ2B,IAAvBA,EAAKlY,QAAQ,QACbkY,EAAO,IAAAhsB,OAAI,IAAI04B,GAAS1M,EAAKlX,MAAM,GAAI7S,KAAKoN,WAAYpN,KAAKmN,YAAY0B,KAAKb,GAASS,QAGvFzO,KAAK8qC,WACL,KAAM,CAAElqC,KAAM,OACVqX,QAAS,qCAAqCla,OAAAgsB,GAC9CvoB,SAAUxB,KAAKmN,WAAW3L,SAC1B6M,MAAOrO,KAAKoN,YAqBpB,GAlBApN,KAAK8qC,YAAa,EAElB9hB,EAAWhpB,KAAK2iC,KAAK30B,EAAQqO,QAAQ,SAAUotB,GAC3C,IAAM54B,EAAI44B,EAAMzgB,SAASe,GACzB,GAAIlZ,EAAG,CACH,GAAIA,EAAE4a,UACqBzd,EAAQsO,eAAetO,EAAQsO,eAAezd,OAAS,GAC/D4sB,UAAY5a,EAAE4a,UAGjC,OAAIzd,EAAQyO,OACD,IAAK8N,GAAK,QAAS,CAAC1Z,EAAEpC,QAASI,KAAKb,GAGpC6C,EAAEpC,MAAMI,KAAKb,OAM5B,OADAhO,KAAK8qC,YAAa,EACX9hB,EAEP,KAAM,CAAEpoB,KAAM,OACVqX,QAAS,YAAYla,OAAAgsB,EAAmB,iBACxCvoB,SAAUxB,KAAKmN,WAAW3L,SAC1B6M,MAAOrO,KAAKoN,aAIxBu1B,KAAI,SAACpsB,EAAKw0B,GACN,IAAK,IAAIrqC,EAAI,EAAG2Q,OAAC,EAAE3Q,EAAI6V,EAAI1X,OAAQ6B,IAE/B,GADA2Q,EAAI05B,EAAIztC,KAAKiZ,EAAKA,EAAI7V,IACb,OAAO2Q,EAEpB,OAAO,QCzDf,IAAMqlB,GAAW,SAAS3M,EAAM1b,EAAO6F,GACnClU,KAAK+pB,KAAOA,EACZ/pB,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,GAGrBwiB,GAASt5B,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC3C/L,KAAM,WAENiO,cAAKb,GACD,IAAIwoB,EACEzM,EAAO/pB,KAAK+pB,KAEZmf,EAAal7B,EAAQlM,cAAcqnC,KAAKxd,SAAS7C,aAAa1rB,UAAU0sB,YAE9E,GAAI9pB,KAAK8qC,WACL,KAAM,CAAElqC,KAAM,OACVqX,QAAS,oCAAoCla,OAAAgsB,GAC7CvoB,SAAUxB,KAAKmN,WAAW3L,SAC1B6M,MAAOrO,KAAKoN,YAiCpB,GA9BApN,KAAK8qC,YAAa,EAElBtU,EAAWx2B,KAAK2iC,KAAK30B,EAAQqO,QAAQ,SAAUotB,GAC3C,IAAI54B,EACEm6B,EAAOvB,EAAMjT,SAASzM,GAC5B,GAAIihB,EAAM,CACN,IAAK,IAAItqC,EAAI,EAAGA,EAAIsqC,EAAKnsC,OAAQ6B,IAC7BmQ,EAAIm6B,EAAKtqC,GAETsqC,EAAKtqC,GAAK,IAAI4pB,GAAYzZ,EAAEkZ,KACxBlZ,EAAEpC,MACFoC,EAAE4a,UACF5a,EAAEsa,MACFta,EAAExC,MACFwC,EAAEqD,gBACFrD,EAAE0O,OACF1O,EAAEmY,UAMV,GAHAkgB,EAAW8B,IAEXn6B,EAAIm6B,EAAKA,EAAKnsC,OAAS,IACjB4sB,UACqBzd,EAAQsO,eAAetO,EAAQsO,eAAezd,OAAS,GAC/D4sB,UAAY5a,EAAE4a,UAGjC,OADA5a,EAAIA,EAAEpC,MAAMI,KAAKb,OAMrB,OADAhO,KAAK8qC,YAAa,EACXtU,EAEP,KAAM,CAAE51B,KAAM,OACVqX,QAAS,aAAala,OAAAgsB,EAAoB,kBAC1CvoB,SAAUxB,KAAKkU,gBAAgB1S,SAC/B6M,MAAOrO,KAAKqO,QAIxBs0B,KAAI,SAACpsB,EAAKw0B,GACN,IAAK,IAAIlqC,EAAI,EAAGwQ,OAAC,EAAExQ,EAAI0V,EAAI1X,OAAQgC,IAE/B,GADAwQ,EAAI05B,EAAIztC,KAAKiZ,EAAKA,EAAI1V,IACb,OAAOwQ,EAEpB,OAAO,QCrEf,IAAM0V,GAAY,SAASpU,EAAK5D,EAAIN,EAAOgrB,GACvCz5B,KAAK2S,IAAMA,EACX3S,KAAK+O,GAAKA,EACV/O,KAAKyO,MAAQA,EACbzO,KAAKy5B,IAAMA,GAGf1S,GAAU3pB,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC5C/L,KAAM,YAENiO,cAAKb,GACD,OAAO,IAAI+Y,GACP/mB,KAAK2S,IAAI9D,KAAO7O,KAAK2S,IAAI9D,KAAKb,GAAWhO,KAAK2S,IAC9C3S,KAAK+O,GACJ/O,KAAKyO,OAASzO,KAAKyO,MAAMI,KAAQ7O,KAAKyO,MAAMI,KAAKb,GAAWhO,KAAKyO,MAClEzO,KAAKy5B,MAIbvrB,OAAM,SAACF,EAASQ,GACZA,EAAOL,IAAInO,KAAK+N,MAAMC,KAG1BD,eAAMC,GACF,IAAIS,EAAQzO,KAAK2S,IAAI5E,MAAQ/N,KAAK2S,IAAI5E,MAAMC,GAAWhO,KAAK2S,IAW5D,OATI3S,KAAK+O,KACLN,GAASzO,KAAK+O,GACdN,GAAUzO,KAAKyO,MAAMV,MAAQ/N,KAAKyO,MAAMV,MAAMC,GAAWhO,KAAKyO,OAG9DzO,KAAKy5B,MACLhrB,EAAQA,EAAQ,IAAMzO,KAAKy5B,KAGxB,IAAA17B,OAAI0Q,EAAK,QCjCxB,IAAM0qB,GAAS,SAAS9f,EAAKqgB,EAASuR,EAAS58B,EAAO6F,GAClDlU,KAAKirC,aAAuBppC,IAAZopC,GAAgCA,EAChDjrC,KAAKyO,MAAQirB,GAAW,GACxB15B,KAAK0uB,MAAQrV,EAAIhF,OAAO,GACxBrU,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,EACjBlU,KAAKs6B,cAAgB,iBACrBt6B,KAAKu6B,UAAY,kBACjBv6B,KAAKwqB,UAAYygB,GAGrB9R,GAAO/7B,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CACzC/L,KAAM,SAENsN,OAAM,SAACF,EAASQ,GACPxO,KAAKirC,SACNz8B,EAAOL,IAAInO,KAAK0uB,MAAO1uB,KAAKmN,WAAYnN,KAAKoN,YAEjDoB,EAAOL,IAAInO,KAAKyO,OACXzO,KAAKirC,SACNz8B,EAAOL,IAAInO,KAAK0uB,QAIxBwc,kBAAiB,WACb,OAAOlrC,KAAKyO,MAAM4B,MAAMrQ,KAAKs6B,gBAGjCzrB,cAAKb,GACD,IAAMm9B,EAAOnrC,KACTyO,EAAQzO,KAAKyO,MASjB,SAAS28B,EAAiB38B,EAAO48B,EAAQC,GACrC,IAAIC,EAAiB98B,EACrB,GACIA,EAAQ88B,EAAer6B,WACvBq6B,EAAiB98B,EAAM5R,QAAQwuC,EAAQC,SAClC78B,IAAU88B,GACnB,OAAOA,EAIX,OAFA98B,EAAQ28B,EAAiB38B,EAAOzO,KAAKs6B,eAhBT,SAAU78B,EAAG+tC,EAAOC,GAC5C,IAAM56B,EAAI,IAAI4lB,GAAS,IAAI14B,OAAAytC,MAAAA,EAAAA,EAASC,GAASN,EAAK/9B,WAAY+9B,EAAKh+B,YAAY0B,KAAKb,GAAS,GAC7F,OAAQ6C,aAAasoB,GAAUtoB,EAAEpC,MAAQoC,EAAE9C,WAe/CU,EAAQ28B,EAAiB38B,EAAOzO,KAAKu6B,WAbT,SAAU98B,EAAG+tC,EAAOC,GAC5C,IAAM56B,EAAI,IAAI6lB,GAAS,IAAI34B,OAAAytC,MAAAA,EAAAA,EAASC,GAASN,EAAK/9B,WAAY+9B,EAAKh+B,YAAY0B,KAAKb,GAAS,GAC7F,OAAQ6C,aAAasoB,GAAUtoB,EAAEpC,MAAQoC,EAAE9C,WAYxC,IAAIorB,GAAOn5B,KAAK0uB,MAAQjgB,EAAQzO,KAAK0uB,MAAOjgB,EAAOzO,KAAKirC,QAASjrC,KAAKoN,WAAYpN,KAAKmN,aAGlGoC,iBAAQ6C,GAEJ,MAAmB,WAAfA,EAAMxR,MAAsBZ,KAAKirC,SAAY74B,EAAM64B,QAG5C74B,EAAMrE,OAAS/N,KAAK+N,UAAYqE,EAAMrE,QAAU,OAAIlM,EAFpD8K,EAAK6C,eAAexP,KAAKyO,MAAO2D,EAAM3D,UCrDzD,IAAMi9B,GAAM,SAAS9zB,EAAKvJ,EAAO6F,EAAiBy3B,GAC9C3rC,KAAKyO,MAAQmJ,EACb5X,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,EACjBlU,KAAK2rC,QAAUA,GAGnBD,GAAItuC,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CACtC/L,KAAM,MAEN8N,gBAAOC,GACH3O,KAAKyO,MAAQE,EAAQC,MAAM5O,KAAKyO,QAGpCP,OAAM,SAACF,EAASQ,GACZA,EAAOL,IAAI,QACXnO,KAAKyO,MAAMP,OAAOF,EAASQ,GAC3BA,EAAOL,IAAI,MAGfU,cAAKb,GACD,IACImP,EADEvF,EAAM5X,KAAKyO,MAAMI,KAAKb,GAG5B,IAAKhO,KAAK2rC,UAGkB,iBADxBxuB,EAAWnd,KAAKmN,YAAcnN,KAAKmN,WAAWgQ,WAErB,iBAAdvF,EAAInJ,OACXT,EAAQiP,oBAAoBrF,EAAInJ,QAC3BmJ,EAAI8W,QACLvR,EAAsBA,EAlC1BtgB,QAAQ,aAAa,SAASwT,GAAS,MAAO,YAAKA,OAoCnDuH,EAAInJ,MAAQT,EAAQkP,YAAYtF,EAAInJ,MAAO0O,IAE3CvF,EAAInJ,MAAQT,EAAQqP,cAAczF,EAAInJ,OAItCT,EAAQ49B,UACHh0B,EAAInJ,MAAM4B,MAAM,cAAc,CAC/B,IACMu7B,IADwC,IAA5Bh0B,EAAInJ,MAAMoD,QAAQ,KAAc,IAAM,KAC5B7D,EAAQ49B,SACJ,IAA5Bh0B,EAAInJ,MAAMoD,QAAQ,KAClB+F,EAAInJ,MAAQmJ,EAAInJ,MAAM5R,QAAQ,IAAK,GAAAkB,OAAG6tC,EAAO,MAE7Ch0B,EAAInJ,OAASm9B,EAM7B,OAAO,IAAIF,GAAI9zB,EAAK5X,KAAKoN,WAAYpN,KAAKmN,YAAY,MCpD9D,IAAMwuB,GAAQ,SAASltB,EAAOgsB,EAAUpsB,EAAO6F,EAAiBnE,GAC5D/P,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,EAEjB,IAAMmP,EAAY,IAAK2D,GAAS,GAAI,KAAM,KAAMhnB,KAAK4N,OAAQ5N,KAAK6N,WAAY2wB,uBAE9Ex+B,KAAKy6B,SAAW,IAAI/O,GAAM+O,GAC1Bz6B,KAAKkgB,MAAQ,CAAC,IAAI8T,GAAQ3Q,EAAW5U,IACrCzO,KAAKkgB,MAAM,GAAG6gB,cAAe,EAC7B/gC,KAAKgQ,mBAAmBD,GACxB/P,KAAKwqB,WAAY,EACjBxqB,KAAKqN,UAAUgW,EAAWrjB,MAC1BA,KAAKqN,UAAUrN,KAAKy6B,SAAUz6B,MAC9BA,KAAKqN,UAAUrN,KAAKkgB,MAAOlgB,OAG/B27B,GAAMv+B,UAAYD,OAAOgU,OAAO,IAAIo3B,QAChC3nC,KAAM,SAEHinC,KAEH35B,OAAM,SAACF,EAASQ,GACZA,EAAOL,IAAI,UAAWnO,KAAK6N,UAAW7N,KAAK4N,QAC3C5N,KAAKy6B,SAASvsB,OAAOF,EAASQ,GAC9BxO,KAAK8oC,cAAc96B,EAASQ,EAAQxO,KAAKkgB,QAG7CrR,KAAI,SAACb,GACIA,EAAQuzB,cACTvzB,EAAQuzB,YAAc,GACtBvzB,EAAQk6B,UAAY,IAGxB,IAAM1pC,EAAQ,IAAIm9B,GAAM,KAAM,GAAI37B,KAAK4N,OAAQ5N,KAAK6N,UAAW7N,KAAK+P,kBAkBpE,OAjBI/P,KAAKiqB,YACLjqB,KAAKkgB,MAAM,GAAG+J,UAAYjqB,KAAKiqB,UAC/BzrB,EAAMyrB,UAAYjqB,KAAKiqB,WAG3BzrB,EAAMi8B,SAAWz6B,KAAKy6B,SAAS5rB,KAAKb,GAEpCA,EAAQk6B,UAAU1nC,KAAKhC,GACvBwP,EAAQuzB,YAAY/gC,KAAKhC,GAEzBwB,KAAKkgB,MAAM,GAAGiR,iBAAmBnjB,EAAQqO,OAAO,GAAG8U,iBAAiBQ,UACpE3jB,EAAQqO,OAAO6E,QAAQlhB,KAAKkgB,MAAM,IAClC1hB,EAAM0hB,MAAQ,CAAClgB,KAAKkgB,MAAM,GAAGrR,KAAKb,IAClCA,EAAQqO,OAAO+E,QAEfpT,EAAQk6B,UAAUvrB,MAEkB,IAA7B3O,EAAQk6B,UAAUrpC,OAAeL,EAAMypC,QAAQj6B,GAClDxP,EAAM2pC,WAAWn6B,OCpC7B,IAAM69B,GAAS,SAAS5vB,EAAMwe,EAAU19B,EAASsR,EAAO6F,EAAiBnE,GAQrE,GAPA/P,KAAKjD,QAAUA,EACfiD,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,EACjBlU,KAAKic,KAAOA,EACZjc,KAAKy6B,SAAWA,EAChBz6B,KAAKwqB,WAAY,OAES3oB,IAAtB7B,KAAKjD,QAAQosC,MAAsBnpC,KAAKjD,QAAQwiB,OAChDvf,KAAKwf,KAAOxf,KAAKjD,QAAQosC,MAAQnpC,KAAKjD,QAAQwiB,WAC3C,CACH,IAAMusB,EAAY9rC,KAAKqgB,UACnByrB,GAAa,sBAAsB5vB,KAAK4vB,KACxC9rC,KAAKwf,KAAM,GAGnBxf,KAAKgQ,mBAAmBD,GACxB/P,KAAKqN,UAAUrN,KAAKy6B,SAAUz6B,MAC9BA,KAAKqN,UAAUrN,KAAKic,KAAMjc,OAG9B6rC,GAAOzuC,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CACzC/L,KAAM,SAEN8N,gBAAOC,GACC3O,KAAKy6B,WACLz6B,KAAKy6B,SAAW9rB,EAAQC,MAAM5O,KAAKy6B,WAEvCz6B,KAAKic,KAAOtN,EAAQC,MAAM5O,KAAKic,MAC1Bjc,KAAKjD,QAAQ0jB,UAAazgB,KAAKjD,QAAQwiB,SAAUvf,KAAKkf,OACvDlf,KAAKkf,KAAOvQ,EAAQC,MAAM5O,KAAKkf,QAIvChR,OAAM,SAACF,EAASQ,GACRxO,KAAKwf,UAAyC3d,IAAlC7B,KAAKic,KAAKpO,UAAUk+B,YAChCv9B,EAAOL,IAAI,WAAYnO,KAAK6N,UAAW7N,KAAK4N,QAC5C5N,KAAKic,KAAK/N,OAAOF,EAASQ,GACtBxO,KAAKy6B,WACLjsB,EAAOL,IAAI,KACXnO,KAAKy6B,SAASvsB,OAAOF,EAASQ,IAElCA,EAAOL,IAAI,OAInBkS,QAAO,WACH,OAAQrgB,KAAKic,gBAAgByvB,GACzB1rC,KAAKic,KAAKxN,MAAMA,MAAQzO,KAAKic,KAAKxN,OAG1CkR,iBAAgB,WACZ,IAAI1D,EAAOjc,KAAKic,KAIhB,OAHIA,aAAgByvB,KAChBzvB,EAAOA,EAAKxN,SAEZwN,aAAgBkd,KACTld,EAAKivB,qBAMpBprB,uBAAc9R,GACV,IAAIiO,EAAOjc,KAAKic,KAMhB,OAJIA,aAAgByvB,KAChBzvB,EAAOA,EAAKxN,OAGT,IAAIo9B,GAAO5vB,EAAKpN,KAAKb,GAAUhO,KAAKy6B,SAAUz6B,KAAKjD,QAASiD,KAAK4N,OAAQ5N,KAAK6N,UAAW7N,KAAK+P,mBAGzGi8B,kBAASh+B,GACL,IAAMiO,EAAOjc,KAAKic,KAAKpN,KAAKb,GACtBb,EAAWnN,KAAK6N,UAEtB,KAAMoO,aAAgByvB,IAAM,CAExB,IAAMI,EAAY7vB,EAAKxN,MACnBtB,GACA2+B,GACA99B,EAAQiP,oBAAoB6uB,GAC5B7vB,EAAKxN,MAAQT,EAAQkP,YAAY4uB,EAAW3+B,EAASgQ,UAErDlB,EAAKxN,MAAQT,EAAQqP,cAAcpB,EAAKxN,OAIhD,OAAOwN,GAGXpN,cAAKb,GACD,IAAMyJ,EAASzX,KAAKisC,OAAOj+B,GAW3B,OAVIhO,KAAKjD,QAAQgvC,WAAa/rC,KAAKyP,sBAC3BgI,EAAO5Y,QAA4B,IAAlB4Y,EAAO5Y,OACxB4Y,EAAO9J,SAAQ,SAAUH,GACrBA,EAAKkC,wBAIT+H,EAAO/H,sBAGR+H,GAGXw0B,gBAAOj+B,GACH,IAAImV,EACA+oB,EACEzR,EAAWz6B,KAAKy6B,UAAYz6B,KAAKy6B,SAAS5rB,KAAKb,GAErD,GAAIhO,KAAKjD,QAAQ0jB,SAAU,CACvB,GAAIzgB,KAAKkf,MAAQlf,KAAKkf,KAAKrQ,KACvB,IACI7O,KAAKkf,KAAKrQ,KAAKb,GAEnB,MAAOxO,GAEH,MADAA,EAAEyY,QAAU,iCACN,IAAIH,EAAUtY,EAAGQ,KAAKkf,KAAKvB,QAAS3d,KAAKkf,KAAK1d,UAQ5D,OALA0qC,EAAWl+B,EAAQqO,OAAO,IAAMrO,EAAQqO,OAAO,GAAG8U,mBACjCnxB,KAAKkf,MAAQlf,KAAKkf,KAAK/d,WACpC+qC,EAAS3a,YAAavxB,KAAKkf,KAAK/d,WAG7B,GAGX,GAAInB,KAAK6gB,OACoB,mBAAd7gB,KAAK6gB,OACZ7gB,KAAK6gB,KAAO7gB,KAAK6gB,QAEjB7gB,KAAK6gB,MACL,MAAO,GAGf,GAAI7gB,KAAKy6B,SAAU,CACf,IAAI0R,EAAensC,KAAKy6B,SAAShsB,MACjC,GAAIhB,MAAMC,QAAQy+B,IAAiBA,EAAattC,QAAU,EAEtD,GAAkB,gBADZkpC,EAAOoE,EAAa,IACjBvrC,MAAyB6M,MAAMC,QAAQq6B,EAAKt5B,QAAUs5B,EAAKt5B,MAAM5P,QAAU,EAEvC,aADzCstC,EAAepE,EAAKt5B,OACS,GAAG7N,MAAgD,UAA1BurC,EAAa,GAAG19B,OACtC,UAAzB09B,EAAa,GAAGvrC,OAEnBZ,KAAKwf,KAAM,GAK3B,GAAIxf,KAAKjD,QAAQwiB,OAAQ,CACrB,IAAMnH,EAAW,IAAI2Z,GAAU/xB,KAAKkf,KAAM,EACtC,CACI1d,SAAUxB,KAAK8gB,iBACfirB,UAAW/rC,KAAKic,KAAKpO,WAAa7N,KAAKic,KAAKpO,UAAUk+B,YACvD,GAAM,GAEb,OAAO/rC,KAAKy6B,SAAW,IAAIkB,GAAM,CAACvjB,GAAWpY,KAAKy6B,SAAShsB,OAAS,CAAC2J,GAClE,GAAIpY,KAAKwf,KAAOxf,KAAKosC,SAAU,CAClC,IAAMC,EAAY,IAAIR,GAAO7rC,KAAKgsC,SAASh+B,GAAUysB,EAAUz6B,KAAKjD,QAASiD,KAAK4N,QAKlF,GAJI5N,KAAKosC,WACLC,EAAU7sB,IAAMxf,KAAKosC,SACrBC,EAAUpwB,KAAKpO,UAAY7N,KAAK6N,YAE/Bw+B,EAAU7sB,KAAOxf,KAAKF,MACvB,MAAME,KAAKF,MAEf,OAAOusC,EACJ,GAAIrsC,KAAKkf,KAAM,CAClB,GAAIlf,KAAKy6B,SAAU,CACf,IAEUsN,EAFNoE,EAAensC,KAAKy6B,SAAShsB,MACjC,GAAIhB,MAAMC,QAAQy+B,IAAyC,IAAxBA,EAAattC,OAE5C,GAAkB,gBADZkpC,EAAOoE,EAAa,IACjBvrC,MAAyB6M,MAAMC,QAAQq6B,EAAKt5B,QAAUs5B,EAAKt5B,MAAM5P,QAAU,EAIhF,GAFyC,aADzCstC,EAAepE,EAAKt5B,OACS,GAAG7N,MAAgD,UAA1BurC,EAAa,GAAG19B,OACtC,UAAzB09B,EAAa,GAAGvrC,KAMnB,OAJAZ,KAAKosC,UAAW,EAChBD,EAAa,GAAK,IAAI3gB,GAAW2gB,EAAat5B,MAAM,EAAG,IACvDs5B,EAAaxrC,OAAO,EAAG,GACvBwrC,EAAa,GAAG54B,WAAY,EACrBvT,KAQvB,OAHAmjB,EAAU,IAAI6Q,GAAQ,KAAMvU,EAAgBzf,KAAKkf,KAAKgB,SAC9CihB,YAAYnzB,GAEbhO,KAAKy6B,SAAW,IAAIkB,GAAMxY,EAAQjD,MAAOlgB,KAAKy6B,SAAShsB,OAAS0U,EAAQjD,MAE/E,GAAIlgB,KAAKy6B,SAAU,CACX0R,EAAensC,KAAKy6B,SAAShsB,MACjC,GAAIhB,MAAMC,QAAQy+B,IAAiBA,EAAattC,QAAU,EAEtD,GADAstC,EAAeA,EAAa,GAAG19B,MAC3BhB,MAAMC,QAAQy+B,IAAiBA,EAAattC,QAAU,EAGtD,GAFyC,YAAzBstC,EAAa,GAAGvrC,MAAgD,UAA1BurC,EAAa,GAAG19B,OACtC,UAAzB09B,EAAa,GAAGvrC,KAMnB,OAJAZ,KAAKwf,KAAM,EACX2sB,EAAa,GAAK,IAAI3gB,GAAW2gB,EAAat5B,MAAM,EAAG,IACvDs5B,EAAaxrC,OAAO,EAAG,GACvBwrC,EAAa,GAAG54B,WAAY,EACrBvT,KAKvB,MAAO,MCtOnB,IAAMssC,GAAa,aAEnBA,GAAWlvC,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC7C4/B,mBAAkB,SAACrW,EAAYloB,GAC3B,IAAIyJ,EACE0zB,EAAOnrC,KACPwsC,EAAc,GAEpB,IAAKx+B,EAAQy+B,kBACT,KAAM,CAAEx0B,QAAS,+DACbzW,SAAUxB,KAAKmN,WAAW3L,SAC1B6M,MAAOrO,KAAKoN,YAGpB8oB,EAAaA,EAAWr5B,QAAQ,kBAAkB,SAAUY,EAAGssB,GAC3D,OAAOohB,EAAKuB,MAAM,IAAIjW,GAAS,IAAI14B,OAAAgsB,GAAQohB,EAAK/9B,WAAY+9B,EAAKh+B,YAAY0B,KAAKb,OAGtF,IACIkoB,EAAa,IAAItd,SAAS,kBAAWsd,EAAU,MACjD,MAAO12B,GACL,KAAM,CAAEyY,QAAS,gCAAAla,OAAgCyB,EAAEyY,QAAkB,WAAAla,OAAAm4B,EAAc,KAC/E10B,SAAUxB,KAAKmN,WAAW3L,SAC1B6M,MAAOrO,KAAKoN,YAGpB,IAAM20B,EAAY/zB,EAAQqO,OAAO,GAAG0lB,YACpC,IAAK,IAAM/M,KAAK+M,EAERA,EAAU1kC,eAAe23B,KACzBwX,EAAYxX,EAAEniB,MAAM,IAAM,CACtBpE,MAAOszB,EAAU/M,GAAGvmB,MACpBk+B,KAAM,WACF,OAAO3sC,KAAKyO,MAAMI,KAAKb,GAASD,WAMhD,IACI0J,EAASye,EAAW54B,KAAKkvC,GAC3B,MAAOhtC,GACL,KAAM,CAAEyY,QAAS,wCAAiCzY,EAAEuqB,KAAS,MAAAhsB,OAAAyB,EAAEyY,QAAQpb,QAAQ,OAAQ,KAAQ,KAC3F2E,SAAUxB,KAAKmN,WAAW3L,SAC1B6M,MAAOrO,KAAKoN,YAEpB,OAAOqK,GAGXi1B,eAAMn2B,GACF,OAAI9I,MAAMC,QAAQ6I,EAAI9H,QAAW8H,EAAI9H,MAAM5P,OAAS,EACzC,IAAAd,OAAIwY,EAAI9H,MAAM6B,KAAI,SAAUO,GAAK,OAAOA,EAAE9C,WAAYQ,KAAK,MAAK,KAEhEgI,EAAIxI,WCnDvB,IAAM6+B,GAAa,SAASC,EAAQ5B,EAAS58B,EAAO6F,GAChDlU,KAAKirC,QAAUA,EACfjrC,KAAKk2B,WAAa2W,EAClB7sC,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,GAGrB04B,GAAWxvC,UAAYD,OAAOgU,OAAO,IAAIm7B,GAAc,CACnD1rC,KAAM,aAENiO,cAAKb,GACD,IAAMyJ,EAASzX,KAAKusC,mBAAmBvsC,KAAKk2B,WAAYloB,GAClDpN,SAAc6W,EAEpB,MAAa,WAAT7W,GAAsBsmC,MAAMzvB,GAEZ,WAAT7W,EACA,IAAIu4B,GAAO,IAAIp7B,OAAA0Z,OAAWA,EAAQzX,KAAKirC,QAASjrC,KAAK4N,QACrDH,MAAMC,QAAQ+J,GACd,IAAIsa,GAAUta,EAAOlJ,KAAK,OAE1B,IAAIwjB,GAAUta,GANd,IAAIsvB,GAAUtvB,MClBjC,IAAMq1B,GAAa,SAASn6B,EAAKiF,GAC7B5X,KAAK2S,IAAMA,EACX3S,KAAKyO,MAAQmJ,GAGjBk1B,GAAW1vC,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC7C/L,KAAM,aAEN8N,gBAAOC,GACH3O,KAAKyO,MAAQE,EAAQC,MAAM5O,KAAKyO,QAGpCI,cAAKb,GACD,OAAIhO,KAAKyO,MAAMI,KACJ,IAAIi+B,GAAW9sC,KAAK2S,IAAK3S,KAAKyO,MAAMI,KAAKb,IAE7ChO,MAGXkO,OAAM,SAACF,EAASQ,GACZA,EAAOL,IAAI,GAAApQ,OAAGiC,KAAK2S,IAAM,MACrB3S,KAAKyO,MAAMP,OACXlO,KAAKyO,MAAMP,OAAOF,EAASQ,GAE3BA,EAAOL,IAAInO,KAAKyO,UCxB5B,IAAMs+B,GAAY,SAASh+B,EAAIiD,EAAGX,EAAGb,EAAGgtB,GACpCx9B,KAAK+O,GAAKA,EAAG8E,OACb7T,KAAKs7B,OAAStpB,EACdhS,KAAKq7B,OAAShqB,EACdrR,KAAK4N,OAAS4C,EACdxQ,KAAKw9B,OAASA,GAGlBuP,GAAU3vC,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC5C/L,KAAM,YAEN8N,gBAAOC,GACH3O,KAAKs7B,OAAS3sB,EAAQC,MAAM5O,KAAKs7B,QACjCt7B,KAAKq7B,OAAS1sB,EAAQC,MAAM5O,KAAKq7B,SAGrCxsB,cAAKb,GACD,IAAMyJ,EAAS,SAAW1I,EAAIC,EAAGC,GAC7B,OAAQF,GACJ,IAAK,MAAO,OAAOC,GAAKC,EACxB,IAAK,KAAO,OAAOD,GAAKC,EACxB,QACI,OAAQtC,EAAK4C,QAAQP,EAAGC,IACpB,KAAM,EACF,MAAc,MAAPF,GAAqB,OAAPA,GAAsB,OAAPA,EACxC,KAAK,EACD,MAAc,MAAPA,GAAqB,OAAPA,GAAsB,OAAPA,GAAsB,OAAPA,EACvD,KAAK,EACD,MAAc,MAAPA,GAAqB,OAAPA,EACzB,QACI,OAAO,IAbZ,CAgBZ/O,KAAK+O,GAAI/O,KAAKs7B,OAAOzsB,KAAKb,GAAUhO,KAAKq7B,OAAOxsB,KAAKb,IAExD,OAAOhO,KAAKw9B,QAAU/lB,EAASA,KCjCvC,IAAMu1B,GAAgB,SAAUj+B,EAAIiD,EAAGvG,EAAGwhC,EAAK57B,EAAGb,GAC9CxQ,KAAK+O,GAAKA,EAAG8E,OACb7T,KAAKs7B,OAAStpB,EACdhS,KAAKktC,OAASzhC,EACdzL,KAAKitC,IAAMA,EAAMA,EAAIp5B,OAAS,KAC9B7T,KAAKq7B,OAAShqB,EACdrR,KAAK4N,OAAS4C,EACdxQ,KAAKmtC,QAAU,IAGnBH,GAAc5vC,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAChD/L,KAAM,gBAEN8N,gBAAOC,GACH3O,KAAKs7B,OAAS3sB,EAAQC,MAAM5O,KAAKs7B,QACjCt7B,KAAKktC,OAASv+B,EAAQC,MAAM5O,KAAKktC,QAC7BltC,KAAKq7B,SACLr7B,KAAKq7B,OAAS1sB,EAAQC,MAAM5O,KAAKq7B,UAIzCxsB,cAAKb,GAGD,IAAIo/B,EACAhlB,EAHJpoB,KAAKs7B,OAASt7B,KAAKs7B,OAAOzsB,KAAKb,GAK/B,IAAK,IAAItN,EAAI,GAAI0nB,EAAOpa,EAAQqO,OAAO3b,MACjB,YAAd0nB,EAAKxnB,QACLwsC,EAAsBhlB,EAAKlI,MAAMyiB,MAAK,SAAUtxB,GAC5C,SAAKA,aAAaiZ,IAAgBjZ,EAAE2X,eAHJtoB,KA+B5C,OAfKV,KAAKqtC,aACNrtC,KAAKqtC,WAAaz4B,EAAK5U,KAAKktC,SAG5BE,GACAptC,KAAKktC,OAASltC,KAAKqtC,WACnBrtC,KAAKktC,OAASltC,KAAKktC,OAAOr+B,KAAKb,GAC/BhO,KAAKmtC,QAAQ3sC,KAAKR,KAAKktC,SAEvBltC,KAAKktC,OAASltC,KAAKktC,OAAOr+B,KAAKb,GAG/BhO,KAAKq7B,SACLr7B,KAAKq7B,OAASr7B,KAAKq7B,OAAOxsB,KAAKb,IAE5BhO,MAGXkO,OAAM,SAACF,EAASQ,GACZxO,KAAKs7B,OAAOptB,OAAOF,EAASQ,GAC5BA,EAAOL,IAAI,IAAMnO,KAAK+O,GAAK,KACvB/O,KAAKmtC,QAAQtuC,OAAS,IACtBmB,KAAKktC,OAASltC,KAAKmtC,QAAQ/rB,SAE/BphB,KAAKktC,OAAOh/B,OAAOF,EAASQ,GACxBxO,KAAKq7B,SACL7sB,EAAOL,IAAI,IAAMnO,KAAKitC,IAAM,KAC5BjtC,KAAKq7B,OAAOntB,OAAOF,EAASQ,OCpExC,IAAMotB,GAAY,SAASntB,EAAOgsB,EAAUpsB,EAAO6F,EAAiBnE,GAChE/P,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,EAEjB,IAAMmP,EAAY,IAAK2D,GAAS,GAAI,KAAM,KAAMhnB,KAAK4N,OAAQ5N,KAAK6N,WAAY2wB,uBAE9Ex+B,KAAKy6B,SAAW,IAAI/O,GAAM+O,GAC1Bz6B,KAAKkgB,MAAQ,CAAC,IAAI8T,GAAQ3Q,EAAW5U,IACrCzO,KAAKkgB,MAAM,GAAG6gB,cAAe,EAC7B/gC,KAAKgQ,mBAAmBD,GACxB/P,KAAKwqB,WAAY,EACjBxqB,KAAKqN,UAAUgW,EAAWrjB,MAC1BA,KAAKqN,UAAUrN,KAAKy6B,SAAUz6B,MAC9BA,KAAKqN,UAAUrN,KAAKkgB,MAAOlgB,OAG/B47B,GAAUx+B,UAAYD,OAAOgU,OAAO,IAAIo3B,QACpC3nC,KAAM,aAEHinC,KAEH35B,OAAM,SAACF,EAASQ,GACZA,EAAOL,IAAI,cAAenO,KAAK6N,UAAW7N,KAAK4N,QAC/C5N,KAAKy6B,SAASvsB,OAAOF,EAASQ,GAC9BxO,KAAK8oC,cAAc96B,EAASQ,EAAQxO,KAAKkgB,QAG7CrR,KAAI,SAACb,GACIA,EAAQuzB,cACTvzB,EAAQuzB,YAAc,GACtBvzB,EAAQk6B,UAAY,IAGxB,IAAM1pC,EAAQ,IAAIo9B,GAAU,KAAM,GAAI57B,KAAK4N,OAAQ5N,KAAK6N,UAAW7N,KAAK+P,kBAkBxE,OAjBI/P,KAAKiqB,YACLjqB,KAAKkgB,MAAM,GAAG+J,UAAYjqB,KAAKiqB,UAC/BzrB,EAAMyrB,UAAYjqB,KAAKiqB,WAG3BzrB,EAAMi8B,SAAWz6B,KAAKy6B,SAAS5rB,KAAKb,GAEpCA,EAAQk6B,UAAU1nC,KAAKhC,GACvBwP,EAAQuzB,YAAY/gC,KAAKhC,GAEzBwB,KAAKkgB,MAAM,GAAGiR,iBAAmBnjB,EAAQqO,OAAO,GAAG8U,iBAAiBQ,UACpE3jB,EAAQqO,OAAO6E,QAAQlhB,KAAKkgB,MAAM,IAClC1hB,EAAM0hB,MAAQ,CAAClgB,KAAKkgB,MAAM,GAAGrR,KAAKb,IAClCA,EAAQqO,OAAO+E,QAEfpT,EAAQk6B,UAAUvrB,MAEkB,IAA7B3O,EAAQk6B,UAAUrpC,OAAeL,EAAMypC,QAAQj6B,GAClDxP,EAAM2pC,WAAWn6B,OCxD7B,IAAMs/B,GAAoB,SAAS7+B,GAC/BzO,KAAKyO,MAAQA,GAGjB6+B,GAAkBlwC,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CACpD/L,KAAM,sBCHV,IAAM2sC,GAAW,SAAS//B,GACtBxN,KAAKyO,MAAQjB,GAGjB+/B,GAASnwC,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC3C/L,KAAM,WAENsN,OAAM,SAACF,EAASQ,GACZA,EAAOL,IAAI,KACXnO,KAAKyO,MAAMP,OAAOF,EAASQ,IAG/BK,cAAKb,GACD,OAAIA,EAAQgP,WACD,IAAK6sB,GAAU,IAAK,CAAC,IAAI9C,IAAW,GAAI/mC,KAAKyO,QAASI,KAAKb,GAE/D,IAAIu/B,GAASvtC,KAAKyO,MAAMI,KAAKb,OCjB5C,IAAM4U,GAAS,SAASoB,EAAUiB,EAAQ5W,EAAO6F,EAAiBnE,GAU9D,OATA/P,KAAKgkB,SAAWA,EAChBhkB,KAAKilB,OAASA,EACdjlB,KAAK4kB,UAAYhC,GAAO4qB,UACxBxtC,KAAK+jB,WAAa,CAAC/jB,KAAK4kB,WACxB5kB,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,EACjBlU,KAAKgQ,mBAAmBD,GACxB/P,KAAKwqB,WAAY,EAETvF,GACJ,IAAK,OACL,IAAK,MACDjlB,KAAKqmB,aAAc,EACnBrmB,KAAK0mB,YAAa,EAClB,MACJ,QACI1mB,KAAKqmB,aAAc,EACnBrmB,KAAK0mB,YAAa,EAG1B1mB,KAAKqN,UAAUrN,KAAKgkB,SAAUhkB,OAGlC4iB,GAAOxlB,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CACzC/L,KAAM,SAEN8N,gBAAOC,GACH3O,KAAKgkB,SAAWrV,EAAQC,MAAM5O,KAAKgkB,WAGvCnV,cAAKb,GACD,OAAO,IAAI4U,GAAO5iB,KAAKgkB,SAASnV,KAAKb,GAAUhO,KAAKilB,OAAQjlB,KAAKoN,WAAYpN,KAAKmN,WAAYnN,KAAK+P,mBAKvGoE,eAAMnG,GACF,OAAO,IAAI4U,GAAO5iB,KAAKgkB,SAAUhkB,KAAKilB,OAAQjlB,KAAKoN,WAAYpN,KAAKmN,WAAYnN,KAAK+P,mBAIzFmT,2BAAkBG,GACd,IAAuB7S,EAAGi9B,EAAtBC,EAAe,GAEnB,IAAKl9B,EAAI,EAAGA,EAAI6S,EAAUxkB,OAAQ2R,IAC9Bi9B,EAAmBpqB,EAAU7S,GAAG2V,SAG5B3V,EAAI,GAAKi9B,EAAiB5uC,QAAmD,KAAzC4uC,EAAiB,GAAGz5B,WAAWvF,QACnEg/B,EAAiB,GAAGz5B,WAAWvF,MAAQ,KAE3Ci/B,EAAeA,EAAa3vC,OAAOslB,EAAU7S,GAAG2V,UAGpDnmB,KAAK6kB,cAAgB,CAAC,IAAImC,GAAS0mB,IACnC1tC,KAAK6kB,cAAc,GAAG7U,mBAAmBhQ,KAAK+P,qBAItD6S,GAAO4qB,QAAU,ECzDjB,IAAMhW,GAAe,SAASxO,EAAU3a,EAAO6F,GAC3ClU,KAAKgpB,SAAWA,EAChBhpB,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,EACjBlU,KAAKwqB,WAAY,GAGrBgN,GAAap6B,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC/C/L,KAAM,eAENiO,cAAKb,GACD,IAAIkS,EACA8V,EAAkB,IAAIS,GAASz2B,KAAKgpB,SAAUhpB,KAAKoN,WAAYpN,KAAKmN,YAAY0B,KAAKb,GACnFlO,EAAQ,IAAIgY,EAAU,CAACG,QAAS,oCAAAla,OAAoCiC,KAAKgpB,YAE/E,IAAKgN,EAAgB7S,QAAS,CAC1B,GAAI6S,EAAgB9V,MAChBA,EAAQ8V,OAEP,GAAIvoB,MAAMC,QAAQsoB,GACnB9V,EAAQ,IAAI8T,GAAQ,GAAIgC,OAEvB,CAAA,IAAIvoB,MAAMC,QAAQsoB,EAAgBvnB,OAInC,MAAM3O,EAHNogB,EAAQ,IAAI8T,GAAQ,GAAIgC,EAAgBvnB,OAK5CunB,EAAkB,IAAI6D,GAAgB3Z,GAG1C,GAAI8V,EAAgB7S,QAChB,OAAO6S,EAAgB4T,SAAS57B,GAEpC,MAAMlO,KCnCd,IAAM23B,GAAiB,SAASkW,EAAUtW,EAAShpB,EAAOlB,GACtDnN,KAAKyO,MAAQk/B,EACb3tC,KAAKq3B,QAAUA,EACfr3B,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYV,GAGrBsqB,GAAer6B,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CACjD/L,KAAM,iBAENiO,cAAKb,GACD,IAAIwC,EAAGuZ,EAAM7J,EAAQlgB,KAAKyO,MAAMI,KAAKb,GAErC,IAAKwC,EAAI,EAAGA,EAAIxQ,KAAKq3B,QAAQx4B,OAAQ2R,IAAK,CAYtC,GAXAuZ,EAAO/pB,KAAKq3B,QAAQ7mB,GAOhB/C,MAAMC,QAAQwS,KACdA,EAAQ,IAAI8T,GAAQ,CAAC,IAAIhN,IAAa9G,IAG7B,KAAT6J,EACA7J,EAAQA,EAAMmiB,uBAEb,GAAuB,MAAnBtY,EAAK1V,OAAO,IAQjB,GAPuB,MAAnB0V,EAAK1V,OAAO,KACZ0V,EAAO,WAAI,IAAI0M,GAAS1M,EAAKvQ,OAAO,IAAI3K,KAAKb,GAASS,QAEtDyR,EAAM6hB,YACN7hB,EAAQA,EAAM8I,SAASe,KAGtB7J,EACD,KAAM,CAAEtf,KAAM,OACVqX,QAAS,YAAYla,OAAAgsB,EAAgB,cACrCvoB,SAAUxB,KAAKmN,WAAW3L,SAC1B6M,MAAOrO,KAAKoN,gBAGnB,CAWD,GATI2c,EADyB,OAAzBA,EAAKsL,UAAU,EAAG,GACX,WAAI,IAAIoB,GAAS1M,EAAKvQ,OAAO,IAAI3K,KAAKb,GAASS,OAG5B,MAAnBsb,EAAK1V,OAAO,GAAa0V,EAAO,IAAIhsB,OAAAgsB,GAE3C7J,EAAM+hB,aACN/hB,EAAQA,EAAMsW,SAASzM,KAGtB7J,EACD,KAAM,CAAEtf,KAAM,OACVqX,QAAS,oBAAa8R,EAAKvQ,OAAO,GAAe,eACjDhY,SAAUxB,KAAKmN,WAAW3L,SAC1B6M,MAAOrO,KAAKoN,YAIpB8S,EAAQA,EAAMA,EAAMrhB,OAAS,GAG7BqhB,EAAMzR,QACNyR,EAAQA,EAAMrR,KAAKb,GAASS,OAE5ByR,EAAMiD,UACNjD,EAAQA,EAAMiD,QAAQtU,KAAKb,IAGnC,OAAOkS,KCpEf,IAAM0Z,GAAa,SAAS7P,EAAM+O,EAAQ5Y,EAAOwV,EAAW+C,EAAUpc,EAAQtM,GAC1E/P,KAAK+pB,KAAOA,GAAQ,kBACpB/pB,KAAKqjB,UAAY,CAAC,IAAI2D,GAAS,CAAC,IAAIjT,EAAQ,KAAMgW,GAAM,EAAO/pB,KAAK4N,OAAQ5N,KAAK6N,cACjF7N,KAAK84B,OAASA,EACd94B,KAAK01B,UAAYA,EACjB11B,KAAKy4B,SAAWA,EAChBz4B,KAAK4tC,MAAQ9U,EAAOj6B,OACpBmB,KAAKkgB,MAAQA,EACblgB,KAAKkgC,SAAW,GAChB,IAAM2N,EAAqB,GAC3B7tC,KAAK8tC,SAAWhV,EAAO3jB,QAAO,SAAU2xB,EAAO5zB,GAC3C,OAAKA,EAAE6W,MAAS7W,EAAE6W,OAAS7W,EAAEzE,MAClBq4B,EAAQ,GAGf+G,EAAmBrtC,KAAK0S,EAAE6W,MACnB+c,KAEZ,GACH9mC,KAAK6tC,mBAAqBA,EAC1B7tC,KAAKqc,OAASA,EACdrc,KAAKgQ,mBAAmBD,GACxB/P,KAAKwqB,WAAY,GAGrBoP,GAAWx8B,UAAYD,OAAOgU,OAAO,IAAI6iB,GAAW,CAChDpzB,KAAM,kBACNygC,WAAW,EAEX3yB,gBAAOC,GACC3O,KAAK84B,QAAU94B,KAAK84B,OAAOj6B,SAC3BmB,KAAK84B,OAASnqB,EAAQoM,WAAW/a,KAAK84B,SAE1C94B,KAAKkgB,MAAQvR,EAAQoM,WAAW/a,KAAKkgB,OACjClgB,KAAK01B,YACL11B,KAAK01B,UAAY/mB,EAAQC,MAAM5O,KAAK01B,aAI5CqY,oBAAW//B,EAASggC,EAAUp8B,EAAMq8B,GAEhC,IAEIC,EACAzb,EAEAjiB,EACA6K,EACAzD,EACAmS,EACAokB,EACAC,EAVE3E,EAAQ,IAAIzV,GAAQ,KAAM,MAI1B8E,EAASrZ,EAAgBzf,KAAK84B,QAOhCuV,EAAa,EAOjB,GALIL,EAAS3xB,QAAU2xB,EAAS3xB,OAAO,IAAM2xB,EAAS3xB,OAAO,GAAG8U,mBAC5DsY,EAAMtY,iBAAmB6c,EAAS3xB,OAAO,GAAG8U,iBAAiBQ,WAEjEqc,EAAW,IAAIzyB,EAASa,KAAK4xB,EAAU,CAACvE,GAAO1rC,OAAOiwC,EAAS3xB,SAE3DzK,EAIA,IAFAy8B,GADAz8B,EAAO6N,EAAgB7N,IACL/S,OAEb2R,EAAI,EAAGA,EAAI69B,EAAY79B,IAExB,GAAIuZ,GADJ0I,EAAM7gB,EAAKpB,KACQiiB,EAAI1I,KAAO,CAE1B,IADAokB,GAAe,EACV9yB,EAAI,EAAGA,EAAIyd,EAAOj6B,OAAQwc,IAC3B,IAAK4yB,EAAe5yB,IAAM0O,IAAS+O,EAAOzd,GAAG0O,KAAM,CAC/CkkB,EAAe5yB,GAAKoX,EAAIhkB,MAAMI,KAAKb,GACnCy7B,EAAM/G,YAAY,IAAIpY,GAAYP,EAAM0I,EAAIhkB,MAAMI,KAAKb,KACvDmgC,GAAe,EACf,MAGR,GAAIA,EAAc,CACdv8B,EAAKjR,OAAO6P,EAAG,GACfA,IACA,SAEA,KAAM,CAAE5P,KAAM,UAAWqX,QAAS,6BAAsBjY,KAAK+pB,KAAQ,KAAAhsB,OAAA6T,EAAKpB,GAAGuZ,KAAI,eAMjG,IADAqkB,EAAW,EACN59B,EAAI,EAAGA,EAAIsoB,EAAOj6B,OAAQ2R,IAC3B,IAAIy9B,EAAez9B,GAAnB,CAIA,GAFAiiB,EAAM7gB,GAAQA,EAAKw8B,GAEfrkB,EAAO+O,EAAOtoB,GAAGuZ,KACjB,GAAI+O,EAAOtoB,GAAGioB,SAAU,CAEpB,IADAyV,EAAU,GACL7yB,EAAI+yB,EAAU/yB,EAAIgzB,EAAYhzB,IAC/B6yB,EAAQ1tC,KAAKoR,EAAKyJ,GAAG5M,MAAMI,KAAKb,IAEpCy7B,EAAM/G,YAAY,IAAIpY,GAAYP,EAAM,IAAIyB,GAAW0iB,GAASr/B,KAAKb,SAClE,CAEH,GADA4J,EAAM6a,GAAOA,EAAIhkB,MAITmJ,EADAnK,MAAMC,QAAQkK,GACR,IAAIiiB,GAAgB,IAAI7F,GAAQ,GAAIpc,IAGpCA,EAAI/I,KAAKb,OAEhB,CAAA,IAAI8qB,EAAOtoB,GAAG/B,MAIjB,KAAM,CAAE7N,KAAM,UAAWqX,QAAS,iCAAiCla,OAAAiC,KAAK+pB,KAAI,MAAAhsB,OAAKswC,EAAkB,SAAAtwC,OAAAiC,KAAK4tC,MAAK,MAH7Gh2B,EAAMkhB,EAAOtoB,GAAG/B,MAAMI,KAAKm/B,GAC3BvE,EAAMjI,aAKViI,EAAM/G,YAAY,IAAIpY,GAAYP,EAAMnS,IACxCq2B,EAAez9B,GAAKoH,EAI5B,GAAIkhB,EAAOtoB,GAAGioB,UAAY7mB,EACtB,IAAKyJ,EAAI+yB,EAAU/yB,EAAIgzB,EAAYhzB,IAC/B4yB,EAAe5yB,GAAKzJ,EAAKyJ,GAAG5M,MAAMI,KAAKb,GAG/CogC,IAGJ,OAAO3E,GAGX7J,cAAa,WACT,IAAM1f,EAASlgB,KAAKkgB,MAAqBlgB,KAAKkgB,MAAM5P,KAAI,SAAUe,GAC9D,OAAIA,EAAEuuB,cACKvuB,EAAEuuB,eAAc,GAEhBvuB,KAJarR,KAAKkgB,MAQjC,OADe,IAAI0Z,GAAW55B,KAAK+pB,KAAM/pB,KAAK84B,OAAQ5Y,EAAOlgB,KAAK01B,UAAW11B,KAAKy4B,SAAUz4B,KAAKqc,SAIrGxN,cAAKb,GACD,OAAO,IAAI4rB,GAAW55B,KAAK+pB,KAAM/pB,KAAK84B,OAAQ94B,KAAKkgB,MAAOlgB,KAAK01B,UAAW11B,KAAKy4B,SAAUz4B,KAAKqc,QAAUoD,EAAgBzR,EAAQqO,UAGpIiyB,SAAS,SAAAtgC,EAAS4D,EAAM6Z,GACpB,IAGIvL,EACAiD,EAJEorB,EAAa,GACbC,EAAcxuC,KAAKqc,OAASrc,KAAKqc,OAAOte,OAAOiQ,EAAQqO,QAAUrO,EAAQqO,OACzEotB,EAAQzpC,KAAK+tC,WAAW//B,EAAS,IAAIuN,EAASa,KAAKpO,EAASwgC,GAAc58B,EAAM28B,GActF,OAVA9E,EAAM/G,YAAY,IAAIpY,GAAY,aAAc,IAAIkB,GAAW+iB,GAAY1/B,KAAKb,KAEhFkS,EAAQT,EAAgBzf,KAAKkgB,QAE7BiD,EAAU,IAAI6Q,GAAQ,KAAM9T,IACpB4gB,gBAAkB9gC,KAC1BmjB,EAAUA,EAAQtU,KAAK,IAAI0M,EAASa,KAAKpO,EAAS,CAAChO,KAAMypC,GAAO1rC,OAAOywC,KACnE/iB,IACAtI,EAAUA,EAAQyc,iBAEfzc,GAGXye,eAAc,SAAChwB,EAAM5D,GACjB,QAAIhO,KAAK01B,YAAc11B,KAAK01B,UAAU7mB,KAClC,IAAI0M,EAASa,KAAKpO,EACd,CAAChO,KAAK+tC,WAAW//B,EACb,IAAIuN,EAASa,KAAKpO,EAAShO,KAAKqc,OAASrc,KAAKqc,OAAOte,OAAOiQ,EAAQqO,QAAUrO,EAAQqO,QAASzK,EAAM,KACpG7T,OAAOiC,KAAKqc,QAAU,IACtBte,OAAOiQ,EAAQqO,YAMhCslB,UAAS,SAAC/vB,EAAM5D,GACZ,IACIuiB,EADEke,EAAc78B,GAAQA,EAAK/S,QAAW,EAEtCgvC,EAAqB7tC,KAAK6tC,mBAC1Ba,EAAmB98B,EAAWA,EAAKuD,QAAO,SAAU2xB,EAAO5zB,GAC7D,OAAI26B,EAAmBh8B,QAAQqB,EAAE6W,MAAQ,EAC9B+c,EAAQ,EAERA,IAEZ,GAN6B,EAQhC,GAAK9mC,KAAKy4B,UAQN,GAAIiW,EAAmB1uC,KAAK8tC,SAAW,EACnC,OAAO,MATK,CAChB,GAAIY,EAAkB1uC,KAAK8tC,SACvB,OAAO,EAEX,GAAIW,EAAazuC,KAAK84B,OAAOj6B,OACzB,OAAO,EASf0xB,EAAMlkB,KAAK0E,IAAI29B,EAAiB1uC,KAAK4tC,OAErC,IAAK,IAAIltC,EAAI,EAAGA,EAAI6vB,EAAK7vB,IACrB,IAAKV,KAAK84B,OAAOp4B,GAAGqpB,OAAS/pB,KAAK84B,OAAOp4B,GAAG+3B,UACpC7mB,EAAKlR,GAAG+N,MAAMI,KAAKb,GAASD,SAAW/N,KAAK84B,OAAOp4B,GAAG+N,MAAMI,KAAKb,GAASD,QAC1E,OAAO,EAInB,OAAO,KC1Nf,IAAM4gC,GAAY,SAASxoB,EAAUvU,EAAMvD,EAAO6F,EAAiBuX,GAC/DzrB,KAAKgkB,SAAW,IAAIgD,GAASb,GAC7BnmB,KAAKiT,UAAYrB,GAAQ,GACzB5R,KAAK4N,OAASS,EACdrO,KAAK6N,UAAYqG,EACjBlU,KAAKyrB,UAAYA,EACjBzrB,KAAKwqB,WAAY,EACjBxqB,KAAKqN,UAAUrN,KAAKgkB,SAAUhkB,OAGlC2uC,GAAUvxC,UAAYD,OAAOgU,OAAO,IAAIxE,EAAQ,CAC5C/L,KAAM,YAEN8N,gBAAOC,GACC3O,KAAKgkB,WACLhkB,KAAKgkB,SAAWrV,EAAQC,MAAM5O,KAAKgkB,WAEnChkB,KAAKiT,UAAUpU,SACfmB,KAAKiT,UAAYtE,EAAQoM,WAAW/a,KAAKiT,aAIjDpE,cAAKb,GACD,IAAI4gC,EACAxa,EACAya,EAEApc,EACAqc,EAGAt+B,EACA/E,EACA8pB,EACAwZ,EACAC,EAEAC,EAEAC,EAKApI,EACAhG,EACAqO,EApBEv9B,EAAO,GAGPsO,EAAQ,GACV7P,GAAQ,EAMN++B,EAAa,GAEbC,EAAkB,GAYxB,SAASC,EAAalb,EAAOya,GACzB,IAAItZ,EAAGriB,EAAGq8B,EAEV,IAAKha,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAGpB,IAFA8Z,EAAgB9Z,IAAK,EACrBuK,GAAYrxB,MAAM8mB,GACbriB,EAAI,EAAGA,EAAI27B,EAAUhwC,QAAUwwC,EAAgB9Z,GAAIriB,KACpDq8B,EAAYV,EAAU37B,IACR0uB,iBACVyN,EAAgB9Z,GAAK8Z,EAAgB9Z,IAAMga,EAAU3N,eAAe,KAAM5zB,IAG9EomB,EAAMwN,iBACNyN,EAAgB9Z,GAAK8Z,EAAgB9Z,IAAMnB,EAAMwN,eAAehwB,EAAM5D,IAG9E,OAAIqhC,EAAgB,IAAMA,EAAgB,GAClCA,EAAgB,IAAMA,EAAgB,GAC/BA,EAAgB,GA1BnB,EACC,EAFD,GADW,EAqC3B,IA7BArvC,KAAKgkB,SAAWhkB,KAAKgkB,SAASnV,KAAKb,GA6B9BwC,EAAI,EAAGA,EAAIxQ,KAAKiT,UAAUpU,OAAQ2R,IAGnC,GADAs+B,GADArc,EAAMzyB,KAAKiT,UAAUzC,IACN/B,MAAMI,KAAKb,GACtBykB,EAAI8F,QAAU9qB,MAAMC,QAAQohC,EAASrgC,OAErC,IADAqgC,EAAWA,EAASrgC,MACfhD,EAAI,EAAGA,EAAIqjC,EAASjwC,OAAQ4M,IAC7BmG,EAAKpR,KAAK,CAACiO,MAAOqgC,EAASrjC,UAG/BmG,EAAKpR,KAAK,CAACupB,KAAM0I,EAAI1I,KAAMtb,MAAOqgC,IAM1C,IAFAK,EAAoB,SAAS/mB,GAAO,OAAOA,EAAKuZ,UAAU,KAAM3zB,IAE3DwC,EAAI,EAAGA,EAAIxC,EAAQqO,OAAOxd,OAAQ2R,IACnC,IAAKo+B,EAAS5gC,EAAQqO,OAAO7L,GAAGmyB,KAAK3iC,KAAKgkB,SAAU,KAAMmrB,IAAoBtwC,OAAS,EAAG,CAQtF,IAPAmwC,GAAa,EAORvjC,EAAI,EAAGA,EAAImjC,EAAO/vC,OAAQ4M,IAAK,CAIhC,IAHA2oB,EAAQwa,EAAOnjC,GAAG2c,KAClBymB,EAAYD,EAAOnjC,GAAGwQ,KACtB8yB,GAAc,EACTxZ,EAAI,EAAGA,EAAIvnB,EAAQqO,OAAOxd,OAAQ02B,IACnC,KAAOnB,aAAiBob,KAAqBpb,KAAWpmB,EAAQqO,OAAOkZ,GAAGuL,iBAAmB9yB,EAAQqO,OAAOkZ,IAAK,CAC7GwZ,GAAc,EACd,MAGJA,GAIA3a,EAAMuN,UAAU/vB,EAAM5D,MA3EX,KA4EXihC,EAAY,CAAC7a,MAAKA,EAAEhJ,MAAOkkB,EAAalb,EAAOya,KAEjCzjB,OACVgkB,EAAW5uC,KAAKyuC,GAGpB5+B,GAAQ,GAOhB,IAHAyvB,GAAYG,QAEZ6G,EAAQ,CAAC,EAAG,EAAG,GACVr7B,EAAI,EAAGA,EAAI2jC,EAAWvwC,OAAQ4M,IAC/Bq7B,EAAMsI,EAAW3jC,GAAG2f,SAGxB,GAAI0b,EA5FI,GA4Fa,EACjBoI,EA3FK,OA8FL,GADAA,EA9FI,EA+FCpI,EA/FD,GA+FkBA,EA9FjB,GA8FoC,EACrC,KAAM,CAAElmC,KAAM,UACVqX,QAAS,gEAA4DjY,KAAKyvC,OAAO79B,GAAS,KAC1FvD,MAAOrO,KAAKoN,WAAY5L,SAAUxB,KAAKmN,WAAW3L,UAI9D,IAAKiK,EAAI,EAAGA,EAAI2jC,EAAWvwC,OAAQ4M,IAE/B,GAzGI,KAwGJwjC,EAAYG,EAAW3jC,GAAG2f,QACM6jB,IAAcC,EAC1C,KACI9a,EAAQgb,EAAW3jC,GAAG2oB,iBACCob,KACnB1O,EAAkB1M,EAAM0M,iBAAmB1M,GAC3CA,EAAQ,IAAIob,GAAgB,GAAI,GAAIpb,EAAMlU,MAAO,MAAM,EAAO,KAAM4gB,EAAgB/wB,mBAC9E+wB,gBAAkBA,GAE5B,IAAM4O,EAAWtb,EAAMka,SAAStgC,EAAS4D,EAAM5R,KAAKyrB,WAAWvL,MAC/DlgB,KAAK2vC,4BAA4BD,GACjCjiC,MAAMrQ,UAAUoD,KAAK2S,MAAM+M,EAAOwvB,GACpC,MAAOlwC,GACL,KAAM,CAAEyY,QAASzY,EAAEyY,QAAS5J,MAAOrO,KAAKoN,WAAY5L,SAAUxB,KAAKmN,WAAW3L,SAAU0W,MAAO1Y,EAAE0Y,OAK7G,GAAI7H,EACA,OAAO6P,EAInB,MAAI8uB,EACM,CAAEpuC,KAAS,UACbqX,QAAS,gDAA0CjY,KAAKyvC,OAAO79B,GAAS,KACxEvD,MAASrO,KAAKoN,WAAY5L,SAAUxB,KAAKmN,WAAW3L,UAElD,CAAEZ,KAAS,OACbqX,QAAS,GAAGla,OAAAiC,KAAKgkB,SAASjW,QAAQ8F,OAAqB,iBACvDxF,MAASrO,KAAKoN,WAAY5L,SAAUxB,KAAKmN,WAAW3L,WAIhEmuC,qCAA4BC,GACxB,IAAIp/B,EACJ,GAAIxQ,KAAKyP,mBACL,IAAKe,EAAI,EAAGA,EAAIo/B,EAAY/wC,OAAQ2R,IACzBo/B,EAAYp/B,GACdd,sBAKjB+/B,gBAAO79B,GACH,MAAO,GAAA7T,OAAGiC,KAAKgkB,SAASjW,QAAQ8F,mBAAUjC,EAAOA,EAAKtB,KAAI,SAAUtB,GAChE,IAAI8/B,EAAW,GASf,OARI9/B,EAAE+a,OACF+kB,GAAY,GAAG/wC,OAAAiR,EAAE+a,WAEjB/a,EAAEP,MAAMV,MACR+gC,GAAY9/B,EAAEP,MAAMV,QAEpB+gC,GAAY,MAETA,KACRvgC,KAAK,MAAQ,GAAE,QCrKX,IAAA+L,GAAA,CACX3N,KAAIA,EAAEsD,MAAKA,EAAEs4B,OAAMA,GAAE1O,gBAAeA,GAAEgQ,UAASA,GAC/C9C,UAASA,GAAEnB,KAAIA,GAAEhJ,QAAOA,GAAEnG,SAAQA,GAAEC,SAAQA,GAC5C1C,QAAOA,GAAEjgB,QAAOA,EAAEgT,UAASA,GAAEpT,WAAUA,EAAEqT,SAAQA,GACjDmS,OAAMA,GAAE3N,WAAUA,GAAElB,YAAWA,GAAEC,KAAIA,GAAEmhB,IAAGA,GAAEG,OAAMA,GAClD1hB,QAAOA,GAAE4H,UAASA,GAAErG,MAAKA,GAAEkhB,WAAUA,GAAEE,WAAUA,GACjDC,UAASA,GAAE15B,MAAKA,EAAEsoB,MAAKA,GAAEC,UAASA,GAAEoR,cAAaA,GACjDM,kBAAiBA,GAAEC,SAAQA,GAAE3qB,OAAMA,GAAE4U,aAAYA,GACjDC,eAAcA,GACdrD,MAAO,CACH7J,KAAMokB,GACN/U,WAAY4V,KCpDpBK,GAAA,WAAA,SAAAA,KAyIA,OAxIIA,EAAOzyC,UAAAijB,QAAP,SAAQ7e,GACJ,IAAI6Z,EAAI7Z,EAASsuC,YAAY,KAQ7B,OAPIz0B,EAAI,IACJ7Z,EAAWA,EAASqR,MAAM,EAAGwI,KAEjCA,EAAI7Z,EAASsuC,YAAY,MACjB,IACJz0B,EAAI7Z,EAASsuC,YAAY,OAEzBz0B,EAAI,EACG,GAEJ7Z,EAASqR,MAAM,EAAGwI,EAAI,IAGjCw0B,EAAAzyC,UAAA2yC,mBAAA,SAAmB9zB,EAAM+zB,GACrB,MAAO,wBAAwB9zB,KAAKD,GAAQA,EAAOA,EAAO+zB,GAG9DH,EAAsBzyC,UAAA6iB,uBAAtB,SAAuBhE,GACnB,OAAOjc,KAAK+vC,mBAAmB9zB,EAAM,UAGzC4zB,EAAAzyC,UAAA6yC,aAAA,WACI,OAAO,GAGXJ,EAAAzyC,UAAA8yC,wBAAA,WACI,OAAO,GAGXL,EAAczyC,UAAA+yC,eAAd,SAAe3uC,GACX,MAAO,yBAA2B0a,KAAK1a,IAI3CquC,EAAAzyC,UAAAmR,KAAA,SAAK6hC,EAAUC,GACX,OAAKD,EAGEA,EAAWC,EAFPA,GAKfR,EAAAzyC,UAAAkzC,SAAA,SAAS/Z,EAAKga,GAGV,IAGI//B,EACAM,EACA0/B,EACAC,EANEC,EAAW1wC,KAAK2wC,gBAAgBpa,GAEhCqa,EAAe5wC,KAAK2wC,gBAAgBJ,GAKtCM,EAAO,GACX,GAAIH,EAASI,WAAaF,EAAaE,SACnC,MAAO,GAGX,IADAhgC,EAAMzE,KAAKyE,IAAI8/B,EAAaG,YAAYlyC,OAAQ6xC,EAASK,YAAYlyC,QAChE2R,EAAI,EAAGA,EAAIM,GACR8/B,EAAaG,YAAYvgC,KAAOkgC,EAASK,YAAYvgC,GADxCA,KAKrB,IAFAigC,EAAqBG,EAAaG,YAAYl+B,MAAMrC,GACpDggC,EAAiBE,EAASK,YAAYl+B,MAAMrC,GACvCA,EAAI,EAAGA,EAAIigC,EAAmB5xC,OAAS,EAAG2R,IAC3CqgC,GAAQ,MAEZ,IAAKrgC,EAAI,EAAGA,EAAIggC,EAAe3xC,OAAS,EAAG2R,IACvCqgC,GAAQ,GAAG9yC,OAAAyyC,EAAehgC,QAE9B,OAAOqgC,GAUXhB,EAAAzyC,UAAAuzC,gBAAA,SAAgBpa,EAAKga,GAOjB,IAMI//B,EACAogC,EAPEI,EAAgB,yFAEhBN,EAAWna,EAAIlmB,MAAM2gC,GACrBxY,EAAW,GACbyY,EAAiB,GACfF,EAAc,GAIpB,IAAKL,EACD,MAAM,IAAIjxC,MAAM,wCAAiC82B,EAAG,MAIxD,GAAIga,KAAaG,EAAS,IAAMA,EAAS,IAAK,CAE1C,KADAE,EAAeL,EAAQlgC,MAAM2gC,IAEzB,MAAM,IAAIvxC,MAAM,sCAA+B8wC,EAAO,MAE1DG,EAAS,GAAKA,EAAS,IAAME,EAAa,IAAM,GAC3CF,EAAS,KACVA,EAAS,GAAKE,EAAa,GAAKF,EAAS,IAIjD,GAAIA,EAAS,GAIT,IAHAO,EAAiBP,EAAS,GAAG7zC,QAAQ,MAAO,KAAK8T,MAAM,KAGlDH,EAAI,EAAGA,EAAIygC,EAAepyC,OAAQ2R,IAET,OAAtBygC,EAAezgC,GACfugC,EAAYp0B,MAEe,MAAtBs0B,EAAezgC,IACpBugC,EAAYvwC,KAAKywC,EAAezgC,IAa5C,OAPAgoB,EAASsY,SAAWJ,EAAS,GAC7BlY,EAASuY,YAAcA,EACvBvY,EAAS0Y,SAAWR,EAAS,IAAM,IAAMO,EAAe1iC,KAAK,KAC7DiqB,EAASvc,MAAQy0B,EAAS,IAAM,IAAMK,EAAYxiC,KAAK,KACvDiqB,EAASh3B,SAAWkvC,EAAS,GAC7BlY,EAAS2Y,QAAU3Y,EAASvc,MAAQy0B,EAAS,IAAM,IACnDlY,EAASjC,IAAMiC,EAAS2Y,SAAWT,EAAS,IAAM,IAC3ClY,GAEdqX,KCtIDuB,GAAA,WACI,SAAAA,IAEIpxC,KAAKqxC,QAAU,WACX,OAAO,MA8KnB,OA1KID,EAAUh0C,UAAAk0C,WAAV,SAAWl5B,EAAUpK,EAAS2P,EAAS4zB,EAAepkC,GAElD,IAAY++B,EAAUsF,EAAWC,EAAa3vC,EAAeN,EAAUiW,EAEvE3V,EAAgBkM,EAAQlM,cAEpBqL,IAEI3L,EADoB,iBAAb2L,EACIA,EAGAA,EAAS3L,UAG5B,IAAMkwC,GAAY,IAAK1xC,KAAKmpC,KAAKwI,aAAehB,gBAAgBnvC,GAAUA,SAE1E,GAAIA,IACAgwC,EAAY1vC,EAAcoL,IAAI1L,IAEf,CAEX,GADAiW,EAASzX,KAAK4xC,cAAcJ,EAAWhwC,EAAUkwC,EAAWH,GAExD,OAAO95B,EAEX,IACQ+5B,EAAUK,KACVL,EAAUK,IAAIv0C,KAAK0C,KAAKgO,QAASwjC,GAGzC,MAAOhyC,GAEH,OADAA,EAAEyY,QAAUzY,EAAEyY,SAAW,4BAClB,IAAIH,EAAUtY,EAAGme,EAASnc,GAErC,OAAOgwC,EAGfC,EAAc,CACVK,QAAS,GACThwC,cAAaA,EACbqL,SAAQA,GAEZ++B,EAAW/a,GAAiBnY,SAM5B,IACa,IAAIJ,SAAS,SAAU,UAAW,iBAAkB,YAAa,OAAQ,OAAQ,WAAYR,EACtG25B,CAAON,EAAazxC,KAAKqxC,QAAQ7vC,IANd,SAAS+U,GAC5Bi7B,EAAYj7B,IAKgD21B,EAAUlsC,KAAKmpC,KAAK7uB,KAAMta,KAAKmpC,KAAMh8B,GAErG,MAAO3N,GACH,OAAO,IAAIsY,EAAUtY,EAAGme,EAASnc,GAQrC,GALKgwC,IACDA,EAAYC,EAAYK,UAE5BN,EAAYxxC,KAAKgyC,eAAeR,EAAWhwC,EAAUkwC,cAE5B55B,EACrB,OAAO05B,EAGX,IAAIA,EAoCA,OAAO,IAAI15B,EAAU,CAAEG,QAAS,sBAAwB0F,EAASnc,GA/BjE,GAJAgwC,EAAU7zB,QAAUA,EACpB6zB,EAAUhwC,SAAWA,IAGhBgwC,EAAUS,YAAcjyC,KAAKkyC,eAAe,QAASV,EAAUS,YAAc,KAC9Ex6B,EAASzX,KAAK4xC,cAAcJ,EAAWhwC,EAAUkwC,EAAWH,IAGxD,OAAO95B,EAUf,GALA3V,EAAcqwC,UAAUX,EAAWrkC,EAAS3L,SAAU0qC,GACtDsF,EAAUrwC,UAAY+qC,EAASxa,oBAG/Bja,EAASzX,KAAK4xC,cAAcJ,EAAWhwC,EAAUkwC,EAAWH,GAExD,OAAO95B,EAIX,IACQ+5B,EAAUK,KACVL,EAAUK,IAAIv0C,KAAK0C,KAAKgO,QAASwjC,GAGzC,MAAOhyC,GAEH,OADAA,EAAEyY,QAAUzY,EAAEyY,SAAW,4BAClB,IAAIH,EAAUtY,EAAGme,EAASnc,GAQzC,OAAOgwC,GAIXJ,EAAah0C,UAAAw0C,cAAb,SAAcne,EAAQjyB,EAAUuoB,EAAMhtB,GAClC,GAAIA,IAAY02B,EAAO2e,WACnB,OAAO,IAAIt6B,EAAU,CACjBG,QAAS,6CAA6Cla,OAAAgsB,EAAoC,oCAGlG,IACI0J,EAAO2e,YAAc3e,EAAO2e,WAAWr1C,GAE3C,MAAOyC,GACH,OAAO,IAAIsY,EAAUtY,KAI7B4xC,EAAAh0C,UAAA40C,eAAA,SAAeve,EAAQjyB,EAAUuoB,GAC7B,OAAI0J,GAGsB,mBAAXA,IACPA,EAAS,IAAIA,GAGbA,EAAOwe,YACHjyC,KAAKkyC,eAAeze,EAAOwe,WAAYjyC,KAAKmpC,KAAKkJ,SAAW,EACrD,IAAIv6B,EAAU,CACjBG,QAAS,UAAAla,OAAUgsB,EAAI,sBAAAhsB,OAAqBiC,KAAKsyC,gBAAgB7e,EAAOwe,eAI7Exe,GAEJ,MAGX2d,EAAAh0C,UAAA80C,eAAA,SAAeK,EAAUC,GACG,iBAAbD,IACPA,EAAWA,EAASliC,MAAM,6BACjB+Q,QAEb,IAAK,IAAI1gB,EAAI,EAAGA,EAAI6xC,EAAS1zC,OAAQ6B,IACjC,GAAI6xC,EAAS7xC,KAAO8xC,EAAS9xC,GACzB,OAAO+P,SAAS8hC,EAAS7xC,IAAM+P,SAAS+hC,EAAS9xC,KAAO,EAAI,EAGpE,OAAO,GAGX0wC,EAAeh0C,UAAAk1C,gBAAf,SAAgBD,GAEZ,IADA,IAAII,EAAgB,GACX5xC,EAAI,EAAGA,EAAIwxC,EAAQxzC,OAAQgC,IAChC4xC,IAAkBA,EAAgB,IAAM,IAAMJ,EAAQxxC,GAE1D,OAAO4xC,GAGXrB,EAAUh0C,UAAAs1C,WAAV,SAAWC,GACP,IAAK,IAAIznB,EAAI,EAAGA,EAAIynB,EAAQ9zC,OAAQqsB,IAAK,CACrC,IAAMuI,EAASkf,EAAQznB,GACnBuI,EAAOif,YACPjf,EAAOif,eAItBtB,KC1KD,SAASwB,GAAG5kC,EAAS0nB,EAAWmd,EAAWC,GACvC,OAAOpd,EAAU7mB,KAAKb,GAAW6kC,EAAUhkC,KAAKb,GACzC8kC,EAAaA,EAAWjkC,KAAKb,GAAW,IAAI+jB,GAIvD,SAASghB,GAAU/kC,EAASgb,GACxB,IAEI,OADAA,EAASna,KAAKb,GACP4uB,GAAQkC,KACjB,MAAOt/B,GACL,OAAOo9B,GAAQmC,OAPvB6T,GAAG3I,UAAW,EAWd8I,GAAU9I,UAAW,EAErB,ICtBI+I,GDsBJC,GAAe,CAAEF,UAASA,GAAEtd,QAzB5B,SAAiBC,GACb,OAAOA,EAAYkH,GAAQkC,KAAOlC,GAAQmC,OAwBTpJ,GAAMid,ICpB3C,SAAShiC,GAAMgH,GACX,OAAOvL,KAAK0E,IAAI,EAAG1E,KAAKyE,IAAI,EAAG8G,IAEnC,SAASs7B,GAAKC,EAAWC,GACrB,IAAM3hC,EAAQuhC,GAAeE,KAAKE,EAAIrhC,EAAGqhC,EAAInnC,EAAGmnC,EAAIphC,EAAGohC,EAAIpkC,GAC3D,GAAIyC,EAOA,OANI0hC,EAAU1kC,OACV,aAAayN,KAAKi3B,EAAU1kC,OAC5BgD,EAAMhD,MAAQ0kC,EAAU1kC,MAExBgD,EAAMhD,MAAQ,MAEXgD,EAGf,SAASK,GAAML,GACX,GAAIA,EAAMK,MACN,OAAOL,EAAMK,QAEb,MAAM,IAAIrS,MAAM,2CAIxB,SAAS6S,GAAMb,GACX,GAAIA,EAAMa,MACN,OAAOb,EAAMa,QAEb,MAAM,IAAI7S,MAAM,2CAIxB,SAAS4zC,GAAOrgC,GACZ,GAAIA,aAAa+zB,GACb,OAAOE,WAAWj0B,EAAEg0B,KAAKb,GAAG,KAAOnzB,EAAEvE,MAAQ,IAAMuE,EAAEvE,OAClD,GAAiB,iBAANuE,EACd,OAAOA,EAEP,KAAM,CACFpS,KAAM,WACNqX,QAAS,8CAoZrB,IAAAxG,GAzYAuhC,GAAiB,CACb9iC,IAAK,SAAUmB,EAAGC,EAAGrC,GACjB,IAAID,EAAI,EAKR,GAAIqC,aAAama,GAAY,CACzB,IAAM5T,EAAMvG,EAAE5C,MAQd,GAPA4C,EAAIuG,EAAI,GACRtG,EAAIsG,EAAI,IACR3I,EAAI2I,EAAI,cAKSiyB,GAAW,CACxB,IAAM96B,EAAKE,EACXA,EAAIF,EAAG+6B,SAAS,GAChB96B,EAAID,EAAG+6B,SAAS,IAGxB,IAAMr4B,EAAQuhC,GAAeM,KAAKjiC,EAAGC,EAAGrC,EAAGD,GAC3C,GAAIyC,EAEA,OADAA,EAAMhD,MAAQ,MACPgD,GAGf6hC,KAAM,SAAUjiC,EAAGC,EAAGrC,EAAGD,GACrB,IACI,GAAIqC,aAAapB,EAMb,OAJIjB,EADAsC,EACI+hC,GAAO/hC,GAEPD,EAAEX,MAEH,IAAIT,EAAMoB,EAAEnB,IAAKlB,EAAG,QAE/B,IAAMkB,EAAM,CAACmB,EAAGC,EAAGrC,GAAGqB,KAAI,SAAAC,GAAK,OA7CxBgjC,EA6CkC,KA7CrCvgC,EA6CkCzC,aA5C7Bw2B,IAAa/zB,EAAEg0B,KAAKb,GAAG,KAC7Bc,WAAWj0B,EAAEvE,MAAQ8kC,EAAO,KAE5BF,GAAOrgC,GAJtB,IAAgBA,EAAGugC,KA+CP,OADAvkC,EAAIqkC,GAAOrkC,GACJ,IAAIiB,EAAMC,EAAKlB,EAAG,QAE7B,MAAOxP,MAEX4zC,IAAK,SAAUrhC,EAAG9F,EAAG+F,GACjB,IAAIhD,EAAI,EACR,GAAI+C,aAAayZ,GAAY,CACzB,IAAM5T,EAAM7F,EAAEtD,MAKd,GAJAsD,EAAI6F,EAAI,GACR3L,EAAI2L,EAAI,IACR5F,EAAI4F,EAAI,cAESiyB,GAAW,CACxB,IAAM96B,EAAKiD,EACXA,EAAIjD,EAAG+6B,SAAS,GAChB96B,EAAID,EAAG+6B,SAAS,IAGxB,IAAMr4B,EAAQuhC,GAAeE,KAAKnhC,EAAG9F,EAAG+F,EAAGhD,GAC3C,GAAIyC,EAEA,OADAA,EAAMhD,MAAQ,MACPgD,GAGfyhC,KAAM,SAAUnhC,EAAG9F,EAAG+F,EAAGhD,GACrB,IAAIwkC,EACAC,EAEJ,SAASC,EAAI3hC,GAET,OAAQ,GADRA,EAAIA,EAAI,EAAIA,EAAI,EAAKA,EAAI,EAAIA,EAAI,EAAIA,GACzB,EACDyhC,GAAMC,EAAKD,GAAMzhC,EAAI,EAEnB,EAAJA,EAAQ,EACN0hC,EAEE,EAAJ1hC,EAAQ,EACNyhC,GAAMC,EAAKD,IAAO,EAAI,EAAIzhC,GAAK,EAG/ByhC,EAIf,IACI,GAAIzhC,aAAa9B,EAMb,OAJIjB,EADA/C,EACIonC,GAAOpnC,GAEP8F,EAAErB,MAEH,IAAIT,EAAM8B,EAAE7B,IAAKlB,EAAG,QAG/B+C,EAAKshC,GAAOthC,GAAK,IAAO,IACxB9F,EAAI2E,GAAMyiC,GAAOpnC,IAAI+F,EAAIpB,GAAMyiC,GAAOrhC,IAAIhD,EAAI4B,GAAMyiC,GAAOrkC,IAG3DwkC,EAAS,EAAJxhC,GADLyhC,EAAKzhC,GAAK,GAAMA,GAAK/F,EAAI,GAAK+F,EAAI/F,EAAI+F,EAAI/F,GAG1C,IAAMiE,EAAM,CACS,IAAjBwjC,EAAI3hC,EAAI,EAAI,GACG,IAAf2hC,EAAI3hC,GACa,IAAjB2hC,EAAI3hC,EAAI,EAAI,IAGhB,OADA/C,EAAIqkC,GAAOrkC,GACJ,IAAIiB,EAAMC,EAAKlB,EAAG,QAE7B,MAAOxP,MAGXm0C,IAAK,SAAS5hC,EAAG9F,EAAG4E,GAChB,OAAOmiC,GAAeY,KAAK7hC,EAAG9F,EAAG4E,EAAG,IAGxC+iC,KAAM,SAAS7hC,EAAG9F,EAAG4E,EAAG7B,GAIpB,IAAIwB,EACA+kB,EAJJxjB,EAAMshC,GAAOthC,GAAK,IAAO,IAAO,IAChC9F,EAAIonC,GAAOpnC,GAAG4E,EAAIwiC,GAAOxiC,GAAG7B,EAAIqkC,GAAOrkC,GAOvC,IAAM6kC,EAAK,CAAChjC,EACRA,GAAK,EAAI5E,GACT4E,GAAK,GAJT0kB,EAAKxjB,EAAI,IADTvB,EAAInE,KAAKynC,MAAO/hC,EAAI,GAAM,KAKT9F,GACb4E,GAAK,GAAK,EAAI0kB,GAAKtpB,IACjB8nC,EAAO,CAAC,CAAC,EAAG,EAAG,GACjB,CAAC,EAAG,EAAG,GACP,CAAC,EAAG,EAAG,GACP,CAAC,EAAG,EAAG,GACP,CAAC,EAAG,EAAG,GACP,CAAC,EAAG,EAAG,IAEX,OAAOf,GAAeM,KAAsB,IAAjBO,EAAGE,EAAKvjC,GAAG,IACjB,IAAjBqjC,EAAGE,EAAKvjC,GAAG,IACM,IAAjBqjC,EAAGE,EAAKvjC,GAAG,IACXxB,IAGR0kC,IAAK,SAAUjiC,GACX,OAAO,IAAIs1B,GAAUj1B,GAAML,GAAOM,IAEtCiiC,WAAY,SAAUviC,GAClB,OAAO,IAAIs1B,GAA2B,IAAjBj1B,GAAML,GAAOxF,EAAS,MAE/CgoC,UAAW,SAAUxiC,GACjB,OAAO,IAAIs1B,GAA2B,IAAjBj1B,GAAML,GAAOO,EAAS,MAE/CkiC,OAAQ,SAASziC,GACb,OAAO,IAAIs1B,GAAUz0B,GAAMb,GAAOM,IAEtCoiC,cAAe,SAAU1iC,GACrB,OAAO,IAAIs1B,GAA2B,IAAjBz0B,GAAMb,GAAOxF,EAAS,MAE/CmoC,SAAU,SAAU3iC,GAChB,OAAO,IAAIs1B,GAA2B,IAAjBz0B,GAAMb,GAAOZ,EAAS,MAE/CjH,IAAK,SAAU6H,GACX,OAAO,IAAIs1B,GAAUt1B,EAAMvB,IAAI,KAEnCvK,MAAO,SAAU8L,GACb,OAAO,IAAIs1B,GAAUt1B,EAAMvB,IAAI,KAEnCrN,KAAM,SAAU4O,GACZ,OAAO,IAAIs1B,GAAUt1B,EAAMvB,IAAI,KAEnCQ,MAAO,SAAUe,GACb,OAAO,IAAIs1B,GAAUj1B,GAAML,GAAOzC,IAEtCoC,KAAM,SAAUK,GACZ,OAAO,IAAIs1B,GAAUt1B,EAAML,OAASK,EAAMf,MAAQ,IAAK,MAE3D2jC,UAAW,SAAU5iC,GACjB,IAAM4iC,EACD,MAAS5iC,EAAMvB,IAAI,GAAK,IACpB,MAASuB,EAAMvB,IAAI,GAAK,IACxB,MAASuB,EAAMvB,IAAI,GAAK,IAEjC,OAAO,IAAI62B,GAAUsN,EAAY5iC,EAAMf,MAAQ,IAAK,MAExD4jC,SAAU,SAAU7iC,EAAO8iC,EAAQC,GAG/B,IAAK/iC,EAAMvB,IACP,OAAO,KAEX,IAAMkjC,EAAMthC,GAAML,GASlB,YAPsB,IAAX+iC,GAA2C,aAAjBA,EAAO/lC,MACxC2kC,EAAInnC,GAAMmnC,EAAInnC,EAAIsoC,EAAO9lC,MAAQ,IAGjC2kC,EAAInnC,GAAKsoC,EAAO9lC,MAAQ,IAE5B2kC,EAAInnC,EAAI2E,GAAMwiC,EAAInnC,GACXinC,GAAKzhC,EAAO2hC,IAEvBqB,WAAY,SAAUhjC,EAAO8iC,EAAQC,GACjC,IAAMpB,EAAMthC,GAAML,GASlB,YAPsB,IAAX+iC,GAA2C,aAAjBA,EAAO/lC,MACxC2kC,EAAInnC,GAAMmnC,EAAInnC,EAAIsoC,EAAO9lC,MAAQ,IAGjC2kC,EAAInnC,GAAKsoC,EAAO9lC,MAAQ,IAE5B2kC,EAAInnC,EAAI2E,GAAMwiC,EAAInnC,GACXinC,GAAKzhC,EAAO2hC,IAEvBsB,QAAS,SAAUjjC,EAAO8iC,EAAQC,GAC9B,IAAMpB,EAAMthC,GAAML,GASlB,YAPsB,IAAX+iC,GAA2C,aAAjBA,EAAO/lC,MACxC2kC,EAAIphC,GAAMohC,EAAIphC,EAAIuiC,EAAO9lC,MAAQ,IAGjC2kC,EAAIphC,GAAKuiC,EAAO9lC,MAAQ,IAE5B2kC,EAAIphC,EAAIpB,GAAMwiC,EAAIphC,GACXkhC,GAAKzhC,EAAO2hC,IAEvBuB,OAAQ,SAAUljC,EAAO8iC,EAAQC,GAC7B,IAAMpB,EAAMthC,GAAML,GASlB,YAPsB,IAAX+iC,GAA2C,aAAjBA,EAAO/lC,MACxC2kC,EAAIphC,GAAMohC,EAAIphC,EAAIuiC,EAAO9lC,MAAQ,IAGjC2kC,EAAIphC,GAAKuiC,EAAO9lC,MAAQ,IAE5B2kC,EAAIphC,EAAIpB,GAAMwiC,EAAIphC,GACXkhC,GAAKzhC,EAAO2hC,IAEvBwB,OAAQ,SAAUnjC,EAAO8iC,EAAQC,GAC7B,IAAMpB,EAAMthC,GAAML,GASlB,YAPsB,IAAX+iC,GAA2C,aAAjBA,EAAO/lC,MACxC2kC,EAAIpkC,GAAMokC,EAAIpkC,EAAIulC,EAAO9lC,MAAQ,IAGjC2kC,EAAIpkC,GAAKulC,EAAO9lC,MAAQ,IAE5B2kC,EAAIpkC,EAAI4B,GAAMwiC,EAAIpkC,GACXkkC,GAAKzhC,EAAO2hC,IAEvByB,QAAS,SAAUpjC,EAAO8iC,EAAQC,GAC9B,IAAMpB,EAAMthC,GAAML,GASlB,YAPsB,IAAX+iC,GAA2C,aAAjBA,EAAO/lC,MACxC2kC,EAAIpkC,GAAMokC,EAAIpkC,EAAIulC,EAAO9lC,MAAQ,IAGjC2kC,EAAIpkC,GAAKulC,EAAO9lC,MAAQ,IAE5B2kC,EAAIpkC,EAAI4B,GAAMwiC,EAAIpkC,GACXkkC,GAAKzhC,EAAO2hC,IAEvB0B,KAAM,SAAUrjC,EAAO8iC,GACnB,IAAMnB,EAAMthC,GAAML,GAIlB,OAFA2hC,EAAIpkC,EAAIulC,EAAO9lC,MAAQ,IACvB2kC,EAAIpkC,EAAI4B,GAAMwiC,EAAIpkC,GACXkkC,GAAKzhC,EAAO2hC,IAEvB2B,KAAM,SAAUtjC,EAAO8iC,GACnB,IAAMnB,EAAMthC,GAAML,GACZiiC,GAAON,EAAIrhC,EAAIwiC,EAAO9lC,OAAS,IAIrC,OAFA2kC,EAAIrhC,EAAI2hC,EAAM,EAAI,IAAMA,EAAMA,EAEvBR,GAAKzhC,EAAO2hC,IAMvB4B,IAAK,SAAUC,EAAQC,EAAQC,GACtBA,IACDA,EAAS,IAAIpO,GAAU,KAE3B,IAAM7zB,EAAIiiC,EAAO1mC,MAAQ,IACnB2mC,EAAQ,EAAJliC,EAAQ,EACZlE,EAAI8C,GAAMmjC,GAAQjmC,EAAI8C,GAAMojC,GAAQlmC,EAEpCqmC,IAAQD,EAAIpmC,IAAM,EAAKomC,GAAKA,EAAIpmC,IAAM,EAAIomC,EAAIpmC,IAAM,GAAK,EACzDsmC,EAAK,EAAID,EAETnlC,EAAM,CAAC+kC,EAAO/kC,IAAI,GAAKmlC,EAAKH,EAAOhlC,IAAI,GAAKolC,EAC9CL,EAAO/kC,IAAI,GAAKmlC,EAAKH,EAAOhlC,IAAI,GAAKolC,EACrCL,EAAO/kC,IAAI,GAAKmlC,EAAKH,EAAOhlC,IAAI,GAAKolC,GAEnC5kC,EAAQukC,EAAOvkC,MAAQwC,EAAIgiC,EAAOxkC,OAAS,EAAIwC,GAErD,OAAO,IAAIjD,EAAMC,EAAKQ,IAE1B6kC,UAAW,SAAU9jC,GACjB,OAAOuhC,GAAeyB,WAAWhjC,EAAO,IAAIs1B,GAAU,OAE1DyO,SAAU,SAAU/jC,EAAOgkC,EAAMC,EAAOC,GAGpC,IAAKlkC,EAAMvB,IACP,OAAO,KASX,QAPqB,IAAVwlC,IACPA,EAAQ1C,GAAeM,KAAK,IAAK,IAAK,IAAK,SAE3B,IAATmC,IACPA,EAAOzC,GAAeM,KAAK,EAAG,EAAG,EAAG,IAGpCmC,EAAKrkC,OAASskC,EAAMtkC,OAAQ,CAC5B,IAAM2B,EAAI2iC,EACVA,EAAQD,EACRA,EAAO1iC,EAOX,OAJI4iC,OADqB,IAAdA,EACK,IAEAtC,GAAOsC,GAEnBlkC,EAAML,OAASukC,EACRD,EAEAD,GAyCfG,KAAM,SAAUnkC,GACZ,OAAO,IAAIsgB,GAAUtgB,EAAMc,WAE/Bd,MAAO,SAASlB,GACZ,GAAKA,aAAa4oB,IACb,uDAAuDjd,KAAK3L,EAAE9B,OAAS,CACxE,IAAMmJ,EAAMrH,EAAE9B,MAAMoE,MAAM,GAC1B,OAAO,IAAI5C,EAAM2H,OAAK/V,EAAW,IAAI9D,OAAA6Z,IAEzC,GAAKrH,aAAaN,IAAWM,EAAIN,EAAMwC,YAAYlC,EAAE9B,QAEjD,OADA8B,EAAE9B,WAAQ5M,EACH0O,EAEX,KAAM,CACF3P,KAAS,WACTqX,QAAS,oEAGjB49B,KAAM,SAASpkC,EAAO8iC,GAClB,OAAOvB,GAAegC,IAAIhC,GAAe9iC,IAAI,IAAK,IAAK,KAAMuB,EAAO8iC,IAExEuB,MAAO,SAASrkC,EAAO8iC,GACnB,OAAOvB,GAAegC,IAAIhC,GAAe9iC,IAAI,EAAG,EAAG,GAAIuB,EAAO8iC,KC1btE,SAASwB,GAAWC,EAAMf,EAAQC,GAC9B,IAGIe,EAKAC,EAEA3L,EACA4L,EAXEC,EAAKnB,EAAOvkC,MAKZ2lC,EAAKnB,EAAOxkC,MAOZW,EAAI,GAEVk5B,EAAK8L,EAAKD,GAAM,EAAIC,GACpB,IAAK,IAAI31C,EAAI,EAAGA,EAAI,EAAGA,IAGnBy1C,EAAKH,EAFLC,EAAKhB,EAAO/kC,IAAIxP,GAAK,IACrBw1C,EAAKhB,EAAOhlC,IAAIxP,GAAK,KAEjB6pC,IACA4L,GAAME,EAAKH,EAAKE,GAAMH,EAChBI,GAAMJ,EAAKC,EAAKC,KAAQ5L,GAElCl5B,EAAE3Q,GAAU,IAALy1C,EAGX,OAAO,IAAIlmC,EAAMoB,EAAGk5B,GAGxB,IAAM+L,GAA0B,CAC5BC,SAAU,SAASN,EAAIC,GACnB,OAAOD,EAAKC,GAEhBM,OAAQ,SAASP,EAAIC,GACjB,OAAOD,EAAKC,EAAKD,EAAKC,GAE1BO,QAAS,SAASR,EAAIC,GAElB,OADAD,GAAM,IACQ,EACVK,GAAwBC,SAASN,EAAIC,GACrCI,GAAwBE,OAAOP,EAAK,EAAGC,IAE/CQ,UAAW,SAAST,EAAIC,GACpB,IAAI7jC,EAAI,EACJ7S,EAAIy2C,EAMR,OALIC,EAAK,KACL12C,EAAI,EACJ6S,EAAK4jC,EAAK,IAAQ5pC,KAAKsqC,KAAKV,KACpB,GAAKA,EAAK,IAAMA,EAAK,GAAKA,GAE/BA,GAAM,EAAI,EAAIC,GAAM12C,GAAK6S,EAAI4jC,IAExCW,UAAW,SAASX,EAAIC,GACpB,OAAOI,GAAwBG,QAAQP,EAAID,IAE/CY,WAAY,SAASZ,EAAIC,GACrB,OAAO7pC,KAAKyqC,IAAIb,EAAKC,IAEzBa,UAAW,SAASd,EAAIC,GACpB,OAAOD,EAAKC,EAAK,EAAID,EAAKC,GAI9Bc,QAAS,SAASf,EAAIC,GAClB,OAAQD,EAAKC,GAAM,GAEvBe,SAAU,SAAShB,EAAIC,GACnB,OAAO,EAAI7pC,KAAKyqC,IAAIb,EAAKC,EAAK,KAItC,IAAK,IAAM3gB,MAAK+gB,GAERA,GAAwBj5C,eAAek4B,MACvCwgB,GAAWxgB,IAAKwgB,GAAWz0C,KAAK,KAAMg1C,GAAwB/gB,MC3EtE,ICMM2hB,GAAmB,SAAA1pC,GAMrB,OAHcC,MAAMC,QAAQF,EAAKiB,OAC7BjB,EAAKiB,MAAQhB,MAAMD,IAKZ2pC,GAAA,CACXC,MAAO,SAASpkC,GACZ,OAAOA,GAEXqkC,IAAK,eAAS,IAAOtP,EAAA,GAAAuP,EAAA,EAAPA,EAAOrkC,UAAApU,OAAPy4C,IAAAvP,EAAOuP,GAAArkC,UAAAqkC,GACjB,OAAoB,IAAhBvP,EAAKlpC,OACEkpC,EAAK,GAET,IAAIrc,GAAMqc,IAErBhvB,QAAS,SAASw+B,EAAQlpC,GAItB,OAFAA,EAAQA,EAAMI,MAAQ,EAEfyoC,GAAiBK,GAAQlpC,IAEpCxP,OAAQ,SAAS04C,GACb,OAAO,IAAIxQ,GAAUmQ,GAAiBK,GAAQ14C,SAUlD24C,MAAO,SAAS7nB,EAAOqB,EAAKymB,GACxB,IAAIpN,EACAD,EACAsN,EAAY,EACVP,EAAO,GACTnmB,GACAoZ,EAAKpZ,EACLqZ,EAAO1a,EAAMlhB,MACTgpC,IACAC,EAAYD,EAAKhpC,SAIrB47B,EAAO,EACPD,EAAKza,GAGT,IAAK,IAAIjvB,EAAI2pC,EAAM3pC,GAAK0pC,EAAG37B,MAAO/N,GAAKg3C,EACnCP,EAAK32C,KAAK,IAAIumC,GAAUrmC,EAAG0pC,EAAGpD,OAGlC,OAAO,IAAIxb,GAAW2rB,IAE1BQ,KAAM,SAASR,EAAMS,GAAf,IAEElI,EACAmI,EAmFPrmB,EAAAxxB,KArFSkgB,EAAQ,GAIR43B,EAAU,SAAAlgC,GACZ,OAAIA,aAAejL,EACRiL,EAAI/I,KAAK2iB,EAAKxjB,SAElB4J,GAUPigC,GAPAV,EAAK1oC,OAAW0oC,aAAgBY,GAMzBZ,EAAKh0B,QACD20B,EAAQX,EAAKh0B,SAASjD,MAC1Bi3B,EAAKj3B,MACDi3B,EAAKj3B,MAAM5P,IAAIwnC,GACnBrqC,MAAMC,QAAQypC,GACVA,EAAK7mC,IAAIwnC,GAET,CAACA,EAAQX,IAZhB1pC,MAAMC,QAAQypC,EAAK1oC,OACR0oC,EAAK1oC,MAAM6B,IAAIwnC,GAEf,CAACA,EAAQX,EAAK1oC,QAYjC,IAAIupC,EAAY,SACZC,EAAU,OACVC,EAAY,SAEZN,EAAG9e,QACHkf,EAAYJ,EAAG9e,OAAO,IAAM8e,EAAG9e,OAAO,GAAG/O,KACzCkuB,EAAUL,EAAG9e,OAAO,IAAM8e,EAAG9e,OAAO,GAAG/O,KACvCmuB,EAAYN,EAAG9e,OAAO,IAAM8e,EAAG9e,OAAO,GAAG/O,KACzC6tB,EAAKA,EAAG13B,OAER03B,EAAKA,EAAGz0B,QAGZ,IAAK,IAAItiB,EAAI,EAAGA,EAAIg3C,EAASh5C,OAAQgC,IAAK,CACtC,IAAI8R,SACAlE,SACEqG,EAAO+iC,EAASh3C,GAClBiU,aAAgBwV,IAChB3X,EAA2B,iBAAdmC,EAAKiV,KAAoBjV,EAAKiV,KAAOjV,EAAKiV,KAAK,GAAGtb,MAC/DA,EAAQqG,EAAKrG,QAEbkE,EAAM,IAAIo0B,GAAUlmC,EAAI,GACxB4N,EAAQqG,GAGRA,aAAgBqV,KAIpBulB,EAAWkI,EAAG13B,MAAMrN,MAAM,GACtBmlC,GACAtI,EAASlvC,KAAK,IAAI8pB,GAAY0tB,EAC1BvpC,GACA,GAAO,EAAOzO,KAAKqO,MAAOrO,KAAKkU,kBAEnCgkC,GACAxI,EAASlvC,KAAK,IAAI8pB,GAAY4tB,EAC1B,IAAInR,GAAUlmC,EAAI,IAClB,GAAO,EAAOb,KAAKqO,MAAOrO,KAAKkU,kBAEnC+jC,GACAvI,EAASlvC,KAAK,IAAI8pB,GAAY2tB,EAC1BtlC,GACA,GAAO,EAAO3S,KAAKqO,MAAOrO,KAAKkU,kBAGvCgM,EAAM1f,KAAK,IAAIwzB,GAAQ,CAAE,IAAA,GAAc,CAAE,IAAIjgB,EAAQ,GAAI,QACrD27B,EACAkI,EAAG7d,cACH6d,EAAG7nC,oBAIX,OAAO,IAAIikB,GAAQ,CAAE,OAAc,CAAE,IAAIjgB,EAAQ,GAAI,QACjDmM,EACA03B,EAAG7d,cACH6d,EAAG7nC,kBACLlB,KAAK7O,KAAKgO,WCzJdmqC,GAAa,SAACC,EAAIpR,EAAMh0B,GAC1B,KAAMA,aAAa+zB,IACf,KAAM,CAAEnmC,KAAM,WAAYqX,QAAS,6BAOvC,OALa,OAAT+uB,EACAA,EAAOh0B,EAAEg0B,KAETh0B,EAAIA,EAAEs0B,QAEH,IAAIP,GAAUqR,EAAGnR,WAAWj0B,EAAEvE,QAASu4B,ICT5CqR,GAAgB,CAElBC,KAAO,KACPxE,MAAO,KACP6C,KAAO,KACPG,IAAO,KACPjsC,IAAO,GACP0tC,IAAO,GACPC,IAAO,GACPC,KAAO,MACPC,KAAO,MACPC,KAAO,OAGX,IAAK,IAAMpjB,MAAK8iB,GAERA,GAAch7C,eAAek4B,MAC7B8iB,GAAc9iB,IAAKqjB,GAAWt3C,KAAK,KAAM+K,KAAKkpB,IAAI8iB,GAAc9iB,MAIxE8iB,GAAcpnC,MAAQ,SAAC+B,EAAGuiB,GACtB,IAAMsjB,OAAwB,IAANtjB,EAAoB,EAAIA,EAAE9mB,MAClD,OAAOmqC,IAAW,SAAAE,GAAO,OAAAA,EAAIxpC,QAAQupC,KAAW,KAAM7lC,ICrB1D,IAAM+lC,GAAS,SAAUC,EAAOpnC,GAAjB,IAKPpB,EACA6K,EACA6Q,EACA+sB,EACAC,EACAlS,EACAmS,EACAC,EAyCP5nB,EAAAxxB,KAnDG,QADA4R,EAAOnE,MAAMrQ,UAAUyV,MAAMvV,KAAKsU,IACrB/S,QACT,KAAK,EAAG,KAAM,CAAE+B,KAAM,WAAYqX,QAAS,kCAW/C,IACIohC,EAAS,GAEP9B,EAAS,GAEf,IAAK/mC,EAAI,EAAGA,EAAIoB,EAAK/S,OAAQ2R,IAAK,CAE9B,MADA0b,EAAUta,EAAKpB,cACUu2B,IAAY,CACjC,GAAIt5B,MAAMC,QAAQkE,EAAKpB,GAAG/B,OAAQ,CAC9BhB,MAAMrQ,UAAUoD,KAAK2S,MAAMvB,EAAMnE,MAAMrQ,UAAUyV,MAAMvV,KAAKsU,EAAKpB,GAAG/B,QACpE,SAEA,KAAM,CAAE7N,KAAM,WAAYqX,QAAS,sBAQ3C,GAHAkhC,EAAsB,MADtBnS,EAA0C,MAD1CiS,EAA6C,KAA5B/sB,EAAQ8a,KAAK91B,iBAAmCrP,IAAdu3C,EAA0B,IAAIrS,GAAU7a,EAAQzd,MAAO2qC,GAAW9R,QAAUpb,EAAQob,SACjHN,KAAK91B,iBAAoCrP,IAAfs3C,EAA2BA,EAAaF,EAAejS,KAAK91B,kBACjErP,IAAfs3C,GAAqC,KAATnS,GAAoD,KAArCqS,EAAM,GAAG/R,QAAQN,KAAK91B,WAAoB81B,EAAOmS,EACxHC,EAAqB,KAATpS,QAA6BnlC,IAAdu3C,EAA0BltB,EAAQ8a,KAAK91B,WAAakoC,OAErEv3C,KADVwZ,OAAmBxZ,IAAf01C,EAAO,KAA8B,KAATvQ,GAAeA,IAASmS,EAAa5B,EAAO,IAAMA,EAAOvQ,IASzFkS,EAAgD,KAA7BG,EAAMh+B,GAAG2rB,KAAK91B,iBAAmCrP,IAAdu3C,EAA0B,IAAIrS,GAAUsS,EAAMh+B,GAAG5M,MAAO2qC,GAAW9R,QAAU+R,EAAMh+B,GAAGisB,SACvI0R,GAASC,EAAexqC,MAAQyqC,EAAiBzqC,QACjDuqC,GAASC,EAAexqC,MAAQyqC,EAAiBzqC,SAClD4qC,EAAMh+B,GAAK6Q,OAXf,CACI,QAAmBrqB,IAAfs3C,GAA4BnS,IAASmS,EACrC,KAAM,CAAEv4C,KAAM,WAAYqX,QAAS,sBAEvCs/B,EAAOvQ,GAAQqS,EAAMx6C,OACrBw6C,EAAM74C,KAAK0rB,IASnB,OAAoB,GAAhBmtB,EAAMx6C,OACCw6C,EAAM,IAEjBznC,EAAOynC,EAAM/oC,KAAI,SAAAtB,GAAO,OAAOA,EAAEjB,MAAMyjB,EAAKxjB,YAAaO,KAAKvO,KAAKgO,QAAQ2D,SAAW,IAAM,MACrF,IAAIogB,GAAU,GAAGh0B,OAAAi7C,EAAQ,MAAQ,kBAASpnC,EAAI,QAG1CyhC,GAAA,CACXtiC,IAAK,eAAS,IAAOa,EAAA,GAAA0lC,EAAA,EAAPA,EAAOrkC,UAAApU,OAAPy4C,IAAA1lC,EAAO0lC,GAAArkC,UAAAqkC,GACjB,IACI,OAAOyB,GAAOz7C,KAAK0C,MAAM,EAAM4R,GACjC,MAAOpS,MAEbsR,IAAK,eAAS,IAAOc,EAAA,GAAA0lC,EAAA,EAAPA,EAAOrkC,UAAApU,OAAPy4C,IAAA1lC,EAAO0lC,GAAArkC,UAAAqkC,GACjB,IACI,OAAOyB,GAAOz7C,KAAK0C,MAAM,EAAO4R,GAClC,MAAOpS,MAEb85C,QAAS,SAAU1hC,EAAKovB,GACpB,OAAOpvB,EAAIyvB,UAAUL,EAAKv4B,QAE9B8qC,GAAI,WACA,OAAO,IAAIxS,GAAU16B,KAAKC,KAE9BktC,IAAK,SAASxqC,EAAGC,GACb,OAAO,IAAI83B,GAAU/3B,EAAEP,MAAQQ,EAAER,MAAOO,EAAEg4B,OAE9Cz1B,IAAK,SAASiB,EAAGinC,GACb,GAAiB,iBAANjnC,GAA+B,iBAANinC,EAChCjnC,EAAI,IAAIu0B,GAAUv0B,GAClBinC,EAAI,IAAI1S,GAAU0S,QACf,KAAMjnC,aAAau0B,IAAgB0S,aAAa1S,IACnD,KAAM,CAAEnmC,KAAM,WAAYqX,QAAS,6BAGvC,OAAO,IAAI8uB,GAAU16B,KAAKkF,IAAIiB,EAAE/D,MAAOgrC,EAAEhrC,OAAQ+D,EAAEw0B,OAEvD0S,WAAY,SAAU1mC,GAGlB,OAFe4lC,IAAW,SAAAE,GAAO,OAAM,IAANA,IAAW,IAAK9lC,KCtF1C65B,GAAA,CACXrtC,EAAG,SAAU6Z,GACT,OAAO,IAAI8f,GAAO,IAAK9f,aAAeuzB,GAAavzB,EAAIsgC,UAAYtgC,EAAI5K,OAAO,IAElF0oB,OAAQ,SAAU9d,GACd,OAAO,IAAI0Y,GACP6nB,UAAUvgC,EAAI5K,OAAO5R,QAAQ,KAAM,OAAOA,QAAQ,KAAM,OAAOA,QAAQ,KAAM,OAAOA,QAAQ,KAAM,OAC7FA,QAAQ,MAAO,OAAOA,QAAQ,MAAO,SAElDA,QAAS,SAAUgwC,EAAQgN,EAASjK,EAAakK,GAC7C,IAAIriC,EAASo1B,EAAOp+B,MAIpB,OAHAmhC,EAAoC,WAArBA,EAAYhvC,KACvBgvC,EAAYnhC,MAAQmhC,EAAY7hC,QACpC0J,EAASA,EAAO5a,QAAQ,IAAIypC,OAAOuT,EAAQprC,MAAOqrC,EAAQA,EAAMrrC,MAAQ,IAAKmhC,GACtE,IAAIzW,GAAO0T,EAAOne,OAAS,GAAIjX,EAAQo1B,EAAO5B,UAEzD8O,IAAK,SAAUlN,GAIX,IAHA,IAAMj7B,EAAOnE,MAAMrQ,UAAUyV,MAAMvV,KAAK2V,UAAW,GAC/CwE,EAASo1B,EAAOp+B,iBAEX/N,GAEL+W,EAASA,EAAO5a,QAAQ,WAAW,SAAAm9C,GAC/B,IAAMvrC,EAA2B,WAAjBmD,EAAKlR,GAAGE,MACpBo5C,EAAM3pC,MAAM,MAASuB,EAAKlR,GAAG+N,MAAQmD,EAAKlR,GAAGqN,QACjD,OAAOisC,EAAM3pC,MAAM,UAAY4pC,mBAAmBxrC,GAASA,MAL1D/N,EAAI,EAAGA,EAAIkR,EAAK/S,OAAQ6B,MAAxBA,GAST,OADA+W,EAASA,EAAO5a,QAAQ,MAAO,KACxB,IAAIs8B,GAAO0T,EAAOne,OAAS,GAAIjX,EAAQo1B,EAAO5B,WCxBvDiP,GAAM,SAAClnC,EAAGmnC,GAAS,OAACnnC,aAAamnC,EAAQvd,GAAQkC,KAAOlC,GAAQmC,OAChEqb,GAAS,SAACpnC,EAAGg0B,GACf,QAAanlC,IAATmlC,EACA,KAAM,CAAEpmC,KAAM,WAAYqX,QAAS,mDAGvC,GAAoB,iBADpB+uB,EAA6B,iBAAfA,EAAKv4B,MAAqBu4B,EAAKv4B,MAAQu4B,GAEjD,KAAM,CAAEpmC,KAAM,WAAYqX,QAAS,2DAEvC,OAAQjF,aAAa+zB,IAAc/zB,EAAEg0B,KAAKb,GAAGa,GAAQpK,GAAQkC,KAAOlC,GAAQmC,OAGjEsb,GAAA,CACXC,UAAW,SAAUtnC,GACjB,OAAOknC,GAAIlnC,EAAG6mB,KAElB0gB,QAAS,SAAUvnC,GACf,OAAOknC,GAAIlnC,EAAG/C,IAElBuqC,SAAU,SAAUxnC,GAChB,OAAOknC,GAAIlnC,EAAG+zB,KAElB0T,SAAU,SAAUznC,GAChB,OAAOknC,GAAIlnC,EAAGmmB,KAElBuhB,UAAW,SAAU1nC,GACjB,OAAOknC,GAAIlnC,EAAG4pB,KAElB+d,MAAO,SAAU3nC,GACb,OAAOknC,GAAIlnC,EAAG04B,KAElBkP,QAAS,SAAU5nC,GACf,OAAOonC,GAAOpnC,EAAG,OAErB6nC,aAAc,SAAU7nC,GACpB,OAAOonC,GAAOpnC,EAAG,MAErB8nC,KAAM,SAAU9nC,GACZ,OAAOonC,GAAOpnC,EAAG,OAErBonC,OAAMA,GACNpT,KAAM,SAAUpvB,EAAKovB,GACjB,KAAMpvB,aAAemvB,IACjB,KAAM,CAAEnmC,KAAM,WACVqX,QAAS,8CAAAla,OAA8C6Z,aAAeiyB,GAAY,oCAAsC,KAWhI,OAPQ7C,EAFJA,EACIA,aAAgBpK,GACToK,EAAKv4B,MAELu4B,EAAKj5B,QAGT,GAEJ,IAAIg5B,GAAUnvB,EAAInJ,MAAOu4B,IAEpC+T,WAAY,SAAU/nC,GAClB,OAAO,IAAI+e,GAAU/e,EAAEg0B,QChEzBgU,GAAkB,SAAUppC,GAAV,IAWvB4f,EAAAxxB,KATG,QADA4R,EAAOnE,MAAMrQ,UAAUyV,MAAMvV,KAAKsU,IACrB/S,QACT,KAAK,EAAG,KAAM,CAAE+B,KAAM,WAAYqX,QAAS,kCAO/C,OAFArG,EAFmB,CAAC,IAAI6kB,GAAS7kB,EAAK,GAAGnD,MAAOzO,KAAKqO,MAAOrO,KAAKkU,iBAAiBrF,KAAK7O,KAAKgO,UAE1EsC,KAAI,SAAAtB,GAAO,OAAOA,EAAEjB,MAAMyjB,EAAKxjB,YAAaO,KAAKvO,KAAKgO,QAAQ2D,SAAW,IAAM,MAE1F,IAAIogB,GAAU,gBAASngB,EAAI,OAGvBqpC,GAAA,CACXC,MAAO,eAAS,IAAOtpC,EAAA,GAAA0lC,EAAA,EAAPA,EAAOrkC,UAAApU,OAAPy4C,IAAA1lC,EAAO0lC,GAAArkC,UAAAqkC,GACnB,IACI,OAAO0D,GAAgB19C,KAAK0C,KAAM4R,GACpC,MAAOpS,OCJjB2B,GAAA,SAAeO,GACX,IAAMP,EAAY,CAAEgwB,oBAAkB4Y,eAAcA,IAgBpD,OAbA5Y,GAAiBI,YAAYkE,IAC7BtE,GAAiBhjB,IAAI,UAAW2xB,GAAYjxB,KAAKvN,KAAKw+B,KACtD3O,GAAiBI,YAAY9f,IAC7B0f,GAAiBI,YAAY4pB,IAC7BhqB,GAAiBI,YRnBrB,SAAe7vB,GAEX,IAAM05C,EAAW,SAACC,EAAc7tC,GAAS,OAAA,IAAIk+B,GAAIl+B,EAAM6tC,EAAahtC,MAAOgtC,EAAannC,iBAAiBrF,KAAKwsC,EAAartC,UAE3H,MAAO,CAAEstC,WAAY,SAASC,EAAcC,GAEnCA,IACDA,EAAeD,EACfA,EAAe,MAGnB,IAAIE,EAAWF,GAAgBA,EAAa9sC,MACxCitC,EAAWF,EAAa/sC,MACtByF,EAAkBlU,KAAKkU,gBACvBzS,EAAmByS,EAAgBoD,YACrCpD,EAAgBzS,iBAAmByS,EAAgBynC,UAEjDC,EAAgBF,EAAS7pC,QAAQ,KACnCw2B,EAAW,IACQ,IAAnBuT,IACAvT,EAAWqT,EAAS7oC,MAAM+oC,GAC1BF,EAAWA,EAAS7oC,MAAM,EAAG+oC,IAEjC,IAAM5tC,EAAU6tC,EAAY77C,KAAKgO,SACjCA,EAAQ8tC,WAAY,EAEpB,IAAM95C,EAAcN,EAAYH,eAAem6C,EAAUj6C,EAAkBuM,EAAStM,GAAa,GAEjG,IAAKM,EACD,OAAOo5C,EAASp7C,KAAMw7C,GAG1B,IAAIO,GAAY,EAGhB,GAAKR,EAcDQ,EAAY,WAAW7/B,KAAKu/B,OAdb,CAIf,GAAiB,mBAFjBA,EAAW/5C,EAAYs6C,WAAWN,IAG9BK,GAAY,MACT,CAEH,IAAM/xB,EAAUtoB,EAAYu6C,cAAcR,GAC1CM,EAAY,CAAC,WAAY,SAASlqC,QAAQmY,GAAW,EAErD+xB,IAAaN,GAAY,WAMjC,IAAMS,EAAWl6C,EAAYm6C,aAAaT,EAAUj6C,EAAkBuM,EAAStM,GAC/E,IAAKw6C,EAAS9jC,SAEV,OADAxW,EAAO1B,KAAK,wCAAiCw7C,EAAQ,4BAC9CN,EAASp7C,KAAMw7C,GAAgBD,GAE1C,IAAIa,EAAMF,EAAS9jC,SACnB,GAAI2jC,IAAcr6C,EAAY26C,aAC1B,OAAOjB,EAASp7C,KAAMw7C,GAG1BY,EAAML,EAAYr6C,EAAY26C,aAAaD,GAAOnC,mBAAmBmC,GAErE,IAAME,EAAM,QAAQv+C,OAAA09C,cAAYW,GAAGr+C,OAAGsqC,GAEtC,OAAO,IAAIqD,GAAI,IAAIvS,GAAO,IAAIp7B,OAAAu+C,EAAM,KAAEA,GAAK,EAAOt8C,KAAKqO,MAAOrO,KAAKkU,iBAAkBlU,KAAKqO,MAAOrO,KAAKkU,mBQ/C7EqoC,CAAQ76C,IACrCyvB,GAAiBI,YAAY4lB,IAC7BhmB,GAAiBI,YAAYpa,IAC7Bga,GAAiBI,YAAY8hB,IAC7BliB,GAAiBI,YAAYsb,IAC7B1b,GAAiBI,YCtBV,CAAEirB,eAAgB,SAASC,GAC9B,IAAIC,EACAC,EAIAnkB,EAEAhoB,EACAiB,EACAmrC,EACAC,EACAnsC,EATAosC,EAAe,SACfC,EAAqB,mCACnBC,EAAY,CAACrrC,UAAU,GAEvBsrC,EAAiBR,EAAU1uC,MAAMivC,GAOvC,SAASE,IACL,KAAM,CAAEt8C,KAAM,WACVqX,QAAS,yIAejB,OAXwB,GAApBhF,UAAUpU,QACNoU,UAAU,GAAGxE,MAAM5P,OAAS,GAC5Bq+C,IAEJR,EAAQzpC,UAAU,GAAGxE,OACdwE,UAAUpU,OAAS,EAC1Bq+C,IAEAR,EAAQjvC,MAAMrQ,UAAUyV,MAAMvV,KAAK2V,UAAW,GAG1CgqC,GACJ,IAAK,YACDN,EAAuB,oCACvB,MACJ,IAAK,WACDA,EAAuB,oCACvB,MACJ,IAAK,kBACDA,EAAuB,sCACvB,MACJ,IAAK,eACDA,EAAuB,sCACvB,MACJ,IAAK,UACL,IAAK,oBACDG,EAAe,SACfH,EAAuB,4BACvBI,EAAqB,2CACrB,MACJ,QACI,KAAM,CAAEn8C,KAAM,WAAYqX,QAAS,oHAK3C,IAFAugB,EAAW,8DAA8Dz6B,OAAA++C,EAA+B,oBAAA/+C,OAAA4+C,OAEnGnsC,EAAI,EAAGA,EAAIksC,EAAM79C,OAAQ2R,GAAK,EAC3BksC,EAAMlsC,aAAcgb,IACpB/Z,EAAQirC,EAAMlsC,GAAG/B,MAAM,GACvBmuC,EAAWF,EAAMlsC,GAAG/B,MAAM,KAE1BgD,EAAQirC,EAAMlsC,GACdosC,OAAW/6C,GAGT4P,aAAiBxB,KAAoB,IAANO,GAAWA,EAAI,IAAMksC,EAAM79C,cAAwBgD,IAAb+6C,GAA6BA,aAAoB7V,KACxHmW,IAEJL,EAAgBD,EAAWA,EAAS7uC,MAAMivC,GAAmB,IAANxsC,EAAU,KAAO,OACxEE,EAAQe,EAAMf,MACd8nB,GAAY,wBAAiBqkB,EAAa,kBAAA9+C,OAAiB0T,EAAMQ,QAAO,KAAAlU,OAAI2S,EAAQ,EAAI,kBAAA3S,OAAkB2S,EAAK,KAAM,GAAE,MAO3H,OALA8nB,GAAY,KAAKz6B,OAAA++C,EAA8B,mBAAA/+C,OAAAg/C,8BAE/CvkB,EAAWyhB,mBAAmBzhB,GAE9BA,EAAW,sBAAAz6B,OAAsBy6B,GAC1B,IAAIkT,GAAI,IAAIvS,GAAO,IAAIp7B,OAAAy6B,EAAW,KAAEA,GAAU,EAAOx4B,KAAKqO,MAAOrO,KAAKkU,iBAAkBlU,KAAKqO,MAAOrO,KAAKkU,oBDtDpHid,GAAiBI,YAAY8oB,IAC7BlpB,GAAiBI,YAAY2pB,IAEtB/5C,GE7Ba,SAAAg8C,GAAAj+B,EAAMniB,GAE1B,IAAIqgD,EACArb,GAFJhlC,EAAUA,GAAW,IAEGglC,UAClBsb,EAAU,IAAI9hC,EAASa,KAAKrf,GAeT,iBAAdglC,GAA2Bt0B,MAAMC,QAAQq0B,KAChDA,EAAY5kC,OAAOs0B,KAAKsQ,GAAWzxB,KAAI,SAAU0kB,GAC7C,IAAIvmB,EAAQszB,EAAU/M,GAQtB,OANMvmB,aAAiB6L,GAAKoR,QAClBjd,aAAiB6L,GAAKkR,aACxB/c,EAAQ,IAAI6L,GAAKkR,WAAW,CAAC/c,KAEjCA,EAAQ,IAAI6L,GAAKoR,MAAM,CAACjd,KAErB,IAAI6L,GAAKgQ,YAAY,WAAI0K,GAAKvmB,GAAO,EAAO,KAAM,MAE7D4uC,EAAQhhC,OAAS,CAAC,IAAI/B,GAAK0Z,QAAQ,KAAM+N,KAG7C,IAQIlxB,EACAysC,EATE3xB,EAAW,CACb,IAAIhd,GAAQiZ,oBACZ,IAAIjZ,GAAQid,6BAA4B,GACxC,IAAIjd,GAAQkd,cACZ,IAAIld,GAAQma,aAAa,CAACnX,SAAUugB,QAAQn1B,EAAQ4U,aAGlD4rC,EAAkB,GASxB,GAAIxgD,EAAQ+E,cAAe,CACvBw7C,EAAkBvgD,EAAQ+E,cAAc6M,UACxC,IAAK,IAAIjO,EAAI,EAAGA,EAAI,EAAGA,IAEnB,IADA48C,EAAgB3lB,QACR9mB,EAAIysC,EAAgBpwC,OACpB2D,EAAE2sC,iBACQ,IAAN98C,IAA2C,IAAhC68C,EAAgB1rC,QAAQhB,KACnC0sC,EAAgB/8C,KAAKqQ,GACrBA,EAAEoO,IAAIC,IAIA,IAANxe,IAAoC,IAAzBirB,EAAS9Z,QAAQhB,KACxBA,EAAE4sC,aACF9xB,EAASzK,QAAQrQ,GAGjB8a,EAASnrB,KAAKqQ,IAQtCusC,EAAYl+B,EAAKrQ,KAAKwuC,GAEtB,IAAK,IAAIx8C,EAAI,EAAGA,EAAI8qB,EAAS9sB,OAAQgC,IACjC8qB,EAAS9qB,GAAGoe,IAAIm+B,GAIpB,GAAIrgD,EAAQ+E,cAER,IADAw7C,EAAgB3lB,QACR9mB,EAAIysC,EAAgBpwC,QACK,IAAzBye,EAAS9Z,QAAQhB,KAA6C,IAAhC0sC,EAAgB1rC,QAAQhB,IACtDA,EAAEoO,IAAIm+B,GAKlB,OAAOA,EC5FX,IA0JIM,GA1JJC,GAAA,WACI,SAAAA,EAAYxU,GACRnpC,KAAKmpC,KAAOA,EACZnpC,KAAK2rB,SAAW,GAChB3rB,KAAK2zB,cAAgB,GACrB3zB,KAAK49C,eAAiB,GACtB59C,KAAK69C,iBAAmB,GACxB79C,KAAKiB,aAAe,GACpBjB,KAAK63C,UAAY,EACjB73C,KAAK89C,YAAc,GACnB99C,KAAK+9C,OAAS,IAAI5U,EAAK6U,aAAa7U,GA8I5C,OAvIIwU,EAAUvgD,UAAA6gD,WAAV,SAAWtL,GACP,GAAIA,EACA,IAAK,IAAIjyC,EAAI,EAAGA,EAAIiyC,EAAQ9zC,OAAQ6B,IAChCV,KAAKmyC,UAAUQ,EAAQjyC,KAUnCi9C,EAAAvgD,UAAA+0C,UAAA,SAAU1e,EAAQjyB,EAAU2vB,GACxBnxB,KAAK69C,iBAAiBr9C,KAAKizB,GACvBjyB,IACAxB,KAAK89C,YAAYt8C,GAAYiyB,GAE7BA,EAAOyqB,SACPzqB,EAAOyqB,QAAQl+C,KAAKmpC,KAAMnpC,KAAMmxB,GAAoBnxB,KAAKmpC,KAAKhoC,UAAUgwB,mBAQhFwsB,EAAGvgD,UAAA8P,IAAH,SAAI1L,GACA,OAAOxB,KAAK89C,YAAYt8C,IAQ5Bm8C,EAAUvgD,UAAA+gD,WAAV,SAAWxvC,GACP3O,KAAK2rB,SAASnrB,KAAKmO,IAQvBgvC,EAAAvgD,UAAAghD,gBAAA,SAAgBC,EAAcC,GAC1B,IAAIC,EACJ,IAAKA,EAAkB,EAAGA,EAAkBv+C,KAAK2zB,cAAc90B,UACvDmB,KAAK2zB,cAAc4qB,GAAiBD,UAAYA,GADeC,KAKvEv+C,KAAK2zB,cAAchzB,OAAO49C,EAAiB,EAAG,CAACF,aAAYA,EAAEC,SAAQA,KAQzEX,EAAAvgD,UAAAohD,iBAAA,SAAiBC,EAAeH,GAC5B,IAAIC,EACJ,IAAKA,EAAkB,EAAGA,EAAkBv+C,KAAK49C,eAAe/+C,UACxDmB,KAAK49C,eAAeW,GAAiBD,UAAYA,GADeC,KAKxEv+C,KAAK49C,eAAej9C,OAAO49C,EAAiB,EAAG,CAACE,cAAaA,EAAEH,SAAQA,KAO3EX,EAAcvgD,UAAA6E,eAAd,SAAey8C,GACX1+C,KAAKiB,aAAaT,KAAKk+C,IAQ3Bf,EAAAvgD,UAAAw2B,iBAAA,WAEI,IADA,IAAMD,EAAgB,GACb9yB,EAAI,EAAGA,EAAIb,KAAK2zB,cAAc90B,OAAQgC,IAC3C8yB,EAAcnzB,KAAKR,KAAK2zB,cAAc9yB,GAAGw9C,cAE7C,OAAO1qB,GAQXgqB,EAAAvgD,UAAAuhD,kBAAA,WAEI,IADA,IAAMf,EAAiB,GACd1yB,EAAI,EAAGA,EAAIlrB,KAAK49C,eAAe/+C,OAAQqsB,IAC5C0yB,EAAep9C,KAAKR,KAAK49C,eAAe1yB,GAAGuzB,eAE/C,OAAOb,GAQXD,EAAAvgD,UAAAwhD,YAAA,WACI,OAAO5+C,KAAK2rB,UAGhBgyB,EAAAvgD,UAAAuR,QAAA,WACI,IAAMyB,EAAOpQ,KACb,MAAO,CACH23B,MAAO,WAEH,OADAvnB,EAAKynC,UAAY,EACVznC,EAAKub,SAASvb,EAAKynC,WAE9B3qC,IAAK,WAED,OADAkD,EAAKynC,UAAY,EACVznC,EAAKub,SAASvb,EAAKynC,aAUtC8F,EAAAvgD,UAAA2E,gBAAA,WACI,OAAO/B,KAAKiB,cAEnB08C,KAIKkB,GAAuB,SAAS1V,EAAM2V,GAIxC,OAHIA,GAAepB,KACfA,GAAK,IAAIC,GAAcxU,IAEpBuU,IChJX,ICjBI3gD,GACA6E,GDgBJm9C,GAjBA,SAA0B1M,GACxB,IAAIhiC,EAAQgiC,EAAQhiC,MAAM,mFAC1B,IAAKA,EACH,MAAM,IAAI5Q,MAAM,oBAAsB4yC,GAWxC,MARU,CACR2M,MAAOvuC,SAASJ,EAAM,GAAI,IAC1B4uC,MAAOxuC,SAASJ,EAAM,GAAI,IAC1B6uC,MAAOzuC,SAASJ,EAAM,GAAI,IAC1B8uC,IAAK9uC,EAAM,IAAM,GACjB+uC,MAAO/uC,EAAM,IAAM,KEUC,SAAAgvC,GAAA39C,EAAaT,GACjC,IAAIq+C,EAAiBC,EAAkBC,EAAWjhB,EAKlDihB,ECzBU,SAAUC,GA4DpB,OA3DA,WACI,SAAYC,EAAAxgC,EAAMvB,GACd3d,KAAKkf,KAAOA,EACZlf,KAAK2d,QAAUA,EAsDvB,OAnDI+hC,EAAKtiD,UAAA2Q,MAAL,SAAMhR,GACF,IAAIqgD,EAEAmC,EADE9nC,EAAS,GAEf,IACI2lC,EAAYD,GAAcn9C,KAAKkf,KAAMniB,GACvC,MAAOyC,GACL,MAAM,IAAIsY,EAAUtY,EAAGQ,KAAK2d,SAGhC,IACI,IAAMhM,EAAWugB,QAAQn1B,EAAQ4U,UAC7BA,GACA/P,EAAO1B,KAAK,mIAIhB,IAAMy/C,EAAe,CACjBhuC,SAAQA,EACRmoB,gBAAiB/8B,EAAQ+8B,gBACzBmM,YAAa/T,QAAQn1B,EAAQkpC,aAC7B72B,aAAc,GAEdrS,EAAQ6iD,WACRL,EAAmB,IAAIE,EAAiB1iD,EAAQ6iD,WAChDnoC,EAAO+H,IAAM+/B,EAAiBxxC,MAAMqvC,EAAWuC,EAAc3/C,KAAK2d,UAElElG,EAAO+H,IAAM49B,EAAUrvC,MAAM4xC,GAEnC,MAAOngD,GACL,MAAM,IAAIsY,EAAUtY,EAAGQ,KAAK2d,SAGhC,GAAI5gB,EAAQ+E,cAER,IADA,IAAM87C,EAAiB7gD,EAAQ+E,cAAc68C,oBACpCj+C,EAAI,EAAGA,EAAIk9C,EAAe/+C,OAAQ6B,IACvC+W,EAAO+H,IAAMo+B,EAAel9C,GAAGmzB,QAAQpc,EAAO+H,IAAK,CAAEogC,UAAWL,EAAkBxiD,QAAOA,EAAE4gB,QAAS3d,KAAK2d,UAQjH,IAAK,IAAMkiC,KALP9iD,EAAQ6iD,YACRnoC,EAAOnH,IAAMivC,EAAiBO,wBAGlCroC,EAAOkG,QAAU,GACE3d,KAAK2d,QAAQoiC,MACxB5iD,OAAOC,UAAUC,eAAeC,KAAK0C,KAAK2d,QAAQoiC,MAAOF,IAASA,IAAS7/C,KAAK2d,QAAQqiC,cACxFvoC,EAAOkG,QAAQnd,KAAKq/C,GAG5B,OAAOpoC,GAEdioC,EAzDD,GDwBYA,CADZH,EE5BqB,SAAAU,EAAiBv+C,GAgFtC,OA/EA,WACI,SAAA+9C,EAAY1iD,GACRiD,KAAKjD,QAAUA,EA2EvB,OAxEI0iD,EAAAriD,UAAA2Q,MAAA,SAAMhB,EAAUhQ,EAAS4gB,GACrB,IAAM2hC,EAAkB,IAAIW,EACxB,CACIC,wBAAyBviC,EAAQoW,qBACjChnB,SAAQA,EACRozC,YAAaxiC,EAAQvF,SACrBgoC,kBAAmBpgD,KAAKjD,QAAQqjD,kBAChCC,aAAcrgD,KAAKjD,QAAQsjD,aAC3BC,eAAgBtgD,KAAKjD,QAAQwjD,wBAC7BC,kBAAmBxgD,KAAKjD,QAAQyjD,kBAChCC,kBAAmBzgD,KAAKjD,QAAQ0jD,kBAChCC,kBAAmB1gD,KAAKjD,QAAQ2jD,kBAChCC,mBAAoB3gD,KAAKjD,QAAQ4jD,mBACjCC,oBAAqB5gD,KAAKjD,QAAQ6jD,oBAClCC,2BAA4B7gD,KAAKjD,QAAQ8jD,6BAG3CrhC,EAAM8/B,EAAgBvxC,MAAMhR,GASlC,OARAiD,KAAK4/C,UAAYN,EAAgBM,UACjC5/C,KAAKqgD,aAAef,EAAgBe,aAChCrgD,KAAKjD,QAAQ+jD,yBACb9gD,KAAK8gD,uBAAyBxB,EAAgByB,kBAAkB/gD,KAAKjD,QAAQ+jD,8BAE1Cj/C,IAAnC7B,KAAKjD,QAAQyjD,wBAAyD3+C,IAAtB7B,KAAKqgD,eACrDrgD,KAAKqgD,aAAef,EAAgB0B,eAAehhD,KAAKqgD,eAErD7gC,EAAMxf,KAAKihD,mBAGtBxB,EAAAriD,UAAA6jD,gBAAA,WAEI,IAAIZ,EAAergD,KAAKqgD,aACxB,GAAIrgD,KAAKjD,QAAQ6jD,oBAAqB,CAClC,QAAuB/+C,IAAnB7B,KAAK4/C,UACL,MAAO,GAEXS,EAAe,gCAAgCtiD,OAAA2D,EAAY26C,aAAar8C,KAAK4/C,YAGjF,OAAI5/C,KAAKjD,QAAQ8jD,2BACN,GAGPR,EACO,wBAAAtiD,OAAwBsiD,EAAY,OAExC,IAGXZ,EAAAriD,UAAA0iD,qBAAA,WACI,OAAO9/C,KAAK4/C,WAGhBH,EAAoBriD,UAAA8jD,qBAApB,SAAqBtB,GACjB5/C,KAAK4/C,UAAYA,GAGrBH,EAAAriD,UAAA+jD,SAAA,WACI,OAAOnhD,KAAKjD,QAAQ6jD,qBAGxBnB,EAAAriD,UAAAgkD,gBAAA,WACI,OAAOphD,KAAKqgD,cAGhBZ,EAAAriD,UAAAikD,kBAAA,WACI,OAAOrhD,KAAKjD,QAAQwjD,yBAGxBd,EAAAriD,UAAAkkD,iBAAA,WACI,OAAOthD,KAAK8gD,wBAEnBrB,EA7ED,GF2BmBA,CADnBH,EG3BU,SAAW59C,GAqJrB,OApJA,WACI,SAAAu+C,EAAYljD,GACRiD,KAAKuhD,KAAO,GACZvhD,KAAKwhD,UAAYzkD,EAAQgQ,SACzB/M,KAAKyhD,aAAe1kD,EAAQojD,YAC5BngD,KAAK0hD,yBAA2B3kD,EAAQmjD,wBACpCnjD,EAAQqjD,oBACRpgD,KAAK2hD,mBAAqB5kD,EAAQqjD,kBAAkBvjD,QAAQ,MAAO,MAEvEmD,KAAK4hD,gBAAkB7kD,EAAQujD,eAC/BtgD,KAAKqgD,aAAetjD,EAAQsjD,aACxBtjD,EAAQyjD,oBACRxgD,KAAK6hD,mBAAqB9kD,EAAQyjD,kBAAkB3jD,QAAQ,MAAO,MAEnEE,EAAQ0jD,mBACRzgD,KAAK8hD,mBAAqB/kD,EAAQ0jD,kBAAkB5jD,QAAQ,MAAO,KACQ,MAAvEmD,KAAK8hD,mBAAmBztC,OAAOrU,KAAK8hD,mBAAmBjjD,OAAS,KAChEmB,KAAK8hD,oBAAsB,MAG/B9hD,KAAK8hD,mBAAqB,GAE9B9hD,KAAK+hD,mBAAqBhlD,EAAQ2jD,kBAClC1gD,KAAKgiD,+BAAiCtgD,EAAYugD,wBAElDjiD,KAAKkiD,YAAc,EACnBliD,KAAKmiD,QAAU,EAwHvB,OArHIlC,EAAc7iD,UAAA4jD,eAAd,SAAe/kC,GAQX,OAPIjc,KAAK6hD,oBAAgE,IAA1C5lC,EAAKpK,QAAQ7R,KAAK6hD,sBAEtB,QADvB5lC,EAAOA,EAAKoZ,UAAUr1B,KAAK6hD,mBAAmBhjD,SACrCwV,OAAO,IAAkC,MAAnB4H,EAAK5H,OAAO,KACvC4H,EAAOA,EAAKoZ,UAAU,KAIvBpZ,GAGXgkC,EAAiB7iD,UAAA2jD,kBAAjB,SAAkBv/C,GAGd,OAFAA,EAAWA,EAAS3E,QAAQ,MAAO,KACnC2E,EAAWxB,KAAKghD,eAAex/C,IACvBxB,KAAK8hD,oBAAsB,IAAMtgD,GAG7Cy+C,EAAG7iD,UAAA+Q,IAAH,SAAIC,EAAOjB,EAAUkB,EAAO2jB,GAGxB,GAAK5jB,EAAL,CAIA,IAAIqK,EAAO2pC,EAAaC,EAASC,EAAe9xC,EAEhD,GAAIrD,GAAYA,EAAS3L,SAAU,CAC/B,IAAI+gD,EAAcviD,KAAKyhD,aAAat0C,EAAS3L,UAe7C,GAZIxB,KAAK0hD,yBAAyBv0C,EAAS3L,aAEvC6M,GAASrO,KAAK0hD,yBAAyBv0C,EAAS3L,WACpC,IAAK6M,EAAQ,GAEzBk0C,EAAcA,EAAY1vC,MAAM7S,KAAK0hD,yBAAyBv0C,EAAS3L,iBAOvDK,IAAhB0gD,EAEA,YADAviD,KAAKuhD,KAAK/gD,KAAK4N,GAMnBk0C,GADAF,GADAG,EAAcA,EAAYltB,UAAU,EAAGhnB,IACbsC,MAAM,OACJyxC,EAAYvjD,OAAS,GAMrD,GAFAwjD,GADA5pC,EAAQrK,EAAMuC,MAAM,OACJ8H,EAAM5Z,OAAS,GAE3BsO,GAAYA,EAAS3L,SACrB,GAAKwwB,EAKD,IAAKxhB,EAAI,EAAGA,EAAIiI,EAAM5Z,OAAQ2R,IAC1BxQ,KAAKwiD,oBAAoBC,WAAW,CAAEC,UAAW,CAAEvsC,KAAMnW,KAAKkiD,YAAc1xC,EAAI,EAAG4F,OAAc,IAAN5F,EAAUxQ,KAAKmiD,QAAU,GAChH1mC,SAAU,CAAEtF,KAAMisC,EAAYvjD,OAAS2R,EAAG4F,OAAc,IAAN5F,EAAU8xC,EAAczjD,OAAS,GACnF8jD,OAAQ3iD,KAAK+gD,kBAAkB5zC,EAAS3L,iBAPhDxB,KAAKwiD,oBAAoBC,WAAW,CAAEC,UAAW,CAAEvsC,KAAMnW,KAAKkiD,YAAc,EAAG9rC,OAAQpW,KAAKmiD,SACxF1mC,SAAU,CAAEtF,KAAMisC,EAAYvjD,OAAQuX,OAAQksC,EAAczjD,QAC5D8jD,OAAQ3iD,KAAK+gD,kBAAkB5zC,EAAS3L,YAU/B,IAAjBiX,EAAM5Z,OACNmB,KAAKmiD,SAAWE,EAAQxjD,QAExBmB,KAAKkiD,aAAezpC,EAAM5Z,OAAS,EACnCmB,KAAKmiD,QAAUE,EAAQxjD,QAG3BmB,KAAKuhD,KAAK/gD,KAAK4N,KAGnB6xC,EAAA7iD,UAAAkR,QAAA,WACI,OAA4B,IAArBtO,KAAKuhD,KAAK1iD,QAGrBohD,EAAK7iD,UAAA2Q,MAAL,SAAMC,GAGF,GAFAhO,KAAKwiD,oBAAsB,IAAIxiD,KAAKgiD,+BAA+B,CAAEY,KAAM5iD,KAAK4hD,gBAAiBiB,WAAY,OAEzG7iD,KAAK+hD,mBACL,IAAK,IAAMvgD,KAAYxB,KAAKyhD,aAExB,GAAIzhD,KAAKyhD,aAAapkD,eAAemE,GAAW,CAC5C,IAAImhD,EAAS3iD,KAAKyhD,aAAajgD,GAC3BxB,KAAK0hD,yBAAyBlgD,KAC9BmhD,EAASA,EAAO9vC,MAAM7S,KAAK0hD,yBAAyBlgD,KAExDxB,KAAKwiD,oBAAoBM,iBAAiB9iD,KAAK+gD,kBAAkBv/C,GAAWmhD,GAOxF,GAFA3iD,KAAKwhD,UAAUtzC,OAAOF,EAAShO,MAE3BA,KAAKuhD,KAAK1iD,OAAS,EAAG,CACtB,IAAIwhD,SACE0C,EAAmBxlD,KAAKylD,UAAUhjD,KAAKwiD,oBAAoBS,UAE7DjjD,KAAKqgD,aACLA,EAAergD,KAAKqgD,aACbrgD,KAAK2hD,qBACZtB,EAAergD,KAAK2hD,oBAExB3hD,KAAKqgD,aAAeA,EAEpBrgD,KAAK4/C,UAAYmD,EAGrB,OAAO/iD,KAAKuhD,KAAKhzC,KAAK,KAE7B0xC,EAlJD,GH0BkBA,CADlBv+C,EAAc,IAAIX,EAAYW,EAAaT,IAEUS,IAErD68B,EIxBU,SAAU78B,GA+KpB,OArKA,WACI,SAAAwhD,EAAY/Z,EAAMn7B,EAASm1C,GACvBnjD,KAAKmpC,KAAOA,EACZnpC,KAAKggD,aAAemD,EAAa3hD,SACjCxB,KAAK8b,MAAQ9N,EAAQ8N,OAAS,GAC9B9b,KAAKoY,SAAW,GAChBpY,KAAK+zB,qBAAuB,GAC5B/zB,KAAKojD,KAAOp1C,EAAQo1C,KACpBpjD,KAAKF,MAAQ,KACbE,KAAKgO,QAAUA,EAEfhO,KAAKqjD,MAAQ,GACbrjD,KAAK+/C,MAAQ,GAuJrB,OA5IImD,EAAI9lD,UAAAoD,KAAJ,SAAKyb,EAAM8zB,EAAoB77B,EAAiBymB,EAAe3c,GAC3D,IAAMugB,EAAgBv+B,KAAMsjD,EAAetjD,KAAKgO,QAAQlM,cAAci8C,OAEtE/9C,KAAKqjD,MAAM7iD,KAAKyb,GAEhB,IAAMsnC,EAAiB,SAAU/jD,EAAG0f,EAAMqB,GACtCge,EAAc8kB,MAAM1iD,OAAO49B,EAAc8kB,MAAMxxC,QAAQoK,GAAO,GAE9D,IAAMunC,EAAqBjjC,IAAage,EAAcyhB,aAClDrlB,EAAcha,UAAYnhB,GAC1Bwe,EAAS,KAAM,CAACkC,MAAM,KAAK,EAAO,MAClCte,EAAOzB,KAAK,mBAAYogB,EAAQ,gFAM3Bge,EAAcwhB,MAAMx/B,IAAcoa,EAAcpb,SACjDgf,EAAcwhB,MAAMx/B,GAAY,CAAErB,KAAIA,EAAEniB,QAAS49B,IAEjDn7B,IAAM++B,EAAcz+B,QAASy+B,EAAcz+B,MAAQN,GACvDwe,EAASxe,EAAG0f,EAAMskC,EAAoBjjC,KAIxCkjC,EAAc,CAChBnsC,YAAatX,KAAKgO,QAAQsJ,YAC1BqkC,UAAWznC,EAAgBynC,UAC3Bx+B,SAAUjJ,EAAgBiJ,SAC1B6iC,aAAc9rC,EAAgB8rC,cAG5Bh+C,EAAcN,EAAYH,eAAe0a,EAAM/H,EAAgBzS,iBAAkBzB,KAAKgO,QAAStM,GAErG,GAAKM,EAAL,CAKA,IA4DI0hD,EACAC,EA7DEC,EAAmB,SAASF,GAC9B,IAAIjwB,EACEowB,EAAmBH,EAAWliD,SAC9B4W,EAAWsrC,EAAWtrC,SAASvb,QAAQ,UAAW,IAUxD4mD,EAAYhiD,iBAAmBO,EAAYqe,QAAQwjC,GAC/CJ,EAAYnsC,cACZmsC,EAAYtmC,SAAWnb,EAAYuM,KAC9BgwB,EAAcvwB,QAAQmP,UAAY,GACnCnb,EAAYsuC,SAASmT,EAAYhiD,iBAAkBgiD,EAAY9H,aAE9D35C,EAAYmuC,eAAesT,EAAYtmC,WAAanb,EAAYkuC,4BACjEuT,EAAYtmC,SAAWnb,EAAYuM,KAAKk1C,EAAY9H,UAAW8H,EAAYtmC,YAGnFsmC,EAAYjiD,SAAWqiD,EAEvB,IAAMC,EAAS,IAAIvoC,EAASM,MAAM0iB,EAAcvwB,SAEhD81C,EAAO3vB,gBAAiB,EACxBoK,EAAcnmB,SAASyrC,GAAoBzrC,GAEvClE,EAAgB63B,WAAapR,EAAcoR,aAC3C0X,EAAY1X,WAAY,GAGxBpR,EAAcla,UACdgT,EAAS6vB,EAAahS,WAAWl5B,EAAU0rC,EAAQvlB,EAAe5D,EAAckB,WAAY4nB,cACtE3rC,EAClByrC,EAAe9vB,EAAQ,KAAMowB,GAG7BN,EAAe,KAAM9vB,EAAQowB,GAE1BlpB,EAAcpb,OACrBgkC,EAAe,KAAMnrC,EAAUyrC,IAI3BtlB,EAAcwhB,MAAM8D,IAChBtlB,EAAcwhB,MAAM8D,GAAkB9mD,QAAQgjB,UAC9C4a,EAAc5a,SAKlB,IAAIoS,GAAO2xB,EAAQvlB,EAAeklB,GAAajmD,MAAM4a,GAAU,SAAU5Y,EAAG0f,GACxEqkC,EAAe/jD,EAAG0f,EAAM2kC,MAJ5BN,EAAe,KAAMhlB,EAAcwhB,MAAM8D,GAAkB3kC,KAAM2kC,IAWvE71C,EAAU6tC,EAAY77C,KAAKgO,SAE7B+hC,IACA/hC,EAAQgiC,IAAMrV,EAAcla,SAAW,MAAQ,SAG/Cka,EAAcla,UACdzS,EAAQo1C,KAAO,yBAEXp1C,EAAQ+1C,WACRL,EAAaJ,EAAaU,eAAe/nC,EAAM/H,EAAgBzS,iBAAkBuM,EAAStM,EAAaM,GAEvG2hD,EAAUL,EAAaW,WAAWhoC,EAAM/H,EAAgBzS,iBAAkBuM,EAAStM,EAAaM,IAIhGgM,EAAQ+1C,WACRL,EAAa1hD,EAAYm6C,aAAalgC,EAAM/H,EAAgBzS,iBAAkBuM,EAAStM,GAEvFiiD,EAAU3hD,EAAYkiD,SAASjoC,EAAM/H,EAAgBzS,iBAAkBuM,EAAStM,GAC5E,SAAC4xB,EAAKowB,GACEpwB,EACAiwB,EAAejwB,GAEfswB,EAAiBF,MAKjCA,EACKA,EAAWliD,SAGZoiD,EAAiBF,GAFjBH,EAAeG,GAIZC,GACPA,EAAQQ,KAAKP,EAAkBL,QAtG/BA,EAAe,CAAEtrC,QAAS,4CAAqCgE,MAyG1EinC,EAnKD,GJcgBA,CAAcxhD,GAE9B,IAsCIqR,EAtCEqxC,EK9Bc,SAAA1iD,EAAag+C,GACjC,IAAM0E,EAAS,SAAUjsC,EAAOpb,EAASihB,GASrC,GARuB,mBAAZjhB,GACPihB,EAAWjhB,EACXA,EAAUsnD,EAAkBrkD,KAAKjD,QAAS,KAG1CA,EAAUsnD,EAAkBrkD,KAAKjD,QAASA,GAAW,KAGpDihB,EAAU,CACX,IAAMsmC,EAAOtkD,KACb,OAAO,IAAIukD,SAAQ,SAAUC,EAASC,GAClCL,EAAO9mD,KAAKgnD,EAAMnsC,EAAOpb,GAAS,SAASu2B,EAAK9kB,GACxC8kB,EACAmxB,EAAOnxB,GAEPkxB,EAAQh2C,SAKpBxO,KAAKxC,MAAM2a,EAAOpb,GAAS,SAASu2B,EAAKpU,EAAMvB,EAAS5gB,GACpD,GAAIu2B,EAAO,OAAOtV,EAASsV,GAE3B,IAAI7b,EACJ,IAEIA,EADkB,IAAIioC,EAAUxgC,EAAMvB,GACnB5P,MAAMhR,GAE7B,MAAOu2B,GAAO,OAAOtV,EAASsV,GAE9BtV,EAAS,KAAMvG,OAK3B,OAAO2sC,ELPQM,CAAOhjD,EAAa89C,GAC7BhiD,EM3BI,SAAUkE,EAAag+C,EAAWwD,GAC5C,IAAM1lD,EAAQ,SAAU2a,EAAOpb,EAASihB,GAUpC,GARuB,mBAAZjhB,GACPihB,EAAWjhB,EACXA,EAAUsnD,EAAkBrkD,KAAKjD,QAAS,KAG1CA,EAAUsnD,EAAkBrkD,KAAKjD,QAASA,GAAW,KAGpDihB,EAAU,CACX,IAAMsmC,EAAOtkD,KACb,OAAO,IAAIukD,SAAQ,SAAUC,EAASC,GAClCjnD,EAAMF,KAAKgnD,EAAMnsC,EAAOpb,GAAS,SAASu2B,EAAK9kB,GACvC8kB,EACAmxB,EAAOnxB,GAEPkxB,EAAQh2C,SAKpB,IAAIm2C,EACAxB,SACEyB,EAAgB,IAAIjH,GAAc39C,MAAOjD,EAAQ8nD,oBAMvD,GAJA9nD,EAAQ+E,cAAgB8iD,EAExBD,EAAU,IAAIppC,EAASM,MAAM9e,GAEzBA,EAAQomD,aACRA,EAAepmD,EAAQomD,iBACpB,CACH,IAAM3hD,EAAWzE,EAAQyE,UAAY,QAC/Bm6C,EAAYn6C,EAAS3E,QAAQ,WAAY,KAC/CsmD,EAAe,CACX3hD,SAAQA,EACR8V,YAAaqtC,EAAQrtC,YACrB6F,SAAUwnC,EAAQxnC,UAAY,GAC9B1b,iBAAkBk6C,EAClBA,UAASA,EACTqE,aAAcx+C,IAGD2b,UAAgD,MAApCgmC,EAAahmC,SAAStK,OAAO,KACtDswC,EAAahmC,UAAY,KAIjC,IAAM2nC,EAAU,IAAI5B,EAAcljD,KAAM2kD,EAASxB,GACjDnjD,KAAKu+B,cAAgBumB,EAKjB/nD,EAAQ41C,SACR51C,EAAQ41C,QAAQhlC,SAAQ,SAAS8lB,GAC7B,IAAIsxB,EAAY3sC,EAChB,GAAIqb,EAAOuxB,aAGP,GAFA5sC,EAAWqb,EAAOuxB,YAAYnoD,QAAQ,UAAW,KACjDkoD,EAAaH,EAAc7G,OAAOzM,WAAWl5B,EAAUusC,EAASG,EAASrxB,EAAO12B,QAAS02B,EAAOjyB,qBACtEsW,EACtB,OAAOkG,EAAS+mC,QAIpBH,EAAczS,UAAU1e,MAKpC,IAAItB,GAAOwyB,EAASG,EAAS3B,GACxB3lD,MAAM2a,GAAO,SAAU3Y,EAAG0f,GACvB,GAAI1f,EAAK,OAAOwe,EAASxe,GACzBwe,EAAS,KAAMkB,EAAM4lC,EAAS/nD,KAC/BA,IAGf,OAAOS,ENpDOqe,CAAMna,EAAa89C,EAAWjhB,GAEtC1tB,EAAIo0C,GAAa,qBACjBC,EAAU,CACZ7S,QAAS,CAACxhC,EAAEmuC,MAAOnuC,EAAEouC,MAAOpuC,EAAEquC,OAC9BxyC,KAAIA,EACJ4N,KAAIA,GACJvZ,YAAWA,EACX8uC,oBAAmBA,GACnBuB,qBAAoBA,GACpB1vC,YAAWA,EACXiqB,SAAQA,GACRwG,OAAMA,GACNhxB,UAAWA,GAAUO,GACrB6Z,SAAQA,EACR0kC,gBAAiBX,EACjBG,iBAAkBF,EAClBG,UAAWF,EACX0D,cAAe3kB,EACf6lB,OAAMA,EACN5mD,MAAKA,EACLsa,UAASA,EACTqlC,cAAaA,GACbp0B,MAAKA,EACL40B,cAAaA,GACb/7C,OAAMA,GAKJujD,EAAO,SAASpyC,GAClB,OAAO,WACH,IAAMwD,EAAMpZ,OAAO6b,OAAOjG,EAAE3V,WAE5B,OADA2V,EAAEI,MAAMoD,EAAK9I,MAAMrQ,UAAUyV,MAAMvV,KAAK2V,UAAW,IAC5CsD,IAIT6uC,EAAMjoD,OAAO6b,OAAOksC,GAC1B,IAAK,IAAMlyC,KAAKkyC,EAAQ5qC,KAGpB,GAAiB,mBADjBvH,EAAImyC,EAAQ5qC,KAAKtH,IAEboyC,EAAIpyC,EAAEJ,eAAiBuyC,EAAKpyC,QAI5B,IAAK,IAAM8nB,KADXuqB,EAAIpyC,GAAK7V,OAAO6b,OAAO,MACPjG,EAEZqyC,EAAIpyC,GAAG6nB,EAAEjoB,eAAiBuyC,EAAKpyC,EAAE8nB,IAc7C,OAHAqqB,EAAQ1nD,MAAQ0nD,EAAQ1nD,MAAM8D,KAAK8jD,GACnCF,EAAQd,OAASc,EAAQd,OAAO9iD,KAAK8jD,GAE9BA,ED5FX,IAAIC,GAAY,GAGV1T,GAAc,aACpBA,GAAYv0C,UAAYD,OAAOgU,OAAO,IAAI0+B,GAAuB,CAC7DK,wBAAuB,WACnB,OAAO,GAGX3hC,KAAI,SAAC6hC,EAAUC,GACX,OAAKD,EAGEpwC,KAAK2wC,gBAAgBN,EAAWD,GAAUn0B,KAFtCo0B,GAKfiV,eAAM/uB,EAAK31B,EAAMod,EAAUunC,GACvB,IAAMC,EAAM,IAAIC,eACVC,GAAQ3oD,GAAQ4oD,gBAAiB5oD,GAAQ6oD,UAU/C,SAASC,EAAeL,EAAKxnC,EAAUunC,GAC/BC,EAAIM,QAAU,KAAON,EAAIM,OAAS,IAClC9nC,EAASwnC,EAAIO,aACTP,EAAIQ,kBAAkB,kBACA,mBAAZT,GACdA,EAAQC,EAAIM,OAAQvvB,GAbQ,mBAAzBivB,EAAIS,kBACXT,EAAIS,iBAAiB,YAEzBrkD,GAAOxB,MAAM,wBAAiBm2B,EAAG,MACjCivB,EAAIU,KAAK,MAAO3vB,EAAKmvB,GACrBF,EAAIW,iBAAiB,SAAUvlD,GAAQ,4CACvC4kD,EAAIY,KAAK,MAWLrpD,GAAQ4oD,iBAAmB5oD,GAAQ6oD,UAChB,IAAfJ,EAAIM,QAAiBN,EAAIM,QAAU,KAAON,EAAIM,OAAS,IACvD9nC,EAASwnC,EAAIO,cAEbR,EAAQC,EAAIM,OAAQvvB,GAEjBmvB,EACPF,EAAIa,mBAAqB,WACC,GAAlBb,EAAIc,YACJT,EAAeL,EAAKxnC,EAAUunC,IAItCM,EAAeL,EAAKxnC,EAAUunC,IAItCgB,SAAQ,WACJ,OAAO,GAGXC,eAAc,WACVnB,GAAY,IAGhBnB,SAAS,SAAA1iD,EAAUC,EAAkB1E,GAI7B0E,IAAqBzB,KAAKmwC,eAAe3uC,KACzCA,EAAWC,EAAmBD,GAGlCA,EAAWzE,EAAQizC,IAAMhwC,KAAK+vC,mBAAmBvuC,EAAUzE,EAAQizC,KAAOxuC,EAE1EzE,EAAUA,GAAW,GAIrB,IACMH,EADYoD,KAAK2wC,gBAAgBnvC,EAAU9B,OAAO+mD,SAAS7pD,MACrC25B,IACtBnmB,EAAYpQ,KAElB,OAAO,IAAIukD,SAAQ,SAACC,EAASC,GACzB,GAAI1nD,EAAQ2pD,cAAgBrB,GAAUzoD,GAClC,IACI,IAAM+pD,EAAWtB,GAAUzoD,GAC3B,OAAO4nD,EAAQ,CAAEpsC,SAAUuuC,EAAUnlD,SAAU5E,EAAMgqD,QAAS,CAAEC,aAAc,IAAIC,QACpF,MAAOtnD,GACL,OAAOilD,EAAO,CAAEjjD,SAAU5E,EAAMqb,QAAS,sBAAsBla,OAAAnB,wBAAkB4C,EAAEyY,WAI3F7H,EAAKk1C,MAAM1oD,EAAMG,EAAQqmD,MAAM,SAAuB12C,EAAMm6C,GAExDxB,GAAUzoD,GAAQ8P,EAGlB83C,EAAQ,CAAEpsC,SAAU1L,EAAMlL,SAAU5E,EAAMgqD,QAAS,CAAEC,qBACtD,SAAoBf,EAAQvvB,GAC3BkuB,EAAO,CAAE7jD,KAAM,OAAQqX,QAAS,IAAAla,OAAIw4B,EAAG,oBAAAx4B,OAAmB+nD,EAAS,KAAElpD,KAAIA,aAMzF,IAAAmqD,GAAe,SAAC9vC,EAAM+vC,GAGlB,OAFAjqD,GAAUka,EACVrV,GAASolD,EACFrV,IQtGLqM,GAAe,SAAS7U,GAC1BnpC,KAAKmpC,KAAOA,GAIhB6U,GAAa5gD,UAAYD,OAAOgU,OAAO,IAAIigC,GAAwB,CAC/D6S,WAAU,SAACziD,EAAU4uC,EAAUpiC,EAAStM,EAAaM,GACjD,OAAO,IAAIuiD,SAAQ,SAAC0C,EAASxC,GACzBziD,EAAYkiD,SAAS1iD,EAAU4uC,EAAUpiC,EAAStM,GAC7CyiD,KAAK8C,GAASC,MAAMzC,SCjBrC,ICGA0C,GAAA,SAAgBznD,EAAQypC,EAAMpsC,GAkK1B,MAAO,CACHoR,IAXJ,SAAe3O,EAAG4nD,GACTrqD,EAAQsqD,gBAA6C,SAA3BtqD,EAAQsqD,eAED,YAA3BtqD,EAAQsqD,eA7BvB,SAAsB7nD,EAAG4nD,GACrB,IACM5lD,EAAWhC,EAAEgC,UAAY4lD,EACzBE,EAAS,GACX5tB,EAAU,GAAA37B,OAAGyB,EAAEoB,MAAQ,SAAkB,WAAA7C,OAAAyB,EAAEyY,SAAW,uCAA6C,QAAAla,OAAAyD,GAEjG+lD,EAAY,SAAC/nD,EAAGgR,EAAGg3C,QACA3lD,IAAjBrC,EAAEuZ,QAAQvI,IACV82C,EAAO9mD,KAPE,mBAOY3D,QAAQ,YAAa4T,SAASjR,EAAE2W,KAAM,KAAO,IAAM3F,EAAI,IACvE3T,QAAQ,YAAa2qD,GACrB3qD,QAAQ,cAAe2C,EAAEuZ,QAAQvI,MAI1ChR,EAAE2W,OACFoxC,EAAU/nD,EAAG,EAAG,IAChB+nD,EAAU/nD,EAAG,EAAG,QAChB+nD,EAAU/nD,EAAG,EAAG,IAChBk6B,GAAW,YAAY37B,OAAAyB,EAAE2W,KAAI,aAAApY,OAAYyB,EAAE4W,OAAS,EAAC,OAAArY,OAAMupD,EAAO/4C,KAAK,QAEvE/O,EAAE0Y,QAAU1Y,EAAEuZ,SAAWhc,EAAQ0qD,UAAY,KAC7C/tB,GAAW,kBAAkB37B,OAAAyB,EAAE0Y,QAEnCixB,EAAKvnC,OAAO9B,MAAM45B,GAOdguB,CAAaloD,EAAG4nD,GACyB,mBAA3BrqD,EAAQsqD,gBACtBtqD,EAAQsqD,eAAe,MAAO7nD,EAAG4nD,GA5JzC,SAAmB5nD,EAAG4nD,GAClB,IAGIO,EACAjuB,EAJE57B,EAAK,sBAAsBC,OAAAE,EAAgBmpD,GAAY,KAEvDnvB,EAAOv4B,EAAO/B,SAASW,cAAc,OAGrCgpD,EAAS,GACT9lD,EAAWhC,EAAEgC,UAAY4lD,EACzBQ,EAAiBpmD,EAAS6O,MAAM,mBAAmB,GAEzD4nB,EAAKn6B,GAAYA,EACjBm6B,EAAK4vB,UAAY,qBAEjBnuB,EAAU,OAAA37B,OAAOyB,EAAEoB,MAAQ,SAAQ,WAAA7C,OAAUyB,EAAEyY,SAAW,wCACtD,uBAAAla,OAAuByD,EAAQ,MAAAzD,OAAK6pD,EAAc,SAEtD,IAAML,EAAY,SAAC/nD,EAAGgR,EAAGg3C,QACA3lD,IAAjBrC,EAAEuZ,QAAQvI,IACV82C,EAAO9mD,KAhBE,qEAgBY3D,QAAQ,YAAa4T,SAASjR,EAAE2W,KAAM,KAAO,IAAM3F,EAAI,IACvE3T,QAAQ,YAAa2qD,GACrB3qD,QAAQ,cAAe2C,EAAEuZ,QAAQvI,MAI1ChR,EAAE2W,OACFoxC,EAAU/nD,EAAG,EAAG,IAChB+nD,EAAU/nD,EAAG,EAAG,QAChB+nD,EAAU/nD,EAAG,EAAG,IAChBk6B,GAAW,WAAW37B,OAAAyB,EAAE2W,KAAI,aAAApY,OAAYyB,EAAE4W,OAAS,EAAC,aAAArY,OAAYupD,EAAO/4C,KAAK,cAE5E/O,EAAE0Y,QAAU1Y,EAAEuZ,SAAWhc,EAAQ0qD,UAAY,KAC7C/tB,GAAW,iCAA0Bl6B,EAAE0Y,MAAMvH,MAAM,MAAMkC,MAAM,GAAGtE,KAAK,WAE3E0pB,EAAK6vB,UAAYpuB,EAGjBh8B,EAAkBgC,EAAO/B,SAAU,CAC/B,mDACA,yBACA,sBACA,kBACA,aACA,IACA,8BACA,mBACA,sBACA,kBACA,kBACA,IACA,4BACA,kBACA,kBACA,aACA,yBACA,IACA,iCACA,kBACA,IACA,2BACA,mBACA,qBACA,yBACA,aACA,IACA,0BACA,cACA,IACA,+BACA,cACA,qBACA,uBACA,iCACA,KACF4Q,KAAK,MAAO,CAAEvQ,MAAO,kBAEvBi6B,EAAKijB,MAAM37C,QAAU,CACjB,iCACA,yBACA,yBACA,qBACA,6BACA,0BACA,cACA,gBACA,uBACFgP,KAAK,KAEa,gBAAhBxR,EAAQgrD,MACRJ,EAAQK,aAAY,WAChB,IAAMrqD,EAAW+B,EAAO/B,SAClB8/B,EAAO9/B,EAAS8/B,KAClBA,IACI9/B,EAASQ,eAAeL,GACxB2/B,EAAKwqB,aAAahwB,EAAMt6B,EAASQ,eAAeL,IAEhD2/B,EAAKp+B,aAAa44B,EAAMwF,EAAK3+B,YAEjCopD,cAAcP,MAEnB,KAqDHQ,CAAU3oD,EAAG4nD,IAUjBgB,OAhDJ,SAAqBnsC,GACZlf,EAAQsqD,gBAA6C,SAA3BtqD,EAAQsqD,eAED,YAA3BtqD,EAAQsqD,gBAE0B,mBAA3BtqD,EAAQsqD,gBACtBtqD,EAAQsqD,eAAe,SAAUprC,GAjBzC,SAAyBA,GACrB,IAAMzO,EAAO9N,EAAO/B,SAASQ,eAAe,sBAAsBJ,OAAAE,EAAgBge,KAC9EzO,GACAA,EAAKpO,WAAWE,YAAYkO,GAU5B66C,CAAgBpsC,MChHtBlf,GCPK,CAEH0vC,mBAAmB,EAGnB6b,SAAS,EAKT32C,UAAU,EAGV42C,MAAM,EAONzsC,MAAO,GAGPrK,OAAO,EAKPsoB,eAAe,EAGfyuB,UAAU,EAKVrrC,SAAU,GAMV7F,aAAa,EAQbH,KAAM,EAGN8uB,aAAa,EAKb9S,WAAY,KAIZC,WAAY,KAGZwY,QAAS,IDxDjB,GAAIlsC,OAAOypC,KACP,IAAK,IAAMx2B,MAAOjT,OAAOypC,KACjBhsC,OAAOC,UAAUC,eAAeC,KAAKoC,OAAOypC,KAAMx2B,MAClD5V,GAAQ4V,IAAOjT,OAAOypC,KAAKx2B,MEXxB,SAACjT,EAAQ3C,GAGpBD,EAAYC,EAASW,EAAsBgC,SAEZmC,IAA3B9E,EAAQ4oD,iBACR5oD,EAAQ4oD,eAAiB,yDAAyDzpC,KAAKxc,EAAO+mD,SAASgC,WAS3G1rD,EAAQ2oD,MAAQ3oD,EAAQ2oD,QAAS,EACjC3oD,EAAQ6oD,UAAY7oD,EAAQ6oD,YAAa,EAGzC7oD,EAAQ2rD,KAAO3rD,EAAQ2rD,OAAS3rD,EAAQ4oD,eAAiB,IAAO,MAEhE5oD,EAAQgrD,IAAMhrD,EAAQgrD,MAAoC,aAA5BroD,EAAO+mD,SAASkC,UACd,WAA5BjpD,EAAO+mD,SAASkC,UACY,aAA5BjpD,EAAO+mD,SAASkC,UACfjpD,EAAO+mD,SAASmC,MACblpD,EAAO+mD,SAASmC,KAAK/pD,OAAS,GAClC9B,EAAQ4oD,eAAmC,cACzC,cAEN,IAAM7rB,EAAkB,6CAA6C9L,KAAKtuB,EAAO+mD,SAASzkB,MACtFlI,IACA/8B,EAAQ+8B,gBAAkBA,EAAgB,SAGjBj4B,IAAzB9E,EAAQ2pD,eACR3pD,EAAQ2pD,cAAe,QAGH7kD,IAApB9E,EAAQ8rD,UACR9rD,EAAQ8rD,SAAU,GAGlB9rD,EAAQsa,eACRta,EAAQua,YAAc,OF5B9BwxC,CAAkBppD,OAAQ3C,IAE1BA,GAAQ41C,QAAU51C,GAAQ41C,SAAW,GAEjCjzC,OAAOqpD,eACPhsD,GAAQ41C,QAAU51C,GAAQ41C,QAAQ50C,OAAO2B,OAAOqpD,eAG9C,IAKFvpC,GACAxgB,GACAk8C,GAPE/R,GGZS,SAACzpC,EAAQ3C,GACpB,IAAMY,EAAW+B,EAAO/B,SAClBwrC,EAAOkW,KAEblW,EAAKpsC,QAAUA,EACf,IAAM2E,EAAcynC,EAAKznC,YACnBiwC,EAAcoV,GAAGhqD,EAASosC,EAAKvnC,QAC/BI,EAAc,IAAI2vC,EACxBjwC,EAAYO,eAAeD,GAC3BmnC,EAAKwI,YAAcA,EACnBxI,EAAK6U,aAAeA,GLxBT,SAAC7U,EAAMpsC,GAYlBA,EAAQ0qD,cAAuC,IAArB1qD,EAAQ0qD,SAA2B1qD,EAAQ0qD,SAA4B,gBAAhB1qD,EAAQgrD,IAVnE,EAEC,EAUlBhrD,EAAQisD,UACTjsD,EAAQisD,QAAU,CAAC,CACf5oD,MAAO,SAASL,GACRhD,EAAQ0qD,UAhBD,GAiBPwB,QAAQjC,IAAIjnD,IAGpBI,KAAM,SAASJ,GACPhD,EAAQ0qD,UApBF,GAqBNwB,QAAQjC,IAAIjnD,IAGpBG,KAAM,SAASH,GACPhD,EAAQ0qD,UAxBF,GAyBNwB,QAAQ/oD,KAAKH,IAGrBD,MAAO,SAASC,GACRhD,EAAQ0qD,UA5BD,GA6BPwB,QAAQnpD,MAAMC,OAK9B,IAAK,IAAIW,EAAI,EAAGA,EAAI3D,EAAQisD,QAAQnqD,OAAQ6B,IACxCyoC,EAAKvnC,OAAOvB,YAAYtD,EAAQisD,QAAQtoD,IKb5CwoD,CAAY/f,EAAMpsC,GAClB,IAAMuqD,EAASH,GAAeznD,EAAQypC,EAAMpsC,GACtCosD,EAAQhgB,EAAKggB,MAAQpsD,EAAQosD,OC1BvC,SAAgBzpD,EAAQ3C,EAAS6E,GAC7B,IAAIunD,EAAQ,KACZ,GAAoB,gBAAhBpsD,EAAQgrD,IACR,IACIoB,OAAwC,IAAxBzpD,EAAO0pD,aAAgC,KAAO1pD,EAAO0pD,aACvE,MAAO3rD,IAEb,MAAO,CACH4rD,OAAQ,SAASptC,EAAM4qC,EAAczzB,EAAYx1B,GAC7C,GAAIurD,EAAO,CACPvnD,EAAOzB,KAAK,iBAAU8b,EAAI,eAC1B,IACIktC,EAAMG,QAAQrtC,EAAMre,GACpBurD,EAAMG,QAAQ,GAAAvrD,OAAGke,EAAgB,cAAE4qC,GAC/BzzB,GACA+1B,EAAMG,QAAQ,GAAAvrD,OAAGke,EAAW,SAAE1e,KAAKylD,UAAU5vB,IAEnD,MAAO5zB,GAELoC,EAAO9B,MAAM,0BAAmBmc,EAAI,uCAIhDstC,OAAQ,SAASttC,EAAM2qC,EAASxzB,GAC5B,IAAM5T,EAAY2pC,GAASA,EAAMK,QAAQvtC,GACnCwtC,EAAYN,GAASA,EAAMK,QAAQ,GAAGzrD,OAAAke,EAAgB,eACxD8hB,EAAYorB,GAASA,EAAMK,QAAQ,GAAGzrD,OAAAke,EAAW,UAKrD,GAHAmX,EAAaA,GAAc,GAC3B2K,EAAOA,GAAQ,KAEX0rB,GAAa7C,EAAQC,cACpB,IAAIC,KAAKF,EAAQC,cAAc6C,YAC5B,IAAI5C,KAAK2C,GAAWC,WACxBnsD,KAAKylD,UAAU5vB,KAAgB2K,EAE/B,OAAOve,IDVyBmqC,CAAMjqD,EAAQ3C,EAASosC,EAAKvnC,SEzB7D,WACX,SAASgoD,IACL,KAAM,CACFhpD,KAAM,UACNqX,QAAS,qEAIjB,IAAM4xC,EAAiB,CACnBC,aAAc,SAAStO,GAEnB,OADAoO,KACQ,GAEZG,cAAe,SAASvO,GAEpB,OADAoO,KACQ,GAEZI,eAAgB,SAASxO,GAErB,OADAoO,KACQ,IAIhBz4B,GAAiBI,YAAYs4B,GFG7BI,CAAU9gB,EAAKznC,aAGX3E,EAAQoE,WACRgoC,EAAKhoC,UAAUgwB,iBAAiBI,YAAYx0B,EAAQoE,WAGxD,IAAM+oD,EAAc,oBAEpB,SAAS/1C,EAAMoC,GACX,IAAMC,EAAS,GACf,IAAK,IAAMC,KAAQF,EACXpZ,OAAOC,UAAUC,eAAeC,KAAKiZ,EAAKE,KAC1CD,EAAOC,GAAQF,EAAIE,IAG3B,OAAOD,EAIX,SAASlV,EAAKqX,EAAMwxC,GAChB,IAAMC,EAAY38C,MAAMrQ,UAAUyV,MAAMvV,KAAK2V,UAAW,GACxD,OAAO,WACH,IAAMrB,EAAOw4C,EAAUrsD,OAAO0P,MAAMrQ,UAAUyV,MAAMvV,KAAK2V,UAAW,IACpE,OAAO0F,EAAKxF,MAAMg3C,EAASv4C,IAInC,SAASy4C,EAAWj3B,GAIhB,IAHA,IACI8nB,EADEt9C,EAASD,EAASsB,qBAAqB,SAGpCyB,EAAI,EAAGA,EAAI9C,EAAOiB,OAAQ6B,IAE/B,IADAw6C,EAAQt9C,EAAO8C,IACLE,KAAKyP,MAAM65C,GAAc,CAC/B,IAAMI,EAAkBn2C,EAAMpX,GAC9ButD,EAAgBl3B,WAAaA,EAC7B,IAAMuzB,EAAWzL,EAAM4M,WAAa,GACpCwC,EAAgB9oD,SAAW7D,EAAS8oD,SAAS7pD,KAAKC,QAAQ,OAAQ,IAIlEssC,EAAKib,OAAOuC,EAAU2D,EAClBhpD,GAAK,SAAC45C,EAAO17C,EAAGiY,GACRjY,EACA8nD,EAAOn5C,IAAI3O,EAAG,WAEd07C,EAAMt6C,KAAO,WACTs6C,EAAMz8C,WACNy8C,EAAMz8C,WAAWc,QAAUkY,EAAO+H,IAElC07B,EAAM4M,UAAYrwC,EAAO+H,OAGlC,KAAM07B,KAKzB,SAASqP,EAAe1sD,EAAOmgB,EAAUwsC,EAAQC,EAAWr3B,GAExD,IAAMk3B,EAAkBn2C,EAAMpX,GAC9BD,EAAYwtD,EAAiBzsD,GAC7BysD,EAAgBlH,KAAOvlD,EAAM+C,KAEzBwyB,IACAk3B,EAAgBl3B,WAAaA,GA6CjCpxB,EAAYkiD,SAASrmD,EAAMjB,KAAM,KAAM0tD,EAAiB5oD,GACnDyiD,MAAK,SAAAT,IA3CV,SAAiCA,GAC7B,IAAMh3C,EAAOg3C,EAAWtrC,SAClB6D,EAAOynC,EAAWliD,SAClBolD,EAAUlD,EAAWkD,QAErBnD,EAAc,CAChBhiD,iBAAkBO,EAAYqe,QAAQpE,GACtCza,SAAUya,EACV+jC,aAAc/jC,EACd3E,YAAagzC,EAAgBhzC,aAMjC,GAHAmsC,EAAY9H,UAAY8H,EAAYhiD,iBACpCgiD,EAAYtmC,SAAWmtC,EAAgBntC,UAAYsmC,EAAYhiD,iBAE3DmlD,EAAS,CACTA,EAAQ6D,UAAYA,EAEpB,IAAMjrC,EAAM2pC,EAAMI,OAAOttC,EAAM2qC,EAAS0D,EAAgBl3B,YACxD,IAAKo3B,GAAUhrC,EAGX,OAFAonC,EAAQ8D,OAAQ,OAChB1sC,EAAS,KAAMwB,EAAK9S,EAAM7O,EAAO+oD,EAAS3qC,GAOlDqrC,EAAOc,OAAOnsC,GAEdquC,EAAgBnH,aAAeM,EAC/Bta,EAAKib,OAAO13C,EAAM49C,GAAiB,SAAC9qD,EAAGiY,GAC/BjY,GACAA,EAAE5C,KAAOqf,EACT+B,EAASxe,KAET2pD,EAAME,OAAOxrD,EAAMjB,KAAMgqD,EAAQC,aAAcyD,EAAgBl3B,WAAY3b,EAAO+H,KAClFxB,EAAS,KAAMvG,EAAO+H,IAAK9S,EAAM7O,EAAO+oD,EAAS3qC,OAOrD0uC,CAAwBjH,MACzBwD,OAAM,SAAA5zB,GACL21B,QAAQjC,IAAI1zB,GACZtV,EAASsV,MAKrB,SAASs3B,EAAgB5sC,EAAUwsC,EAAQp3B,GACvC,IAAK,IAAIvyB,EAAI,EAAGA,EAAIsoC,EAAK0hB,OAAOhsD,OAAQgC,IACpC0pD,EAAephB,EAAK0hB,OAAOhqD,GAAImd,EAAUwsC,EAAQrhB,EAAK0hB,OAAOhsD,QAAUgC,EAAI,GAAIuyB,GAuIvF,OA3GA+V,EAAK2hB,MAAQ,WAMT,OALK3hB,EAAK4hB,YACN5hB,EAAK4e,IAAM,cAzBE,gBAAb5e,EAAK4e,MACL5e,EAAK6hB,WAAahD,aAAY,WACtB7e,EAAK4hB,YACL/oD,EAAYwkD,iBAKZoE,GAAgB,SAACprD,EAAGggB,EAAK/hB,EAAGI,EAAO+oD,GAC3BpnD,EACA8nD,EAAOn5C,IAAI3O,EAAGA,EAAE5C,MAAQiB,EAAMjB,MACvB4iB,GACP9hB,EAAkBgC,EAAO/B,SAAU6hB,EAAK3hB,SAIrDd,EAAQ2rD,QAYf1oD,KAAK+qD,WAAY,GACV,GAGX5hB,EAAK8hB,QAAU,WAAqE,OAAxD/C,cAAc/e,EAAK6hB,YAAahrD,KAAK+qD,WAAY,GAAc,GAM3F5hB,EAAK+hB,+BAAiC,WAClC,IAAMC,EAAQxtD,EAASsB,qBAAqB,QAC5CkqC,EAAK0hB,OAAS,GAEd,IAAK,IAAI3/B,EAAI,EAAGA,EAAIigC,EAAMtsD,OAAQqsB,KACT,oBAAjBigC,EAAMjgC,GAAGkgC,KAA8BD,EAAMjgC,GAAGkgC,IAAI/6C,MAAM,eACzD86C,EAAMjgC,GAAGtqB,KAAKyP,MAAM65C,KACrB/gB,EAAK0hB,OAAOrqD,KAAK2qD,EAAMjgC,KASnCie,EAAKkiB,oBAAsB,WAAM,OAAA,IAAI9G,SAAQ,SAACC,GAC1Crb,EAAK+hB,iCACL1G,QAOJrb,EAAK/V,WAAa,SAAAk4B,GAAU,OAAAniB,EAAKoiB,SAAQ,EAAMD,GAAQ,IAEvDniB,EAAKoiB,QAAU,SAACf,EAAQp3B,EAAYozB,GAIhC,OAHKgE,GAAUhE,KAAsC,IAAnBA,GAC9BxkD,EAAYwkD,iBAET,IAAIjC,SAAQ,SAACC,EAASC,GACzB,IAAI+G,EACAC,EACAC,EACAC,EACJH,EAAYC,EAAU,IAAI3E,KAKF,KAFxB6E,EAAkBxiB,EAAK0hB,OAAOhsD,SAI1B4sD,EAAU,IAAI3E,KACd4E,EAAoBD,EAAUD,EAC9BriB,EAAKvnC,OAAOzB,KAAK,gDACjBqkD,EAAQ,CACJgH,UAASA,EACTC,QAAOA,EACPC,kBAAiBA,EACjBb,OAAQ1hB,EAAK0hB,OAAOhsD,UAKxB+rD,GAAgB,SAACprD,EAAGggB,EAAK/hB,EAAGI,EAAO+oD,GAC/B,GAAIpnD,EAGA,OAFA8nD,EAAOn5C,IAAI3O,EAAGA,EAAE5C,MAAQiB,EAAMjB,WAC9B6nD,EAAOjlD,GAGPonD,EAAQ8D,MACRvhB,EAAKvnC,OAAOzB,KAAK,WAAWpC,OAAAF,EAAMjB,KAAkB,iBAEpDusC,EAAKvnC,OAAOzB,KAAK,YAAYpC,OAAAF,EAAMjB,KAAoB,mBAE3Dc,EAAkBgC,EAAO/B,SAAU6hB,EAAK3hB,GACxCsrC,EAAKvnC,OAAOzB,KAAK,kBAAWtC,EAAMjB,KAAI,kBAAAmB,OAAiB,IAAI+oD,KAAS2E,EAAO,OAMnD,MAHxBE,IAIID,EAAoB,IAAI5E,KAAS0E,EACjCriB,EAAKvnC,OAAOzB,KAAK,uCAAuCpC,OAAA2tD,EAAqB,OAC7ElH,EAAQ,CACJgH,UAASA,EACTC,QAAOA,EACPC,kBAAiBA,EACjBb,OAAQ1hB,EAAK0hB,OAAOhsD,UAG5B4sD,EAAU,IAAI3E,OACf0D,EAAQp3B,GAGfi3B,EAAWj3B,OAInB+V,EAAKyiB,cAAgBvB,EACdlhB,EHrQEjqB,CAAKxf,OAAQ3C,IAU1B,SAAS8uD,GAAgBn/C,GACjBA,EAAKlL,UACLynD,QAAQ/oD,KAAKwM,GAEZ3P,GAAQ2oD,OACT1mD,GAAKM,YAAY47C,WAZzBx7C,OAAOypC,KAAOA,GAgBVpsC,GAAQ8rD,UACJ,SAAS3sC,KAAKxc,OAAO+mD,SAASzkB,OAC9BmH,GAAK2hB,QAGJ/tD,GAAQ2oD,QACTlmC,GAAM,oCACNxgB,GAAOrB,SAASqB,MAAQrB,SAASsB,qBAAqB,QAAQ,IAC9Di8C,GAAQv9C,SAASW,cAAc,UAEzBsC,KAAO,WACTs6C,GAAMz8C,WACNy8C,GAAMz8C,WAAWc,QAAUigB,GAE3B07B,GAAMx8C,YAAYf,SAASgB,eAAe6gB,KAG9CxgB,GAAKN,YAAYw8C,KAErB/R,GAAK+hB,iCACL/hB,GAAK2iB,iBAAmB3iB,GAAKoiB,QAAqB,gBAAbpiB,GAAK4e,KAAuB5D,KAAK0H,GAAiBA"}
\ No newline at end of file
diff --git a/packages/less/.gitignore b/packages/less/.gitignore
index f6a0026cf..6ae03361c 100644
--- a/packages/less/.gitignore
+++ b/packages/less/.gitignore
@@ -1,5 +1,6 @@
# project-specific
tmp
+dist
test/browser/less.min.js
test/browser/less.min.js.map
test/sourcemaps/**/*.map
diff --git a/packages/less/dist/less.js b/packages/less/dist/less.js
deleted file mode 100644
index 21d6708ef..000000000
--- a/packages/less/dist/less.js
+++ /dev/null
@@ -1,13256 +0,0 @@
-/**
- * Less - Leaner CSS v4.5.0
- * http://lesscss.org
- *
- * Copyright (c) 2009-2026, Alexis Sellier
- * Licensed under the Apache-2.0 License.
- *
- * @license Apache-2.0
- */
-
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.less = factory());
-})(this, (function () { 'use strict';
-
- // Export a new default each time
- function defaultOptions() {
- return {
- /* Inline Javascript - @plugin still allowed */
- javascriptEnabled: false,
-
- /* Outputs a makefile import dependency list to stdout. */
- depends: false,
-
- /* (DEPRECATED) Compress using less built-in compression.
- * This does an okay job but does not utilise all the tricks of
- * dedicated css compression. */
- compress: false,
-
- /* Runs the less parser and just reports errors without any output. */
- lint: false,
-
- /* Sets available include paths.
- * If the file in an @import rule does not exist at that exact location,
- * less will look for it at the location(s) passed to this option.
- * You might use this for instance to specify a path to a library which
- * you want to be referenced simply and relatively in the less files. */
- paths: [],
-
- /* color output in the terminal */
- color: true,
-
- /**
- * @deprecated This option has confusing behavior and may be removed in a future version.
- *
- * When true, prevents @import statements for .less files from being evaluated inside
- * selector blocks (rulesets). The imports are silently ignored and not output.
- *
- * Behavior:
- * - @import at root level: Always processed
- * - @import inside @-rules (@media, @supports, etc.): Processed (these are not selector blocks)
- * - @import inside selector blocks (.class, #id, etc.): NOT processed (silently ignored)
- *
- * When false (default): All @import statements are processed regardless of context.
- *
- * Note: Despite the name "strict", this option does NOT throw an error when imports
- * are used in selector blocks - it silently ignores them. This is confusing
- * behavior that may catch users off guard.
- *
- * Note: Only affects .less file imports. CSS imports (url(...) or .css files) are
- * always output as CSS @import statements regardless of this setting.
- *
- * @see https://github.com/less/less.js/issues/656
- */
- strictImports: false,
-
- /* Allow Imports from Insecure HTTPS Hosts */
- insecure: false,
-
- /* Allows you to add a path to every generated import and url in your css.
- * This does not affect less import statements that are processed, just ones
- * that are left in the output css. */
- rootpath: '',
-
- /* By default URLs are kept as-is, so if you import a file in a sub-directory
- * that references an image, exactly the same URL will be output in the css.
- * This option allows you to re-write URL's in imported files so that the
- * URL is always relative to the base imported file */
- rewriteUrls: false,
-
- /* How to process math
- * 0 always - eagerly try to solve all operations
- * 1 parens-division - require parens for division "/"
- * 2 parens | strict - require parens for all operations
- * 3 strict-legacy - legacy strict behavior (super-strict)
- */
- math: 1,
-
- /* Without this option, less attempts to guess at the output unit when it does maths. */
- strictUnits: false,
-
- /* Effectively the declaration is put at the top of your base Less file,
- * meaning it can be used but it also can be overridden if this variable
- * is defined in the file. */
- globalVars: null,
-
- /* As opposed to the global variable option, this puts the declaration at the
- * end of your base file, meaning it will override anything defined in your Less file. */
- modifyVars: null,
-
- /* This option allows you to specify a argument to go on to every URL. */
- urlArgs: ''
- }
- }
-
- function extractId(href) {
- return href.replace(/^[a-z-]+:\/+?[^/]+/, '') // Remove protocol & domain
- .replace(/[?&]livereload=\w+/, '') // Remove LiveReload cachebuster
- .replace(/^\//, '') // Remove root /
- .replace(/\.[a-zA-Z]+$/, '') // Remove simple extension
- .replace(/[^.\w-]+/g, '-') // Replace illegal characters
- .replace(/\./g, ':'); // Replace dots with colons(for valid id)
- }
-
- function addDataAttr(options, tag) {
- if (!tag) {return;} // in case of tag is null or undefined
- for (const opt in tag.dataset) {
- if (Object.prototype.hasOwnProperty.call(tag.dataset, opt)) {
- if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') {
- options[opt] = tag.dataset[opt];
- } else {
- try {
- options[opt] = JSON.parse(tag.dataset[opt]);
- }
- catch (_) {}
- }
- }
- }
- }
-
- var browser$1 = {
- createCSS: function (document, styles, sheet) {
- // Strip the query-string
- const href = sheet.href || '';
-
- // If there is no title set, use the filename, minus the extension
- const id = `less:${sheet.title || extractId(href)}`;
-
- // If this has already been inserted into the DOM, we may need to replace it
- const oldStyleNode = document.getElementById(id);
- let keepOldStyleNode = false;
-
- // Create a new stylesheet node for insertion or (if necessary) replacement
- const styleNode = document.createElement('style');
- styleNode.setAttribute('type', 'text/css');
- if (sheet.media) {
- styleNode.setAttribute('media', sheet.media);
- }
- styleNode.id = id;
-
- if (!styleNode.styleSheet) {
- styleNode.appendChild(document.createTextNode(styles));
-
- // If new contents match contents of oldStyleNode, don't replace oldStyleNode
- keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 &&
- oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);
- }
-
- const head = document.getElementsByTagName('head')[0];
-
- // If there is no oldStyleNode, just append; otherwise, only append if we need
- // to replace oldStyleNode with an updated stylesheet
- if (oldStyleNode === null || keepOldStyleNode === false) {
- const nextEl = sheet && sheet.nextSibling || null;
- if (nextEl) {
- nextEl.parentNode.insertBefore(styleNode, nextEl);
- } else {
- head.appendChild(styleNode);
- }
- }
- if (oldStyleNode && keepOldStyleNode === false) {
- oldStyleNode.parentNode.removeChild(oldStyleNode);
- }
-
- // For IE.
- // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.
- // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head
- if (styleNode.styleSheet) {
- try {
- styleNode.styleSheet.cssText = styles;
- } catch (e) {
- throw new Error('Couldn\'t reassign styleSheet.cssText.');
- }
- }
- },
- currentScript: function(window) {
- const document = window.document;
- return document.currentScript || (() => {
- const scripts = document.getElementsByTagName('script');
- return scripts[scripts.length - 1];
- })();
- }
- };
-
- var addDefaultOptions = (window, options) => {
-
- // use options from the current script tag data attribues
- addDataAttr(options, browser$1.currentScript(window));
-
- if (options.isFileProtocol === undefined) {
- options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);
- }
-
- // Load styles asynchronously (default: false)
- //
- // This is set to `false` by default, so that the body
- // doesn't start loading before the stylesheets are parsed.
- // Setting this to `true` can result in flickering.
- //
- options.async = options.async || false;
- options.fileAsync = options.fileAsync || false;
-
- // Interval between watch polls
- options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);
-
- options.env = options.env || (window.location.hostname == '127.0.0.1' ||
- window.location.hostname == '0.0.0.0' ||
- window.location.hostname == 'localhost' ||
- (window.location.port &&
- window.location.port.length > 0) ||
- options.isFileProtocol ? 'development'
- : 'production');
-
- const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);
- if (dumpLineNumbers) {
- options.dumpLineNumbers = dumpLineNumbers[1];
- }
-
- if (options.useFileCache === undefined) {
- options.useFileCache = true;
- }
-
- if (options.onReady === undefined) {
- options.onReady = true;
- }
-
- if (options.relativeUrls) {
- options.rewriteUrls = 'all';
- }
- };
-
- var logger$1 = {
- error: function(msg) {
- this._fireEvent('error', msg);
- },
- warn: function(msg) {
- this._fireEvent('warn', msg);
- },
- info: function(msg) {
- this._fireEvent('info', msg);
- },
- debug: function(msg) {
- this._fireEvent('debug', msg);
- },
- addListener: function(listener) {
- this._listeners.push(listener);
- },
- removeListener: function(listener) {
- for (let i = 0; i < this._listeners.length; i++) {
- if (this._listeners[i] === listener) {
- this._listeners.splice(i, 1);
- return;
- }
- }
- },
- _fireEvent: function(type, msg) {
- for (let i = 0; i < this._listeners.length; i++) {
- const logFunction = this._listeners[i][type];
- if (logFunction) {
- logFunction(msg);
- }
- }
- },
- _listeners: []
- };
-
- /**
- * @todo Document why this abstraction exists, and the relationship between
- * environment, file managers, and plugin manager
- */
-
- class Environment {
- constructor(externalEnvironment, fileManagers) {
- this.fileManagers = fileManagers || [];
- externalEnvironment = externalEnvironment || {};
-
- const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];
- const requiredFunctions = [];
- const functions = requiredFunctions.concat(optionalFunctions);
-
- for (let i = 0; i < functions.length; i++) {
- const propName = functions[i];
- const environmentFunc = externalEnvironment[propName];
- if (environmentFunc) {
- this[propName] = environmentFunc.bind(externalEnvironment);
- } else if (i < requiredFunctions.length) {
- this.warn(`missing required function in environment - ${propName}`);
- }
- }
- }
-
- getFileManager(filename, currentDirectory, options, environment, isSync) {
-
- if (!filename) {
- logger$1.warn('getFileManager called with no filename.. Please report this issue. continuing.');
- }
- if (currentDirectory === undefined) {
- logger$1.warn('getFileManager called with null directory.. Please report this issue. continuing.');
- }
-
- let fileManagers = this.fileManagers;
- if (options.pluginManager) {
- fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());
- }
- for (let i = fileManagers.length - 1; i >= 0 ; i--) {
- const fileManager = fileManagers[i];
- if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {
- return fileManager;
- }
- }
- return null;
- }
-
- addFileManager(fileManager) {
- this.fileManagers.push(fileManager);
- }
-
- clearFileManagers() {
- this.fileManagers = [];
- }
- }
-
- var colors = {
- 'aliceblue':'#f0f8ff',
- 'antiquewhite':'#faebd7',
- 'aqua':'#00ffff',
- 'aquamarine':'#7fffd4',
- 'azure':'#f0ffff',
- 'beige':'#f5f5dc',
- 'bisque':'#ffe4c4',
- 'black':'#000000',
- 'blanchedalmond':'#ffebcd',
- 'blue':'#0000ff',
- 'blueviolet':'#8a2be2',
- 'brown':'#a52a2a',
- 'burlywood':'#deb887',
- 'cadetblue':'#5f9ea0',
- 'chartreuse':'#7fff00',
- 'chocolate':'#d2691e',
- 'coral':'#ff7f50',
- 'cornflowerblue':'#6495ed',
- 'cornsilk':'#fff8dc',
- 'crimson':'#dc143c',
- 'cyan':'#00ffff',
- 'darkblue':'#00008b',
- 'darkcyan':'#008b8b',
- 'darkgoldenrod':'#b8860b',
- 'darkgray':'#a9a9a9',
- 'darkgrey':'#a9a9a9',
- 'darkgreen':'#006400',
- 'darkkhaki':'#bdb76b',
- 'darkmagenta':'#8b008b',
- 'darkolivegreen':'#556b2f',
- 'darkorange':'#ff8c00',
- 'darkorchid':'#9932cc',
- 'darkred':'#8b0000',
- 'darksalmon':'#e9967a',
- 'darkseagreen':'#8fbc8f',
- 'darkslateblue':'#483d8b',
- 'darkslategray':'#2f4f4f',
- 'darkslategrey':'#2f4f4f',
- 'darkturquoise':'#00ced1',
- 'darkviolet':'#9400d3',
- 'deeppink':'#ff1493',
- 'deepskyblue':'#00bfff',
- 'dimgray':'#696969',
- 'dimgrey':'#696969',
- 'dodgerblue':'#1e90ff',
- 'firebrick':'#b22222',
- 'floralwhite':'#fffaf0',
- 'forestgreen':'#228b22',
- 'fuchsia':'#ff00ff',
- 'gainsboro':'#dcdcdc',
- 'ghostwhite':'#f8f8ff',
- 'gold':'#ffd700',
- 'goldenrod':'#daa520',
- 'gray':'#808080',
- 'grey':'#808080',
- 'green':'#008000',
- 'greenyellow':'#adff2f',
- 'honeydew':'#f0fff0',
- 'hotpink':'#ff69b4',
- 'indianred':'#cd5c5c',
- 'indigo':'#4b0082',
- 'ivory':'#fffff0',
- 'khaki':'#f0e68c',
- 'lavender':'#e6e6fa',
- 'lavenderblush':'#fff0f5',
- 'lawngreen':'#7cfc00',
- 'lemonchiffon':'#fffacd',
- 'lightblue':'#add8e6',
- 'lightcoral':'#f08080',
- 'lightcyan':'#e0ffff',
- 'lightgoldenrodyellow':'#fafad2',
- 'lightgray':'#d3d3d3',
- 'lightgrey':'#d3d3d3',
- 'lightgreen':'#90ee90',
- 'lightpink':'#ffb6c1',
- 'lightsalmon':'#ffa07a',
- 'lightseagreen':'#20b2aa',
- 'lightskyblue':'#87cefa',
- 'lightslategray':'#778899',
- 'lightslategrey':'#778899',
- 'lightsteelblue':'#b0c4de',
- 'lightyellow':'#ffffe0',
- 'lime':'#00ff00',
- 'limegreen':'#32cd32',
- 'linen':'#faf0e6',
- 'magenta':'#ff00ff',
- 'maroon':'#800000',
- 'mediumaquamarine':'#66cdaa',
- 'mediumblue':'#0000cd',
- 'mediumorchid':'#ba55d3',
- 'mediumpurple':'#9370d8',
- 'mediumseagreen':'#3cb371',
- 'mediumslateblue':'#7b68ee',
- 'mediumspringgreen':'#00fa9a',
- 'mediumturquoise':'#48d1cc',
- 'mediumvioletred':'#c71585',
- 'midnightblue':'#191970',
- 'mintcream':'#f5fffa',
- 'mistyrose':'#ffe4e1',
- 'moccasin':'#ffe4b5',
- 'navajowhite':'#ffdead',
- 'navy':'#000080',
- 'oldlace':'#fdf5e6',
- 'olive':'#808000',
- 'olivedrab':'#6b8e23',
- 'orange':'#ffa500',
- 'orangered':'#ff4500',
- 'orchid':'#da70d6',
- 'palegoldenrod':'#eee8aa',
- 'palegreen':'#98fb98',
- 'paleturquoise':'#afeeee',
- 'palevioletred':'#d87093',
- 'papayawhip':'#ffefd5',
- 'peachpuff':'#ffdab9',
- 'peru':'#cd853f',
- 'pink':'#ffc0cb',
- 'plum':'#dda0dd',
- 'powderblue':'#b0e0e6',
- 'purple':'#800080',
- 'rebeccapurple':'#663399',
- 'red':'#ff0000',
- 'rosybrown':'#bc8f8f',
- 'royalblue':'#4169e1',
- 'saddlebrown':'#8b4513',
- 'salmon':'#fa8072',
- 'sandybrown':'#f4a460',
- 'seagreen':'#2e8b57',
- 'seashell':'#fff5ee',
- 'sienna':'#a0522d',
- 'silver':'#c0c0c0',
- 'skyblue':'#87ceeb',
- 'slateblue':'#6a5acd',
- 'slategray':'#708090',
- 'slategrey':'#708090',
- 'snow':'#fffafa',
- 'springgreen':'#00ff7f',
- 'steelblue':'#4682b4',
- 'tan':'#d2b48c',
- 'teal':'#008080',
- 'thistle':'#d8bfd8',
- 'tomato':'#ff6347',
- 'turquoise':'#40e0d0',
- 'violet':'#ee82ee',
- 'wheat':'#f5deb3',
- 'white':'#ffffff',
- 'whitesmoke':'#f5f5f5',
- 'yellow':'#ffff00',
- 'yellowgreen':'#9acd32'
- };
-
- var unitConversions = {
- length: {
- 'm': 1,
- 'cm': 0.01,
- 'mm': 0.001,
- 'in': 0.0254,
- 'px': 0.0254 / 96,
- 'pt': 0.0254 / 72,
- 'pc': 0.0254 / 72 * 12
- },
- duration: {
- 's': 1,
- 'ms': 0.001
- },
- angle: {
- 'rad': 1 / (2 * Math.PI),
- 'deg': 1 / 360,
- 'grad': 1 / 400,
- 'turn': 1
- }
- };
-
- var data = { colors, unitConversions };
-
- /**
- * The reason why Node is a class and other nodes simply do not extend
- * from Node (since we're transpiling) is due to this issue:
- *
- * @see https://github.com/less/less.js/issues/3434
- */
- class Node {
- constructor() {
- this.parent = null;
- this.visibilityBlocks = undefined;
- this.nodeVisible = undefined;
- this.rootNode = null;
- this.parsed = null;
- }
-
- get currentFileInfo() {
- return this.fileInfo();
- }
-
- get index() {
- return this.getIndex();
- }
-
- setParent(nodes, parent) {
- function set(node) {
- if (node && node instanceof Node) {
- node.parent = parent;
- }
- }
- if (Array.isArray(nodes)) {
- nodes.forEach(set);
- }
- else {
- set(nodes);
- }
- }
-
- getIndex() {
- return this._index || (this.parent && this.parent.getIndex()) || 0;
- }
-
- fileInfo() {
- return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};
- }
-
- isRulesetLike() { return false; }
-
- toCSS(context) {
- const strs = [];
- this.genCSS(context, {
- // remove when genCSS has JSDoc types
- // eslint-disable-next-line no-unused-vars
- add: function(chunk, fileInfo, index) {
- strs.push(chunk);
- },
- isEmpty: function () {
- return strs.length === 0;
- }
- });
- return strs.join('');
- }
-
- genCSS(context, output) {
- output.add(this.value);
- }
-
- accept(visitor) {
- this.value = visitor.visit(this.value);
- }
-
- eval() { return this; }
-
- _operate(context, op, a, b) {
- switch (op) {
- case '+': return a + b;
- case '-': return a - b;
- case '*': return a * b;
- case '/': return a / b;
- }
- }
-
- fround(context, value) {
- const precision = context && context.numPrecision;
- // add "epsilon" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:
- return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;
- }
-
- static compare(a, b) {
- /* returns:
- -1: a < b
- 0: a = b
- 1: a > b
- and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */
-
- if ((a.compare) &&
- // for "symmetric results" force toCSS-based comparison
- // of Quoted or Anonymous if either value is one of those
- !(b.type === 'Quoted' || b.type === 'Anonymous')) {
- return a.compare(b);
- } else if (b.compare) {
- return -b.compare(a);
- } else if (a.type !== b.type) {
- return undefined;
- }
-
- a = a.value;
- b = b.value;
- if (!Array.isArray(a)) {
- return a === b ? 0 : undefined;
- }
- if (a.length !== b.length) {
- return undefined;
- }
- for (let i = 0; i < a.length; i++) {
- if (Node.compare(a[i], b[i]) !== 0) {
- return undefined;
- }
- }
- return 0;
- }
-
- static numericCompare(a, b) {
- return a < b ? -1
- : a === b ? 0
- : a > b ? 1 : undefined;
- }
-
- // Returns true if this node represents root of ast imported by reference
- blocksVisibility() {
- if (this.visibilityBlocks === undefined) {
- this.visibilityBlocks = 0;
- }
- return this.visibilityBlocks !== 0;
- }
-
- addVisibilityBlock() {
- if (this.visibilityBlocks === undefined) {
- this.visibilityBlocks = 0;
- }
- this.visibilityBlocks = this.visibilityBlocks + 1;
- }
-
- removeVisibilityBlock() {
- if (this.visibilityBlocks === undefined) {
- this.visibilityBlocks = 0;
- }
- this.visibilityBlocks = this.visibilityBlocks - 1;
- }
-
- // Turns on node visibility - if called node will be shown in output regardless
- // of whether it comes from import by reference or not
- ensureVisibility() {
- this.nodeVisible = true;
- }
-
- // Turns off node visibility - if called node will NOT be shown in output regardless
- // of whether it comes from import by reference or not
- ensureInvisibility() {
- this.nodeVisible = false;
- }
-
- // return values:
- // false - the node must not be visible
- // true - the node must be visible
- // undefined or null - the node has the same visibility as its parent
- isVisible() {
- return this.nodeVisible;
- }
-
- visibilityInfo() {
- return {
- visibilityBlocks: this.visibilityBlocks,
- nodeVisible: this.nodeVisible
- };
- }
-
- copyVisibilityInfo(info) {
- if (!info) {
- return;
- }
- this.visibilityBlocks = info.visibilityBlocks;
- this.nodeVisible = info.nodeVisible;
- }
- }
-
- //
- // RGB Colors - #ff0014, #eee
- //
- const Color = function(rgb, a, originalForm) {
- const self = this;
- //
- // The end goal here, is to parse the arguments
- // into an integer triplet, such as `128, 255, 0`
- //
- // This facilitates operations and conversions.
- //
- if (Array.isArray(rgb)) {
- this.rgb = rgb;
- } else if (rgb.length >= 6) {
- this.rgb = [];
- rgb.match(/.{2}/g).map(function (c, i) {
- if (i < 3) {
- self.rgb.push(parseInt(c, 16));
- } else {
- self.alpha = (parseInt(c, 16)) / 255;
- }
- });
- } else {
- this.rgb = [];
- rgb.split('').map(function (c, i) {
- if (i < 3) {
- self.rgb.push(parseInt(c + c, 16));
- } else {
- self.alpha = (parseInt(c + c, 16)) / 255;
- }
- });
- }
- this.alpha = this.alpha || (typeof a === 'number' ? a : 1);
- if (typeof originalForm !== 'undefined') {
- this.value = originalForm;
- }
- };
-
- Color.prototype = Object.assign(new Node(), {
- type: 'Color',
-
- luma() {
- let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;
-
- r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);
- g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);
- b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);
-
- return 0.2126 * r + 0.7152 * g + 0.0722 * b;
- },
-
- genCSS(context, output) {
- output.add(this.toCSS(context));
- },
-
- toCSS(context, doNotCompress) {
- const compress = context && context.compress && !doNotCompress;
- let color;
- let alpha;
- let colorFunction;
- let args = [];
-
- // `value` is set if this color was originally
- // converted from a named color string so we need
- // to respect this and try to output named color too.
- alpha = this.fround(context, this.alpha);
-
- if (this.value) {
- if (this.value.indexOf('rgb') === 0) {
- if (alpha < 1) {
- colorFunction = 'rgba';
- }
- } else if (this.value.indexOf('hsl') === 0) {
- if (alpha < 1) {
- colorFunction = 'hsla';
- } else {
- colorFunction = 'hsl';
- }
- } else {
- return this.value;
- }
- } else {
- if (alpha < 1) {
- colorFunction = 'rgba';
- }
- }
-
- switch (colorFunction) {
- case 'rgba':
- args = this.rgb.map(function (c) {
- return clamp$1(Math.round(c), 255);
- }).concat(clamp$1(alpha, 1));
- break;
- case 'hsla':
- args.push(clamp$1(alpha, 1));
- // eslint-disable-next-line no-fallthrough
- case 'hsl':
- color = this.toHSL();
- args = [
- this.fround(context, color.h),
- `${this.fround(context, color.s * 100)}%`,
- `${this.fround(context, color.l * 100)}%`
- ].concat(args);
- }
-
- if (colorFunction) {
- // Values are capped between `0` and `255`, rounded and zero-padded.
- return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;
- }
-
- color = this.toRGB();
-
- if (compress) {
- const splitcolor = color.split('');
-
- // Convert color to short format
- if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {
- color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;
- }
- }
-
- return color;
- },
-
- //
- // Operations have to be done per-channel, if not,
- // channels will spill onto each other. Once we have
- // our result, in the form of an integer triplet,
- // we create a new Color node to hold the result.
- //
- operate(context, op, other) {
- const rgb = new Array(3);
- const alpha = this.alpha * (1 - other.alpha) + other.alpha;
- for (let c = 0; c < 3; c++) {
- rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);
- }
- return new Color(rgb, alpha);
- },
-
- toRGB() {
- return toHex(this.rgb);
- },
-
- toHSL() {
- const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;
-
- const max = Math.max(r, g, b), min = Math.min(r, g, b);
- let h;
- let s;
- const l = (max + min) / 2;
- const d = max - min;
-
- if (max === min) {
- h = s = 0;
- } else {
- s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
-
- switch (max) {
- case r: h = (g - b) / d + (g < b ? 6 : 0); break;
- case g: h = (b - r) / d + 2; break;
- case b: h = (r - g) / d + 4; break;
- }
- h /= 6;
- }
- return { h: h * 360, s, l, a };
- },
-
- // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
- toHSV() {
- const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;
-
- const max = Math.max(r, g, b), min = Math.min(r, g, b);
- let h;
- let s;
- const v = max;
-
- const d = max - min;
- if (max === 0) {
- s = 0;
- } else {
- s = d / max;
- }
-
- if (max === min) {
- h = 0;
- } else {
- switch (max) {
- case r: h = (g - b) / d + (g < b ? 6 : 0); break;
- case g: h = (b - r) / d + 2; break;
- case b: h = (r - g) / d + 4; break;
- }
- h /= 6;
- }
- return { h: h * 360, s, v, a };
- },
-
- toARGB() {
- return toHex([this.alpha * 255].concat(this.rgb));
- },
-
- compare(x) {
- return (x.rgb &&
- x.rgb[0] === this.rgb[0] &&
- x.rgb[1] === this.rgb[1] &&
- x.rgb[2] === this.rgb[2] &&
- x.alpha === this.alpha) ? 0 : undefined;
- }
- });
-
- Color.fromKeyword = function(keyword) {
- let c;
- const key = keyword.toLowerCase();
- // eslint-disable-next-line no-prototype-builtins
- if (colors.hasOwnProperty(key)) {
- c = new Color(colors[key].slice(1));
- }
- else if (key === 'transparent') {
- c = new Color([0, 0, 0], 0);
- }
-
- if (c) {
- c.value = keyword;
- return c;
- }
- };
-
- function clamp$1(v, max) {
- return Math.min(Math.max(v, 0), max);
- }
-
- function toHex(v) {
- return `#${v.map(function (c) {
- c = clamp$1(Math.round(c), 255);
- return (c < 16 ? '0' : '') + c.toString(16);
- }).join('')}`;
- }
-
- const Paren = function(node) {
- this.value = node;
- };
-
- Paren.prototype = Object.assign(new Node(), {
- type: 'Paren',
-
- genCSS(context, output) {
- output.add('(');
- this.value.genCSS(context, output);
- output.add(')');
- },
-
- eval(context) {
- const paren = new Paren(this.value.eval(context));
-
- if (this.noSpacing) {
- paren.noSpacing = true;
- }
-
- return paren;
- }
- });
-
- const _noSpaceCombinators = {
- '': true,
- ' ': true,
- '|': true
- };
-
- const Combinator = function(value) {
- if (value === ' ') {
- this.value = ' ';
- this.emptyOrWhitespace = true;
- } else {
- this.value = value ? value.trim() : '';
- this.emptyOrWhitespace = this.value === '';
- }
- };
-
- Combinator.prototype = Object.assign(new Node(), {
- type: 'Combinator',
-
- genCSS(context, output) {
- const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';
- output.add(spaceOrEmpty + this.value + spaceOrEmpty);
- }
- });
-
- const Element = function(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {
- this.combinator = combinator instanceof Combinator ?
- combinator : new Combinator(combinator);
-
- if (typeof value === 'string') {
- this.value = value.trim();
- } else if (value) {
- this.value = value;
- } else {
- this.value = '';
- }
- this.isVariable = isVariable;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.copyVisibilityInfo(visibilityInfo);
- this.setParent(this.combinator, this);
- };
-
- Element.prototype = Object.assign(new Node(), {
- type: 'Element',
-
- accept(visitor) {
- const value = this.value;
- this.combinator = visitor.visit(this.combinator);
- if (typeof value === 'object') {
- this.value = visitor.visit(value);
- }
- },
-
- eval(context) {
- return new Element(this.combinator,
- this.value.eval ? this.value.eval(context) : this.value,
- this.isVariable,
- this.getIndex(),
- this.fileInfo(), this.visibilityInfo());
- },
-
- clone() {
- return new Element(this.combinator,
- this.value,
- this.isVariable,
- this.getIndex(),
- this.fileInfo(), this.visibilityInfo());
- },
-
- genCSS(context, output) {
- output.add(this.toCSS(context), this.fileInfo(), this.getIndex());
- },
-
- toCSS(context) {
- context = context || {};
- let value = this.value;
- const firstSelector = context.firstSelector;
- if (value instanceof Paren) {
- // selector in parens should not be affected by outer selector
- // flags (breaks only interpolated selectors - see #1973)
- context.firstSelector = true;
- }
- value = value.toCSS ? value.toCSS(context) : value;
- context.firstSelector = firstSelector;
- if (value === '' && this.combinator.value.charAt(0) === '&') {
- return '';
- } else {
- return this.combinator.toCSS(context) + value;
- }
- }
- });
-
- const Math$1 = {
- ALWAYS: 0,
- PARENS_DIVISION: 1,
- PARENS: 2
- // removed - STRICT_LEGACY: 3
- };
-
- const RewriteUrls = {
- OFF: 0,
- LOCAL: 1,
- ALL: 2
- };
-
- /**
- * Returns the object type of the given payload
- *
- * @param {*} payload
- * @returns {string}
- */
- function getType(payload) {
- return Object.prototype.toString.call(payload).slice(8, -1);
- }
- /**
- * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)
- *
- * @param {*} payload
- * @returns {payload is PlainObject}
- */
- function isPlainObject(payload) {
- if (getType(payload) !== 'Object')
- return false;
- return payload.constructor === Object && Object.getPrototypeOf(payload) === Object.prototype;
- }
- /**
- * Returns whether the payload is an array
- *
- * @param {any} payload
- * @returns {payload is any[]}
- */
- function isArray(payload) {
- return getType(payload) === 'Array';
- }
-
- function assignProp(carry, key, newVal, originalObject, includeNonenumerable) {
- const propType = {}.propertyIsEnumerable.call(originalObject, key)
- ? 'enumerable'
- : 'nonenumerable';
- if (propType === 'enumerable')
- carry[key] = newVal;
- if (includeNonenumerable && propType === 'nonenumerable') {
- Object.defineProperty(carry, key, {
- value: newVal,
- enumerable: false,
- writable: true,
- configurable: true,
- });
- }
- }
- /**
- * Copy (clone) an object and all its props recursively to get rid of any prop referenced of the original object. Arrays are also cloned, however objects inside arrays are still linked.
- *
- * @export
- * @template T
- * @param {T} target Target can be anything
- * @param {Options} [options = {}] Options can be `props` or `nonenumerable`
- * @returns {T} the target with replaced values
- * @export
- */
- function copy(target, options = {}) {
- if (isArray(target)) {
- return target.map((item) => copy(item, options));
- }
- if (!isPlainObject(target)) {
- return target;
- }
- const props = Object.getOwnPropertyNames(target);
- const symbols = Object.getOwnPropertySymbols(target);
- return [...props, ...symbols].reduce((carry, key) => {
- if (isArray(options.props) && !options.props.includes(key)) {
- return carry;
- }
- const val = target[key];
- const newVal = copy(val, options);
- assignProp(carry, key, newVal, target, options.nonenumerable);
- return carry;
- }, {});
- }
-
- /* jshint proto: true */
-
- function getLocation(index, inputStream) {
- let n = index + 1;
- let line = null;
- let column = -1;
-
- while (--n >= 0 && inputStream.charAt(n) !== '\n') {
- column++;
- }
-
- if (typeof index === 'number') {
- line = (inputStream.slice(0, index).match(/\n/g) || '').length;
- }
-
- return {
- line,
- column
- };
- }
-
- function copyArray(arr) {
- let i;
- const length = arr.length;
- const copy = new Array(length);
-
- for (i = 0; i < length; i++) {
- copy[i] = arr[i];
- }
- return copy;
- }
-
- function clone(obj) {
- const cloned = {};
- for (const prop in obj) {
- if (Object.prototype.hasOwnProperty.call(obj, prop)) {
- cloned[prop] = obj[prop];
- }
- }
- return cloned;
- }
-
- function defaults(obj1, obj2) {
- let newObj = obj2 || {};
- if (!obj2._defaults) {
- newObj = {};
- const defaults = copy(obj1);
- newObj._defaults = defaults;
- const cloned = obj2 ? copy(obj2) : {};
- Object.assign(newObj, defaults, cloned);
- }
- return newObj;
- }
-
- function copyOptions(obj1, obj2) {
- if (obj2 && obj2._defaults) {
- return obj2;
- }
- const opts = defaults(obj1, obj2);
- if (opts.strictMath) {
- opts.math = Math$1.PARENS;
- }
- // Back compat with changed relativeUrls option
- if (opts.relativeUrls) {
- opts.rewriteUrls = RewriteUrls.ALL;
- }
- if (typeof opts.math === 'string') {
- switch (opts.math.toLowerCase()) {
- case 'always':
- opts.math = Math$1.ALWAYS;
- break;
- case 'parens-division':
- opts.math = Math$1.PARENS_DIVISION;
- break;
- case 'strict':
- case 'parens':
- opts.math = Math$1.PARENS;
- break;
- default:
- opts.math = Math$1.PARENS;
- }
- }
- if (typeof opts.rewriteUrls === 'string') {
- switch (opts.rewriteUrls.toLowerCase()) {
- case 'off':
- opts.rewriteUrls = RewriteUrls.OFF;
- break;
- case 'local':
- opts.rewriteUrls = RewriteUrls.LOCAL;
- break;
- case 'all':
- opts.rewriteUrls = RewriteUrls.ALL;
- break;
- }
- }
- return opts;
- }
-
- function merge(obj1, obj2) {
- for (const prop in obj2) {
- if (Object.prototype.hasOwnProperty.call(obj2, prop)) {
- obj1[prop] = obj2[prop];
- }
- }
- return obj1;
- }
-
- function flattenArray(arr, result = []) {
- for (let i = 0, length = arr.length; i < length; i++) {
- const value = arr[i];
- if (Array.isArray(value)) {
- flattenArray(value, result);
- } else {
- if (value !== undefined) {
- result.push(value);
- }
- }
- }
- return result;
- }
-
- function isNullOrUndefined(val) {
- return val === null || val === undefined
- }
-
- var utils = /*#__PURE__*/Object.freeze({
- __proto__: null,
- getLocation: getLocation,
- copyArray: copyArray,
- clone: clone,
- defaults: defaults,
- copyOptions: copyOptions,
- merge: merge,
- flattenArray: flattenArray,
- isNullOrUndefined: isNullOrUndefined
- });
-
- const anonymousFunc = /(|Function):(\d+):(\d+)/;
-
- /**
- * This is a centralized class of any error that could be thrown internally (mostly by the parser).
- * Besides standard .message it keeps some additional data like a path to the file where the error
- * occurred along with line and column numbers.
- *
- * @class
- * @extends Error
- * @type {module.LessError}
- *
- * @prop {string} type
- * @prop {string} filename
- * @prop {number} index
- * @prop {number} line
- * @prop {number} column
- * @prop {number} callLine
- * @prop {number} callExtract
- * @prop {string[]} extract
- *
- * @param {Object} e - An error object to wrap around or just a descriptive object
- * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?
- * @param {string} [currentFilename]
- */
- const LessError = function(e, fileContentMap, currentFilename) {
- Error.call(this);
-
- const filename = e.filename || currentFilename;
-
- this.message = e.message;
- this.stack = e.stack;
-
- // Set type early so it's always available, even if fileContentMap is missing
- this.type = e.type || 'Syntax';
-
- if (fileContentMap && filename) {
- const input = fileContentMap.contents[filename];
- const loc = getLocation(e.index, input);
- var line = loc.line;
- const col = loc.column;
- const callLine = e.call && getLocation(e.call, input).line;
- const lines = input ? input.split('\n') : '';
-
- this.filename = filename;
- this.index = e.index;
- this.line = typeof line === 'number' ? line + 1 : null;
- this.column = col;
-
- if (!this.line && this.stack) {
- const found = this.stack.match(anonymousFunc);
-
- /**
- * We have to figure out how this environment stringifies anonymous functions
- * so we can correctly map plugin errors.
- *
- * Note, in Node 8, the output of anonymous funcs varied based on parameters
- * being present or not, so we inject dummy params.
- */
- const func = new Function('a', 'throw new Error()');
- let lineAdjust = 0;
- try {
- func();
- } catch (e) {
- const match = e.stack.match(anonymousFunc);
- lineAdjust = 1 - parseInt(match[2]);
- }
-
- if (found) {
- if (found[2]) {
- this.line = parseInt(found[2]) + lineAdjust;
- }
- if (found[3]) {
- this.column = parseInt(found[3]);
- }
- }
- }
-
- this.callLine = callLine + 1;
- this.callExtract = lines[callLine];
-
- this.extract = [
- lines[this.line - 2],
- lines[this.line - 1],
- lines[this.line]
- ];
- }
-
- };
-
- if (typeof Object.create === 'undefined') {
- const F = function () {};
- F.prototype = Error.prototype;
- LessError.prototype = new F();
- } else {
- LessError.prototype = Object.create(Error.prototype);
- }
-
- LessError.prototype.constructor = LessError;
-
- /**
- * An overridden version of the default Object.prototype.toString
- * which uses additional information to create a helpful message.
- *
- * @param {Object} options
- * @returns {string}
- */
- LessError.prototype.toString = function(options) {
- options = options || {};
- const isWarning = (this.type ?? '').toLowerCase().includes('warning');
- const type = isWarning ? this.type : `${this.type}Error`;
- const color = isWarning ? 'yellow' : 'red';
-
- let message = '';
- const extract = this.extract || [];
- let error = [];
- let stylize = function (str) { return str; };
- if (options.stylize) {
- const type = typeof options.stylize;
- if (type !== 'function') {
- throw Error(`options.stylize should be a function, got a ${type}!`);
- }
- stylize = options.stylize;
- }
-
- if (this.line !== null) {
- if (!isWarning && typeof extract[0] === 'string') {
- error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));
- }
-
- if (typeof extract[1] === 'string') {
- let errorTxt = `${this.line} `;
- if (extract[1]) {
- errorTxt += extract[1].slice(0, this.column) +
- stylize(stylize(stylize(extract[1].slice(this.column, this.column + 1), 'bold') +
- extract[1].slice(this.column + 1), 'red'), 'inverse');
- }
- error.push(errorTxt);
- }
-
- if (!isWarning && typeof extract[2] === 'string') {
- error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));
- }
- error = `${error.join('\n') + stylize('', 'reset')}\n`;
- }
-
- message += stylize(`${type}: ${this.message}`, color);
- if (this.filename) {
- message += stylize(' in ', color) + this.filename;
- }
- if (this.line) {
- message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');
- }
-
- message += `\n${error}`;
-
- if (this.callLine) {
- message += `${stylize('from ', color) + (this.filename || '')}/n`;
- message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;
- }
-
- return message;
- };
-
- const _visitArgs = { visitDeeper: true };
- let _hasIndexed = false;
-
- function _noop(node) {
- return node;
- }
-
- function indexNodeTypes(parent, ticker) {
- // add .typeIndex to tree node types for lookup table
- let key, child;
- for (key in parent) {
- /* eslint guard-for-in: 0 */
- child = parent[key];
- switch (typeof child) {
- case 'function':
- // ignore bound functions directly on tree which do not have a prototype
- // or aren't nodes
- if (child.prototype && child.prototype.type) {
- child.prototype.typeIndex = ticker++;
- }
- break;
- case 'object':
- ticker = indexNodeTypes(child, ticker);
- break;
-
- }
- }
- return ticker;
- }
-
- class Visitor {
- constructor(implementation) {
- this._implementation = implementation;
- this._visitInCache = {};
- this._visitOutCache = {};
-
- if (!_hasIndexed) {
- indexNodeTypes(tree, 1);
- _hasIndexed = true;
- }
- }
-
- visit(node) {
- if (!node) {
- return node;
- }
-
- const nodeTypeIndex = node.typeIndex;
- if (!nodeTypeIndex) {
- // MixinCall args aren't a node type?
- if (node.value && node.value.typeIndex) {
- this.visit(node.value);
- }
- return node;
- }
-
- const impl = this._implementation;
- let func = this._visitInCache[nodeTypeIndex];
- let funcOut = this._visitOutCache[nodeTypeIndex];
- const visitArgs = _visitArgs;
- let fnName;
-
- visitArgs.visitDeeper = true;
-
- if (!func) {
- fnName = `visit${node.type}`;
- func = impl[fnName] || _noop;
- funcOut = impl[`${fnName}Out`] || _noop;
- this._visitInCache[nodeTypeIndex] = func;
- this._visitOutCache[nodeTypeIndex] = funcOut;
- }
-
- if (func !== _noop) {
- const newNode = func.call(impl, node, visitArgs);
- if (node && impl.isReplacing) {
- node = newNode;
- }
- }
-
- if (visitArgs.visitDeeper && node) {
- if (node.length) {
- for (let i = 0, cnt = node.length; i < cnt; i++) {
- if (node[i].accept) {
- node[i].accept(this);
- }
- }
- } else if (node.accept) {
- node.accept(this);
- }
- }
-
- if (funcOut != _noop) {
- funcOut.call(impl, node);
- }
-
- return node;
- }
-
- visitArray(nodes, nonReplacing) {
- if (!nodes) {
- return nodes;
- }
-
- const cnt = nodes.length;
- let i;
-
- // Non-replacing
- if (nonReplacing || !this._implementation.isReplacing) {
- for (i = 0; i < cnt; i++) {
- this.visit(nodes[i]);
- }
- return nodes;
- }
-
- // Replacing
- const out = [];
- for (i = 0; i < cnt; i++) {
- const evald = this.visit(nodes[i]);
- if (evald === undefined) { continue; }
- if (!evald.splice) {
- out.push(evald);
- } else if (evald.length) {
- this.flatten(evald, out);
- }
- }
- return out;
- }
-
- flatten(arr, out) {
- if (!out) {
- out = [];
- }
-
- let cnt, i, item, nestedCnt, j, nestedItem;
-
- for (i = 0, cnt = arr.length; i < cnt; i++) {
- item = arr[i];
- if (item === undefined) {
- continue;
- }
- if (!item.splice) {
- out.push(item);
- continue;
- }
-
- for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {
- nestedItem = item[j];
- if (nestedItem === undefined) {
- continue;
- }
- if (!nestedItem.splice) {
- out.push(nestedItem);
- } else if (nestedItem.length) {
- this.flatten(nestedItem, out);
- }
- }
- }
-
- return out;
- }
- }
-
- const contexts = {};
-
- const copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {
- if (!original) { return; }
-
- for (let i = 0; i < propertiesToCopy.length; i++) {
- if (Object.prototype.hasOwnProperty.call(original, propertiesToCopy[i])) {
- destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];
- }
- }
- };
-
- /*
- parse is used whilst parsing
- */
- const parseCopyProperties = [
- // options
- 'paths', // option - unmodified - paths to search for imports on
- 'rewriteUrls', // option - whether to adjust URL's to be relative
- 'rootpath', // option - rootpath to append to URL's
- 'strictImports', // option -
- 'insecure', // option - whether to allow imports from insecure ssl hosts
- 'dumpLineNumbers', // option - @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead. All modes ('comments', 'mediaquery', 'all') will be removed in a future version.
- 'compress', // option - whether to compress
- 'syncImport', // option - whether to import synchronously
- 'mime', // browser only - mime type for sheet import
- 'useFileCache', // browser only - whether to use the per file session cache
- // context
- 'processImports', // option & context - whether to process imports. if false then imports will not be imported.
- // Used by the import manager to stop multiple import visitors being created.
- 'pluginManager', // Used as the plugin manager for the session
- 'quiet', // option - whether to log warnings
- 'quietDeprecations', // option - whether to suppress deprecation warnings only
- ];
-
- contexts.Parse = function(options) {
- copyFromOriginal(options, this, parseCopyProperties);
-
- if (typeof this.paths === 'string') { this.paths = [this.paths]; }
- };
-
- const evalCopyProperties = [
- 'paths', // additional include paths
- 'compress', // whether to compress
- 'math', // whether math has to be within parenthesis
- 'strictUnits', // whether units need to evaluate correctly
- 'sourceMap', // whether to output a source map
- 'importMultiple', // whether we are currently importing multiple copies
- 'urlArgs', // whether to add args into url tokens
- 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false
- 'pluginManager', // Used as the plugin manager for the session
- 'importantScope', // used to bubble up !important statements
- 'rewriteUrls' // option - whether to adjust URL's to be relative
- ];
-
- contexts.Eval = function(options, frames) {
- copyFromOriginal(options, this, evalCopyProperties);
-
- if (typeof this.paths === 'string') { this.paths = [this.paths]; }
-
- this.frames = frames || [];
- this.importantScope = this.importantScope || [];
- };
-
- contexts.Eval.prototype.enterCalc = function () {
- if (!this.calcStack) {
- this.calcStack = [];
- }
- this.calcStack.push(true);
- this.inCalc = true;
- };
-
- contexts.Eval.prototype.exitCalc = function () {
- this.calcStack.pop();
- if (!this.calcStack.length) {
- this.inCalc = false;
- }
- };
-
- contexts.Eval.prototype.inParenthesis = function () {
- if (!this.parensStack) {
- this.parensStack = [];
- }
- this.parensStack.push(true);
- };
-
- contexts.Eval.prototype.outOfParenthesis = function () {
- this.parensStack.pop();
- };
-
- contexts.Eval.prototype.inCalc = false;
- contexts.Eval.prototype.mathOn = true;
- contexts.Eval.prototype.isMathOn = function (op) {
- if (!this.mathOn) {
- return false;
- }
- if (op === '/' && this.math !== Math$1.ALWAYS && (!this.parensStack || !this.parensStack.length)) {
- return false;
- }
- if (this.math > Math$1.PARENS_DIVISION) {
- return this.parensStack && this.parensStack.length;
- }
- return true;
- };
-
- contexts.Eval.prototype.pathRequiresRewrite = function (path) {
- const isRelative = this.rewriteUrls === RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;
-
- return isRelative(path);
- };
-
- contexts.Eval.prototype.rewritePath = function (path, rootpath) {
- let newPath;
-
- rootpath = rootpath || '';
- newPath = this.normalizePath(rootpath + path);
-
- // If a path was explicit relative and the rootpath was not an absolute path
- // we must ensure that the new path is also explicit relative.
- if (isPathLocalRelative(path) &&
- isPathRelative(rootpath) &&
- isPathLocalRelative(newPath) === false) {
- newPath = `./${newPath}`;
- }
-
- return newPath;
- };
-
- contexts.Eval.prototype.normalizePath = function (path) {
- const segments = path.split('/').reverse();
- let segment;
-
- path = [];
- while (segments.length !== 0) {
- segment = segments.pop();
- switch ( segment ) {
- case '.':
- break;
- case '..':
- if ((path.length === 0) || (path[path.length - 1] === '..')) {
- path.push( segment );
- } else {
- path.pop();
- }
- break;
- default:
- path.push(segment);
- break;
- }
- }
-
- return path.join('/');
- };
-
- function isPathRelative(path) {
- return !/^(?:[a-z-]+:|\/|#)/i.test(path);
- }
-
- function isPathLocalRelative(path) {
- return path.charAt(0) === '.';
- }
-
- // todo - do the same for the toCSS ?
-
- class ImportSequencer {
- constructor(onSequencerEmpty) {
- this.imports = [];
- this.variableImports = [];
- this._onSequencerEmpty = onSequencerEmpty;
- this._currentDepth = 0;
- }
-
- addImport(callback) {
- const importSequencer = this,
- importItem = {
- callback,
- args: null,
- isReady: false
- };
- this.imports.push(importItem);
- return function() {
- importItem.args = Array.prototype.slice.call(arguments, 0);
- importItem.isReady = true;
- importSequencer.tryRun();
- };
- }
-
- addVariableImport(callback) {
- this.variableImports.push(callback);
- }
-
- tryRun() {
- this._currentDepth++;
- try {
- while (true) {
- while (this.imports.length > 0) {
- const importItem = this.imports[0];
- if (!importItem.isReady) {
- return;
- }
- this.imports = this.imports.slice(1);
- importItem.callback.apply(null, importItem.args);
- }
- if (this.variableImports.length === 0) {
- break;
- }
- const variableImport = this.variableImports[0];
- this.variableImports = this.variableImports.slice(1);
- variableImport();
- }
- } finally {
- this._currentDepth--;
- }
- if (this._currentDepth === 0 && this._onSequencerEmpty) {
- this._onSequencerEmpty();
- }
- }
- }
-
- /* eslint-disable no-unused-vars */
-
- const ImportVisitor = function(importer, finish) {
-
- this._visitor = new Visitor(this);
- this._importer = importer;
- this._finish = finish;
- this.context = new contexts.Eval();
- this.importCount = 0;
- this.onceFileDetectionMap = {};
- this.recursionDetector = {};
- this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));
- };
-
- ImportVisitor.prototype = {
- isReplacing: false,
- run: function (root) {
- try {
- // process the contents
- this._visitor.visit(root);
- }
- catch (e) {
- this.error = e;
- }
-
- this.isFinished = true;
- this._sequencer.tryRun();
- },
- _onSequencerEmpty: function() {
- if (!this.isFinished) {
- return;
- }
- this._finish(this.error);
- },
- visitImport: function (importNode, visitArgs) {
- const inlineCSS = importNode.options.inline;
-
- if (!importNode.css || inlineCSS) {
-
- const context = new contexts.Eval(this.context, copyArray(this.context.frames));
- const importParent = context.frames[0];
-
- this.importCount++;
- if (importNode.isVariableImport()) {
- this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));
- } else {
- this.processImportNode(importNode, context, importParent);
- }
- }
- visitArgs.visitDeeper = false;
- },
- processImportNode: function(importNode, context, importParent) {
- let evaldImportNode;
- const inlineCSS = importNode.options.inline;
-
- try {
- evaldImportNode = importNode.evalForImport(context);
- } catch (e) {
- if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }
- // attempt to eval properly and treat as css
- importNode.css = true;
- // if that fails, this error will be thrown
- importNode.error = e;
- }
-
- if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {
-
- if (evaldImportNode.options.multiple) {
- context.importMultiple = true;
- }
-
- // try appending if we haven't determined if it is css or not
- const tryAppendLessExtension = evaldImportNode.css === undefined;
-
- for (let i = 0; i < importParent.rules.length; i++) {
- if (importParent.rules[i] === importNode) {
- importParent.rules[i] = evaldImportNode;
- break;
- }
- }
-
- const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);
-
- this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),
- evaldImportNode.options, sequencedOnImported);
- } else {
- this.importCount--;
- if (this.isFinished) {
- this._sequencer.tryRun();
- }
- }
- },
- onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {
- if (e) {
- if (!e.filename) {
- e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;
- }
- this.error = e;
- }
-
- const importVisitor = this,
- inlineCSS = importNode.options.inline,
- isPlugin = importNode.options.isPlugin,
- isOptional = importNode.options.optional,
- duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;
-
- if (!context.importMultiple) {
- if (duplicateImport) {
- importNode.skip = true;
- } else {
- importNode.skip = function() {
- if (fullPath in importVisitor.onceFileDetectionMap) {
- return true;
- }
- importVisitor.onceFileDetectionMap[fullPath] = true;
- return false;
- };
- }
- }
-
- if (!fullPath && isOptional) {
- importNode.skip = true;
- }
-
- if (root) {
- importNode.root = root;
- importNode.importedFilename = fullPath;
-
- if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {
- importVisitor.recursionDetector[fullPath] = true;
-
- const oldContext = this.context;
- this.context = context;
- try {
- this._visitor.visit(root);
- } catch (e) {
- this.error = e;
- }
- this.context = oldContext;
- }
- }
-
- importVisitor.importCount--;
-
- if (importVisitor.isFinished) {
- importVisitor._sequencer.tryRun();
- }
- },
- visitDeclaration: function (declNode, visitArgs) {
- if (declNode.value.type === 'DetachedRuleset') {
- this.context.frames.unshift(declNode);
- } else {
- visitArgs.visitDeeper = false;
- }
- },
- visitDeclarationOut: function(declNode) {
- if (declNode.value.type === 'DetachedRuleset') {
- this.context.frames.shift();
- }
- },
- visitAtRule: function (atRuleNode, visitArgs) {
- if (atRuleNode.value) {
- this.context.frames.unshift(atRuleNode);
- } else if (atRuleNode.declarations && atRuleNode.declarations.length) {
- if (atRuleNode.isRooted) {
- this.context.frames.unshift(atRuleNode);
- } else {
- this.context.frames.unshift(atRuleNode.declarations[0]);
- }
- } else if (atRuleNode.rules && atRuleNode.rules.length) {
- this.context.frames.unshift(atRuleNode);
- }
- },
- visitAtRuleOut: function (atRuleNode) {
- this.context.frames.shift();
- },
- visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {
- this.context.frames.unshift(mixinDefinitionNode);
- },
- visitMixinDefinitionOut: function (mixinDefinitionNode) {
- this.context.frames.shift();
- },
- visitRuleset: function (rulesetNode, visitArgs) {
- this.context.frames.unshift(rulesetNode);
- },
- visitRulesetOut: function (rulesetNode) {
- this.context.frames.shift();
- },
- visitMedia: function (mediaNode, visitArgs) {
- this.context.frames.unshift(mediaNode.rules[0]);
- },
- visitMediaOut: function (mediaNode) {
- this.context.frames.shift();
- }
- };
-
- class SetTreeVisibilityVisitor {
- constructor(visible) {
- this.visible = visible;
- }
-
- run(root) {
- this.visit(root);
- }
-
- visitArray(nodes) {
- if (!nodes) {
- return nodes;
- }
-
- const cnt = nodes.length;
- let i;
- for (i = 0; i < cnt; i++) {
- this.visit(nodes[i]);
- }
- return nodes;
- }
-
- visit(node) {
- if (!node) {
- return node;
- }
- if (node.constructor === Array) {
- return this.visitArray(node);
- }
-
- if (!node.blocksVisibility || node.blocksVisibility()) {
- return node;
- }
- if (this.visible) {
- node.ensureVisibility();
- } else {
- node.ensureInvisibility();
- }
-
- node.accept(this);
- return node;
- }
- }
-
- /* eslint-disable no-unused-vars */
-
- /* jshint loopfunc:true */
-
- class ExtendFinderVisitor {
- constructor() {
- this._visitor = new Visitor(this);
- this.contexts = [];
- this.allExtendsStack = [[]];
- }
-
- run(root) {
- root = this._visitor.visit(root);
- root.allExtends = this.allExtendsStack[0];
- return root;
- }
-
- visitDeclaration(declNode, visitArgs) {
- visitArgs.visitDeeper = false;
- }
-
- visitMixinDefinition(mixinDefinitionNode, visitArgs) {
- visitArgs.visitDeeper = false;
- }
-
- visitRuleset(rulesetNode, visitArgs) {
- if (rulesetNode.root) {
- return;
- }
-
- let i;
- let j;
- let extend;
- const allSelectorsExtendList = [];
- let extendList;
-
- // get &:extend(.a); rules which apply to all selectors in this ruleset
- const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;
- for (i = 0; i < ruleCnt; i++) {
- if (rulesetNode.rules[i] instanceof tree.Extend) {
- allSelectorsExtendList.push(rules[i]);
- rulesetNode.extendOnEveryPath = true;
- }
- }
-
- // now find every selector and apply the extends that apply to all extends
- // and the ones which apply to an individual extend
- const paths = rulesetNode.paths;
- for (i = 0; i < paths.length; i++) {
- const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;
-
- extendList = selExtendList ? copyArray(selExtendList).concat(allSelectorsExtendList)
- : allSelectorsExtendList;
-
- if (extendList) {
- extendList = extendList.map(function(allSelectorsExtend) {
- return allSelectorsExtend.clone();
- });
- }
-
- for (j = 0; j < extendList.length; j++) {
- this.foundExtends = true;
- extend = extendList[j];
- extend.findSelfSelectors(selectorPath);
- extend.ruleset = rulesetNode;
- if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }
- this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);
- }
- }
-
- this.contexts.push(rulesetNode.selectors);
- }
-
- visitRulesetOut(rulesetNode) {
- if (!rulesetNode.root) {
- this.contexts.length = this.contexts.length - 1;
- }
- }
-
- visitMedia(mediaNode, visitArgs) {
- mediaNode.allExtends = [];
- this.allExtendsStack.push(mediaNode.allExtends);
- }
-
- visitMediaOut(mediaNode) {
- this.allExtendsStack.length = this.allExtendsStack.length - 1;
- }
-
- visitAtRule(atRuleNode, visitArgs) {
- atRuleNode.allExtends = [];
- this.allExtendsStack.push(atRuleNode.allExtends);
- }
-
- visitAtRuleOut(atRuleNode) {
- this.allExtendsStack.length = this.allExtendsStack.length - 1;
- }
- }
-
- class ProcessExtendsVisitor {
- constructor() {
- this._visitor = new Visitor(this);
- }
-
- run(root) {
- const extendFinder = new ExtendFinderVisitor();
- this.extendIndices = {};
- extendFinder.run(root);
- if (!extendFinder.foundExtends) { return root; }
- root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));
- this.allExtendsStack = [root.allExtends];
- const newRoot = this._visitor.visit(root);
- this.checkExtendsForNonMatched(root.allExtends);
- return newRoot;
- }
-
- checkExtendsForNonMatched(extendList) {
- const indices = this.extendIndices;
- extendList.filter(function(extend) {
- return !extend.hasFoundMatches && extend.parent_ids.length == 1;
- }).forEach(function(extend) {
- let selector = '_unknown_';
- try {
- selector = extend.selector.toCSS({});
- }
- catch (_) {}
-
- if (!indices[`${extend.index} ${selector}`]) {
- indices[`${extend.index} ${selector}`] = true;
- /**
- * @todo Shouldn't this be an error? To alert the developer
- * that they may have made an error in the selector they are
- * targeting?
- */
- logger$1.warn(`WARNING: extend '${selector}' has no matches`);
- }
- });
- }
-
- doExtendChaining(extendsList, extendsListTarget, iterationCount) {
- //
- // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering
- // and pasting the selector we would do normally, but we are also adding an extend with the same target selector
- // this means this new extend can then go and alter other extends
- //
- // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors
- // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already
- // processed if we look at each selector at a time, as is done in visitRuleset
-
- let extendIndex;
-
- let targetExtendIndex;
- let matches;
- const extendsToAdd = [];
- let newSelector;
- const extendVisitor = this;
- let selectorPath;
- let extend;
- let targetExtend;
- let newExtend;
-
- iterationCount = iterationCount || 0;
-
- // loop through comparing every extend with every target extend.
- // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place
- // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one
- // and the second is the target.
- // the separation into two lists allows us to process a subset of chains with a bigger set, as is the
- // case when processing media queries
- for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {
- for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {
-
- extend = extendsList[extendIndex];
- targetExtend = extendsListTarget[targetExtendIndex];
-
- // look for circular references
- if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }
-
- // find a match in the target extends self selector (the bit before :extend)
- selectorPath = [targetExtend.selfSelectors[0]];
- matches = extendVisitor.findMatch(extend, selectorPath);
-
- if (matches.length) {
- extend.hasFoundMatches = true;
-
- // we found a match, so for each self selector..
- extend.selfSelectors.forEach(function(selfSelector) {
- const info = targetExtend.visibilityInfo();
-
- // process the extend as usual
- newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());
-
- // but now we create a new extend from it
- newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);
- newExtend.selfSelectors = newSelector;
-
- // add the extend onto the list of extends for that selector
- newSelector[newSelector.length - 1].extendList = [newExtend];
-
- // record that we need to add it.
- extendsToAdd.push(newExtend);
- newExtend.ruleset = targetExtend.ruleset;
-
- // remember its parents for circular references
- newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);
-
- // only process the selector once.. if we have :extend(.a,.b) then multiple
- // extends will look at the same selector path, so when extending
- // we know that any others will be duplicates in terms of what is added to the css
- if (targetExtend.firstExtendOnThisSelectorPath) {
- newExtend.firstExtendOnThisSelectorPath = true;
- targetExtend.ruleset.paths.push(newSelector);
- }
- });
- }
- }
- }
-
- if (extendsToAdd.length) {
- // try to detect circular references to stop a stack overflow.
- // may no longer be needed.
- this.extendChainCount++;
- if (iterationCount > 100) {
- let selectorOne = '{unable to calculate}';
- let selectorTwo = '{unable to calculate}';
- try {
- selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();
- selectorTwo = extendsToAdd[0].selector.toCSS();
- }
- catch (e) {}
- throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};
- }
-
- // now process the new extends on the existing rules so that we can handle a extending b extending c extending
- // d extending e...
- return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));
- } else {
- return extendsToAdd;
- }
- }
-
- visitDeclaration(ruleNode, visitArgs) {
- visitArgs.visitDeeper = false;
- }
-
- visitMixinDefinition(mixinDefinitionNode, visitArgs) {
- visitArgs.visitDeeper = false;
- }
-
- visitSelector(selectorNode, visitArgs) {
- visitArgs.visitDeeper = false;
- }
-
- visitRuleset(rulesetNode, visitArgs) {
- if (rulesetNode.root) {
- return;
- }
- let matches;
- const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];
- const selectorsToAdd = [];
- const paths = rulesetNode.paths;
- const pathCount = paths.length;
-
- // look at each selector path in the ruleset, find any extend matches and then copy, find and replace
-
- for (let extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {
- const extend = allExtends[extendIndex];
- for (let pathIndex = 0; pathIndex < pathCount; pathIndex++) {
- const selectorPath = paths[pathIndex];
-
- // extending extends happens initially, before the main pass
- if (rulesetNode.extendOnEveryPath) { continue; }
- const extendList = selectorPath[selectorPath.length - 1].extendList;
- if (extendList && extendList.length) { continue; }
-
- matches = this.findMatch(extend, selectorPath);
-
- if (matches.length) {
- extend.hasFoundMatches = true;
-
- const selfSelectors = extend.selfSelectors;
- const isVisible = extend.isVisible();
- for (let si = 0; si < selfSelectors.length; si++) {
- selectorsToAdd.push(this.extendSelector(matches, selectorPath, selfSelectors[si], isVisible));
- }
- }
- }
- }
- rulesetNode.paths = paths.concat(selectorsToAdd);
- }
-
- findMatch(extend, haystackSelectorPath) {
- //
- // look through the haystack selector path to try and find the needle - extend.selector
- // returns an array of selector matches that can then be replaced
- //
- let haystackSelectorIndex;
-
- let hackstackSelector;
- let hackstackElementIndex;
- let haystackElement;
- let targetCombinator;
- let i;
- const needleElements = extend.selector.elements;
- const potentialMatches = [];
- let potentialMatch;
- const matches = [];
-
- // loop through the haystack elements
- for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {
- hackstackSelector = haystackSelectorPath[haystackSelectorIndex];
-
- for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {
-
- haystackElement = hackstackSelector.elements[hackstackElementIndex];
-
- // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.
- if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {
- potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,
- initialCombinator: haystackElement.combinator});
- }
-
- for (i = 0; i < potentialMatches.length; i++) {
- potentialMatch = potentialMatches[i];
-
- // selectors add " " onto the first element. When we use & it joins the selectors together, but if we don't
- // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to
- // work out what the resulting combinator will be
- targetCombinator = haystackElement.combinator.value;
- if (targetCombinator === '' && hackstackElementIndex === 0) {
- targetCombinator = ' ';
- }
-
- // if we don't match, null our match to indicate failure
- if (!this.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||
- (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {
- potentialMatch = null;
- } else {
- potentialMatch.matched++;
- }
-
- // if we are still valid and have finished, test whether we have elements after and whether these are allowed
- if (potentialMatch) {
- potentialMatch.finished = potentialMatch.matched === needleElements.length;
- if (potentialMatch.finished &&
- (!extend.allowAfter &&
- (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {
- potentialMatch = null;
- }
- }
- // if null we remove, if not, we are still valid, so either push as a valid match or continue
- if (potentialMatch) {
- if (potentialMatch.finished) {
- potentialMatch.length = needleElements.length;
- potentialMatch.endPathIndex = haystackSelectorIndex;
- potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match
- potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again
- matches.push(potentialMatch);
- }
- } else {
- potentialMatches.splice(i, 1);
- i--;
- }
- }
- }
- }
- return matches;
- }
-
- isElementValuesEqual(elementValue1, elementValue2) {
- if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {
- return elementValue1 === elementValue2;
- }
- if (elementValue1 instanceof tree.Attribute) {
- if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {
- return false;
- }
- if (!elementValue1.value || !elementValue2.value) {
- if (elementValue1.value || elementValue2.value) {
- return false;
- }
- return true;
- }
- elementValue1 = elementValue1.value.value || elementValue1.value;
- elementValue2 = elementValue2.value.value || elementValue2.value;
- return elementValue1 === elementValue2;
- }
- elementValue1 = elementValue1.value;
- elementValue2 = elementValue2.value;
- if (elementValue1 instanceof tree.Selector) {
- if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {
- return false;
- }
- for (let i = 0; i < elementValue1.elements.length; i++) {
- if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {
- if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {
- return false;
- }
- }
- if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {
- return false;
- }
- }
- return true;
- }
- return false;
- }
-
- extendSelector(matches, selectorPath, replacementSelector, isVisible) {
-
- // for a set of matches, replace each match with the replacement selector
-
- let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;
-
- for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {
- match = matches[matchIndex];
- selector = selectorPath[match.pathIndex];
- firstElement = new tree.Element(
- match.initialCombinator,
- replacementSelector.elements[0].value,
- replacementSelector.elements[0].isVariable,
- replacementSelector.elements[0].getIndex(),
- replacementSelector.elements[0].fileInfo()
- );
-
- if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {
- path[path.length - 1].elements = path[path.length - 1]
- .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));
- currentSelectorPathElementIndex = 0;
- currentSelectorPathIndex++;
- }
-
- newElements = selector.elements
- .slice(currentSelectorPathElementIndex, match.index)
- .concat([firstElement])
- .concat(replacementSelector.elements.slice(1));
-
- if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {
- path[path.length - 1].elements =
- path[path.length - 1].elements.concat(newElements);
- } else {
- path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));
-
- path.push(new tree.Selector(
- newElements
- ));
- }
- currentSelectorPathIndex = match.endPathIndex;
- currentSelectorPathElementIndex = match.endPathElementIndex;
- if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {
- currentSelectorPathElementIndex = 0;
- currentSelectorPathIndex++;
- }
- }
-
- if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {
- path[path.length - 1].elements = path[path.length - 1]
- .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));
- currentSelectorPathIndex++;
- }
-
- path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));
- path = path.map(function (currentValue) {
- // we can re-use elements here, because the visibility property matters only for selectors
- const derived = currentValue.createDerived(currentValue.elements);
- if (isVisible) {
- derived.ensureVisibility();
- } else {
- derived.ensureInvisibility();
- }
- return derived;
- });
- return path;
- }
-
- visitMedia(mediaNode, visitArgs) {
- let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);
- newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));
- this.allExtendsStack.push(newAllExtends);
- }
-
- visitMediaOut(mediaNode) {
- const lastIndex = this.allExtendsStack.length - 1;
- this.allExtendsStack.length = lastIndex;
- }
-
- visitAtRule(atRuleNode, visitArgs) {
- let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);
- newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));
- this.allExtendsStack.push(newAllExtends);
- }
-
- visitAtRuleOut(atRuleNode) {
- const lastIndex = this.allExtendsStack.length - 1;
- this.allExtendsStack.length = lastIndex;
- }
- }
-
- /* eslint-disable no-unused-vars */
-
- class JoinSelectorVisitor {
- constructor() {
- this.contexts = [[]];
- this._visitor = new Visitor(this);
- }
-
- run(root) {
- return this._visitor.visit(root);
- }
-
- visitDeclaration(declNode, visitArgs) {
- visitArgs.visitDeeper = false;
- }
-
- visitMixinDefinition(mixinDefinitionNode, visitArgs) {
- visitArgs.visitDeeper = false;
- }
-
- visitRuleset(rulesetNode, visitArgs) {
- const context = this.contexts[this.contexts.length - 1];
- const paths = [];
- let selectors;
-
- this.contexts.push(paths);
-
- if (!rulesetNode.root) {
- selectors = rulesetNode.selectors;
- if (selectors) {
- selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });
- rulesetNode.selectors = selectors.length ? selectors : (selectors = null);
- if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }
- }
- if (!selectors) { rulesetNode.rules = null; }
- rulesetNode.paths = paths;
- }
- }
-
- visitRulesetOut(rulesetNode) {
- this.contexts.length = this.contexts.length - 1;
- }
-
- visitMedia(mediaNode, visitArgs) {
- const context = this.contexts[this.contexts.length - 1];
- mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);
- }
-
- visitAtRule(atRuleNode, visitArgs) {
- const context = this.contexts[this.contexts.length - 1];
-
- if (atRuleNode.declarations && atRuleNode.declarations.length) {
- atRuleNode.declarations[0].root = (context.length === 0 || context[0].multiMedia);
- }
- else if (atRuleNode.rules && atRuleNode.rules.length) {
- atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);
- }
- }
- }
-
- /**
- * @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead.
- * This will be removed in a future version.
- *
- * @param {Object} ctx - Context object with debugInfo
- * @returns {string} Debug info as CSS comment
- */
- function asComment(ctx) {
- return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\n`;
- }
-
- /**
- * @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead.
- * This function generates Sass-compatible debug info using @media -sass-debug-info syntax.
- * This format had short-lived usage and is no longer recommended.
- * This will be removed in a future version.
- *
- * @param {Object} ctx - Context object with debugInfo
- * @returns {string} Sass-compatible debug info as @media query
- */
- function asMediaQuery(ctx) {
- let filenameWithProtocol = ctx.debugInfo.fileName;
- if (!/^[a-z]+:\/\//i.test(filenameWithProtocol)) {
- filenameWithProtocol = `file://${filenameWithProtocol}`;
- }
- return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:/\\])/g, function (a) {
- if (a == '\\') {
- a = '/';
- }
- return `\\${a}`;
- })}}line{font-family:\\00003${ctx.debugInfo.lineNumber}}}\n`;
- }
-
- /**
- * Generates debug information (line numbers) for CSS output.
- *
- * @param {Object} context - Context object with dumpLineNumbers option
- * @param {Object} ctx - Context object with debugInfo
- * @param {string} [lineSeparator] - Separator between comment and media query (for 'all' mode)
- * @returns {string} Debug info string
- *
- * @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead.
- * All modes ('comments', 'mediaquery', 'all') are deprecated and will be removed in a future version.
- * The 'mediaquery' and 'all' modes generate Sass-compatible @media -sass-debug-info output
- * which had short-lived usage and is no longer recommended.
- */
- function debugInfo(context, ctx, lineSeparator) {
- let result = '';
- if (context.dumpLineNumbers && !context.compress) {
- switch (context.dumpLineNumbers) {
- case 'comments':
- result = asComment(ctx);
- break;
- case 'mediaquery':
- result = asMediaQuery(ctx);
- break;
- case 'all':
- result = asComment(ctx) + (lineSeparator || '') + asMediaQuery(ctx);
- break;
- }
- }
- return result;
- }
-
- const Comment = function(value, isLineComment, index, currentFileInfo) {
- this.value = value;
- this.isLineComment = isLineComment;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.allowRoot = true;
- };
-
- Comment.prototype = Object.assign(new Node(), {
- type: 'Comment',
-
- genCSS(context, output) {
- if (this.debugInfo) {
- output.add(debugInfo(context, this), this.fileInfo(), this.getIndex());
- }
- output.add(this.value);
- },
-
- isSilent(context) {
- const isCompressed = context.compress && this.value[2] !== '!';
- return this.isLineComment || isCompressed;
- }
- });
-
- const Unit = function(numerator, denominator, backupUnit) {
- this.numerator = numerator ? copyArray(numerator).sort() : [];
- this.denominator = denominator ? copyArray(denominator).sort() : [];
- if (backupUnit) {
- this.backupUnit = backupUnit;
- } else if (numerator && numerator.length) {
- this.backupUnit = numerator[0];
- }
- };
-
- Unit.prototype = Object.assign(new Node(), {
- type: 'Unit',
-
- clone() {
- return new Unit(copyArray(this.numerator), copyArray(this.denominator), this.backupUnit);
- },
-
- genCSS(context, output) {
- // Dimension checks the unit is singular and throws an error if in strict math mode.
- const strictUnits = context && context.strictUnits;
- if (this.numerator.length === 1) {
- output.add(this.numerator[0]); // the ideal situation
- } else if (!strictUnits && this.backupUnit) {
- output.add(this.backupUnit);
- } else if (!strictUnits && this.denominator.length) {
- output.add(this.denominator[0]);
- }
- },
-
- toString() {
- let i, returnStr = this.numerator.join('*');
- for (i = 0; i < this.denominator.length; i++) {
- returnStr += `/${this.denominator[i]}`;
- }
- return returnStr;
- },
-
- compare(other) {
- return this.is(other.toString()) ? 0 : undefined;
- },
-
- is(unitString) {
- return this.toString().toUpperCase() === unitString.toUpperCase();
- },
-
- isLength() {
- return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());
- },
-
- isEmpty() {
- return this.numerator.length === 0 && this.denominator.length === 0;
- },
-
- isSingular() {
- return this.numerator.length <= 1 && this.denominator.length === 0;
- },
-
- map(callback) {
- let i;
-
- for (i = 0; i < this.numerator.length; i++) {
- this.numerator[i] = callback(this.numerator[i], false);
- }
-
- for (i = 0; i < this.denominator.length; i++) {
- this.denominator[i] = callback(this.denominator[i], true);
- }
- },
-
- usedUnits() {
- let group;
- const result = {};
- let mapUnit;
- let groupName;
-
- mapUnit = function (atomicUnit) {
- // eslint-disable-next-line no-prototype-builtins
- if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {
- result[groupName] = atomicUnit;
- }
-
- return atomicUnit;
- };
-
- for (groupName in unitConversions) {
- // eslint-disable-next-line no-prototype-builtins
- if (unitConversions.hasOwnProperty(groupName)) {
- group = unitConversions[groupName];
-
- this.map(mapUnit);
- }
- }
-
- return result;
- },
-
- cancel() {
- const counter = {};
- let atomicUnit;
- let i;
-
- for (i = 0; i < this.numerator.length; i++) {
- atomicUnit = this.numerator[i];
- counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;
- }
-
- for (i = 0; i < this.denominator.length; i++) {
- atomicUnit = this.denominator[i];
- counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;
- }
-
- this.numerator = [];
- this.denominator = [];
-
- for (atomicUnit in counter) {
- // eslint-disable-next-line no-prototype-builtins
- if (counter.hasOwnProperty(atomicUnit)) {
- const count = counter[atomicUnit];
-
- if (count > 0) {
- for (i = 0; i < count; i++) {
- this.numerator.push(atomicUnit);
- }
- } else if (count < 0) {
- for (i = 0; i < -count; i++) {
- this.denominator.push(atomicUnit);
- }
- }
- }
- }
-
- this.numerator.sort();
- this.denominator.sort();
- }
- });
-
- /* eslint-disable no-prototype-builtins */
-
- //
- // A number with a unit
- //
- const Dimension = function(value, unit) {
- this.value = parseFloat(value);
- if (isNaN(this.value)) {
- throw new Error('Dimension is not a number.');
- }
- this.unit = (unit && unit instanceof Unit) ? unit :
- new Unit(unit ? [unit] : undefined);
- this.setParent(this.unit, this);
- };
-
- Dimension.prototype = Object.assign(new Node(), {
- type: 'Dimension',
-
- accept(visitor) {
- this.unit = visitor.visit(this.unit);
- },
-
- // remove when Nodes have JSDoc types
- // eslint-disable-next-line no-unused-vars
- eval(context) {
- return this;
- },
-
- toColor() {
- return new Color([this.value, this.value, this.value]);
- },
-
- genCSS(context, output) {
- if ((context && context.strictUnits) && !this.unit.isSingular()) {
- throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);
- }
-
- const value = this.fround(context, this.value);
- let strValue = String(value);
-
- if (value !== 0 && value < 0.000001 && value > -0.000001) {
- // would be output 1e-6 etc.
- strValue = value.toFixed(20).replace(/0+$/, '');
- }
-
- if (context && context.compress) {
- // Zero values doesn't need a unit
- if (value === 0 && this.unit.isLength()) {
- output.add(strValue);
- return;
- }
-
- // Float values doesn't need a leading zero
- if (value > 0 && value < 1) {
- strValue = (strValue).slice(1);
- }
- }
-
- output.add(strValue);
- this.unit.genCSS(context, output);
- },
-
- // In an operation between two Dimensions,
- // we default to the first Dimension's unit,
- // so `1px + 2` will yield `3px`.
- operate(context, op, other) {
- /* jshint noempty:false */
- let value = this._operate(context, op, this.value, other.value);
- let unit = this.unit.clone();
-
- if (op === '+' || op === '-') {
- if (unit.numerator.length === 0 && unit.denominator.length === 0) {
- unit = other.unit.clone();
- if (this.unit.backupUnit) {
- unit.backupUnit = this.unit.backupUnit;
- }
- } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) ; else {
- other = other.convertTo(this.unit.usedUnits());
-
- if (context.strictUnits && other.unit.toString() !== unit.toString()) {
- throw new Error('Incompatible units. Change the units or use the unit function. '
- + `Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);
- }
-
- value = this._operate(context, op, this.value, other.value);
- }
- } else if (op === '*') {
- unit.numerator = unit.numerator.concat(other.unit.numerator).sort();
- unit.denominator = unit.denominator.concat(other.unit.denominator).sort();
- unit.cancel();
- } else if (op === '/') {
- unit.numerator = unit.numerator.concat(other.unit.denominator).sort();
- unit.denominator = unit.denominator.concat(other.unit.numerator).sort();
- unit.cancel();
- }
- return new Dimension(value, unit);
- },
-
- compare(other) {
- let a, b;
-
- if (!(other instanceof Dimension)) {
- return undefined;
- }
-
- if (this.unit.isEmpty() || other.unit.isEmpty()) {
- a = this;
- b = other;
- } else {
- a = this.unify();
- b = other.unify();
- if (a.unit.compare(b.unit) !== 0) {
- return undefined;
- }
- }
-
- return Node.numericCompare(a.value, b.value);
- },
-
- unify() {
- return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });
- },
-
- convertTo(conversions) {
- let value = this.value;
- const unit = this.unit.clone();
- let i;
- let groupName;
- let group;
- let targetUnit;
- let derivedConversions = {};
- let applyUnit;
-
- if (typeof conversions === 'string') {
- for (i in unitConversions) {
- if (unitConversions[i].hasOwnProperty(conversions)) {
- derivedConversions = {};
- derivedConversions[i] = conversions;
- }
- }
- conversions = derivedConversions;
- }
- applyUnit = function (atomicUnit, denominator) {
- if (group.hasOwnProperty(atomicUnit)) {
- if (denominator) {
- value = value / (group[atomicUnit] / group[targetUnit]);
- } else {
- value = value * (group[atomicUnit] / group[targetUnit]);
- }
-
- return targetUnit;
- }
-
- return atomicUnit;
- };
-
- for (groupName in conversions) {
- if (conversions.hasOwnProperty(groupName)) {
- targetUnit = conversions[groupName];
- group = unitConversions[groupName];
-
- unit.map(applyUnit);
- }
- }
-
- unit.cancel();
-
- return new Dimension(value, unit);
- }
- });
-
- const Anonymous = function(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {
- this.value = value;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.mapLines = mapLines;
- this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;
- this.allowRoot = true;
- this.copyVisibilityInfo(visibilityInfo);
- };
-
- Anonymous.prototype = Object.assign(new Node(), {
- type: 'Anonymous',
- eval() {
- return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());
- },
- compare(other) {
- return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;
- },
- isRulesetLike() {
- return this.rulesetLike;
- },
- genCSS(context, output) {
- this.nodeVisible = Boolean(this.value);
- if (this.nodeVisible) {
- output.add(this.value, this._fileInfo, this._index, this.mapLines);
- }
- }
- });
-
- const Expression = function(value, noSpacing) {
- this.value = value;
- this.noSpacing = noSpacing;
- if (!value) {
- throw new Error('Expression requires an array parameter');
- }
- };
-
- Expression.prototype = Object.assign(new Node(), {
- type: 'Expression',
-
- accept(visitor) {
- this.value = visitor.visitArray(this.value);
- },
-
- eval(context) {
- const noSpacing = this.noSpacing;
- let returnValue;
- const mathOn = context.isMathOn();
- const inParenthesis = this.parens;
-
- let doubleParen = false;
- if (inParenthesis) {
- context.inParenthesis();
- }
- if (this.value.length > 1) {
- returnValue = new Expression(this.value.map(function (e) {
- if (!e.eval) {
- return e;
- }
- return e.eval(context);
- }), this.noSpacing);
- } else if (this.value.length === 1) {
- if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {
- doubleParen = true;
- }
- returnValue = this.value[0].eval(context);
- } else {
- returnValue = this;
- }
- if (inParenthesis) {
- context.outOfParenthesis();
- }
- if (this.parens && this.parensInOp && !mathOn && !doubleParen
- && (!(returnValue instanceof Dimension))) {
- returnValue = new Paren(returnValue);
- }
- returnValue.noSpacing = returnValue.noSpacing || noSpacing;
- return returnValue;
- },
-
- genCSS(context, output) {
- for (let i = 0; i < this.value.length; i++) {
- this.value[i].genCSS(context, output);
- if (!this.noSpacing && i + 1 < this.value.length) {
- if (!(this.value[i + 1] instanceof Anonymous) ||
- this.value[i + 1] instanceof Anonymous && this.value[i + 1].value !== ',') {
- output.add(' ');
- }
- }
- }
- },
-
- throwAwayComments() {
- this.value = this.value.filter(function(v) {
- return !(v instanceof Comment);
- });
- }
- });
-
- const Value = function(value) {
- if (!value) {
- throw new Error('Value requires an array argument');
- }
- if (!Array.isArray(value)) {
- this.value = [ value ];
- }
- else {
- this.value = value;
- }
- };
-
- Value.prototype = Object.assign(new Node(), {
- type: 'Value',
-
- accept(visitor) {
- if (this.value) {
- this.value = visitor.visitArray(this.value);
- }
- },
-
- eval(context) {
- if (this.value.length === 1) {
- return this.value[0].eval(context);
- } else {
- return new Value(this.value.map(function (v) {
- return v.eval(context);
- }));
- }
- },
-
- genCSS(context, output) {
- let i;
- for (i = 0; i < this.value.length; i++) {
- this.value[i].genCSS(context, output);
- if (i + 1 < this.value.length) {
- output.add((context && context.compress) ? ',' : ', ');
- }
- }
- }
- });
-
- /**
- * Merges declarations with merge flags (+ or ,) into combined values.
- * Used by both the ToCSSVisitor and AtRule eval.
- */
- function mergeRules(rules) {
- if (!rules) {
- return;
- }
-
- const groups = {};
- const groupsArr = [];
-
- for (let i = 0; i < rules.length; i++) {
- const rule = rules[i];
- if (rule.merge) {
- const key = rule.name;
- groups[key] ? rules.splice(i--, 1) :
- groupsArr.push(groups[key] = []);
- groups[key].push(rule);
- }
- }
-
- groupsArr.forEach(group => {
- if (group.length > 0) {
- const result = group[0];
- let space = [];
- const comma = [new Expression(space)];
- group.forEach(rule => {
- if ((rule.merge === '+') && (space.length > 0)) {
- comma.push(new Expression(space = []));
- }
- space.push(rule.value);
- result.important = result.important || rule.important;
- });
- result.value = new Value(comma);
- }
- });
- }
-
- /* eslint-disable no-unused-vars */
-
- class CSSVisitorUtils {
- constructor(context) {
- this._visitor = new Visitor(this);
- this._context = context;
- }
-
- containsSilentNonBlockedChild(bodyRules) {
- let rule;
- if (!bodyRules) {
- return false;
- }
- for (let r = 0; r < bodyRules.length; r++) {
- rule = bodyRules[r];
- if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {
- // the atrule contains something that was referenced (likely by extend)
- // therefore it needs to be shown in output too
- return true;
- }
- }
- return false;
- }
-
- keepOnlyVisibleChilds(owner) {
- if (owner && owner.rules) {
- owner.rules = owner.rules.filter(thing => thing.isVisible());
- }
- }
-
- isEmpty(owner) {
- return (owner && owner.rules)
- ? (owner.rules.length === 0) : true;
- }
-
- hasVisibleSelector(rulesetNode) {
- return (rulesetNode && rulesetNode.paths)
- ? (rulesetNode.paths.length > 0) : false;
- }
-
- resolveVisibility(node) {
- if (!node.blocksVisibility()) {
- if (this.isEmpty(node)) {
- return ;
- }
-
- return node;
- }
-
- const compiledRulesBody = node.rules[0];
- this.keepOnlyVisibleChilds(compiledRulesBody);
-
- if (this.isEmpty(compiledRulesBody)) {
- return ;
- }
-
- node.ensureVisibility();
- node.removeVisibilityBlock();
-
- return node;
- }
-
- isVisibleRuleset(rulesetNode) {
- if (rulesetNode.firstRoot) {
- return true;
- }
-
- if (this.isEmpty(rulesetNode)) {
- return false;
- }
-
- if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {
- return false;
- }
-
- return true;
- }
- }
-
- const ToCSSVisitor = function(context) {
- this._visitor = new Visitor(this);
- this._context = context;
- this.utils = new CSSVisitorUtils(context);
- };
-
- ToCSSVisitor.prototype = {
- isReplacing: true,
- run: function (root) {
- return this._visitor.visit(root);
- },
-
- visitDeclaration: function (declNode, visitArgs) {
- if (declNode.blocksVisibility() || declNode.variable) {
- return;
- }
- return declNode;
- },
-
- visitMixinDefinition: function (mixinNode, visitArgs) {
- // mixin definitions do not get eval'd - this means they keep state
- // so we have to clear that state here so it isn't used if toCSS is called twice
- mixinNode.frames = [];
- },
-
- visitExtend: function (extendNode, visitArgs) {
- },
-
- visitComment: function (commentNode, visitArgs) {
- if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {
- return;
- }
- return commentNode;
- },
-
- visitMedia: function(mediaNode, visitArgs) {
- const originalRules = mediaNode.rules[0].rules;
- mediaNode.accept(this._visitor);
- visitArgs.visitDeeper = false;
-
- return this.utils.resolveVisibility(mediaNode, originalRules);
- },
-
- visitImport: function (importNode, visitArgs) {
- if (importNode.blocksVisibility()) {
- return ;
- }
- return importNode;
- },
-
- visitAtRule: function(atRuleNode, visitArgs) {
- if (atRuleNode.rules && atRuleNode.rules.length) {
- return this.visitAtRuleWithBody(atRuleNode, visitArgs);
- } else {
- return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);
- }
- },
-
- visitAnonymous: function(anonymousNode, visitArgs) {
- if (!anonymousNode.blocksVisibility()) {
- anonymousNode.accept(this._visitor);
- return anonymousNode;
- }
- },
-
- visitAtRuleWithBody: function(atRuleNode, visitArgs) {
- // if there is only one nested ruleset and that one has no path, then it is
- // just fake ruleset
- function hasFakeRuleset(atRuleNode) {
- const bodyRules = atRuleNode.rules;
- return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);
- }
- function getBodyRules(atRuleNode) {
- const nodeRules = atRuleNode.rules;
- if (hasFakeRuleset(atRuleNode)) {
- return nodeRules[0].rules;
- }
-
- return nodeRules;
- }
- // it is still true that it is only one ruleset in array
- // this is last such moment
- // process childs
- const originalRules = getBodyRules(atRuleNode);
- atRuleNode.accept(this._visitor);
- visitArgs.visitDeeper = false;
-
- if (!this.utils.isEmpty(atRuleNode)) {
- this._mergeRules(atRuleNode.rules[0].rules);
- }
-
- return this.utils.resolveVisibility(atRuleNode, originalRules);
- },
-
- visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {
- if (atRuleNode.blocksVisibility()) {
- return;
- }
-
- if (atRuleNode.name === '@charset') {
- // Only output the debug info together with subsequent @charset definitions
- // a comment (or @media statement) before the actual @charset atrule would
- // be considered illegal css as it has to be on the first line
- if (this.charset) {
- if (atRuleNode.debugInfo) {
- const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\n/g, '')} */\n`);
- comment.debugInfo = atRuleNode.debugInfo;
- return this._visitor.visit(comment);
- }
- return;
- }
- this.charset = true;
- }
-
- return atRuleNode;
- },
-
- checkValidNodes: function(rules, isRoot) {
- if (!rules) {
- return;
- }
-
- for (let i = 0; i < rules.length; i++) {
- const ruleNode = rules[i];
- if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {
- throw { message: 'Properties must be inside selector blocks. They cannot be in the root',
- index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};
- }
- if (ruleNode instanceof tree.Call) {
- throw { message: `Function '${ruleNode.name}' did not return a root node`,
- index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};
- }
- if (ruleNode.type && !ruleNode.allowRoot) {
- throw { message: `${ruleNode.type} node returned by a function is not valid here`,
- index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};
- }
- }
- },
-
- visitRuleset: function (rulesetNode, visitArgs) {
- // at this point rulesets are nested into each other
- let rule;
-
- const rulesets = [];
-
- this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);
-
- if (!rulesetNode.root) {
- // remove invisible paths
- this._compileRulesetPaths(rulesetNode);
-
- // remove rulesets from this ruleset body and compile them separately
- const nodeRules = rulesetNode.rules;
-
- let nodeRuleCnt = nodeRules ? nodeRules.length : 0;
- for (let i = 0; i < nodeRuleCnt; ) {
- rule = nodeRules[i];
- if (rule && rule.rules) {
- // visit because we are moving them out from being a child
- rulesets.push(this._visitor.visit(rule));
- nodeRules.splice(i, 1);
- nodeRuleCnt--;
- continue;
- }
- i++;
- }
- // accept the visitor to remove rules and refactor itself
- // then we can decide nogw whether we want it or not
- // compile body
- if (nodeRuleCnt > 0) {
- rulesetNode.accept(this._visitor);
- } else {
- rulesetNode.rules = null;
- }
- visitArgs.visitDeeper = false;
- } else { // if (! rulesetNode.root) {
- rulesetNode.accept(this._visitor);
- visitArgs.visitDeeper = false;
- }
-
- if (rulesetNode.rules) {
- this._mergeRules(rulesetNode.rules);
- this._removeDuplicateRules(rulesetNode.rules);
- }
-
- // now decide whether we keep the ruleset
- if (this.utils.isVisibleRuleset(rulesetNode)) {
- rulesetNode.ensureVisibility();
- rulesets.splice(0, 0, rulesetNode);
- }
-
- if (rulesets.length === 1) {
- return rulesets[0];
- }
- return rulesets;
- },
-
- _compileRulesetPaths: function(rulesetNode) {
- if (rulesetNode.paths) {
- rulesetNode.paths = rulesetNode.paths
- .filter(p => {
- let i;
- if (p[0].elements[0].combinator.value === ' ') {
- p[0].elements[0].combinator = new(tree.Combinator)('');
- }
- for (i = 0; i < p.length; i++) {
- if (p[i].isVisible() && p[i].getIsOutput()) {
- return true;
- }
- }
- return false;
- });
- }
- },
-
- _removeDuplicateRules: function(rules) {
- if (!rules) { return; }
-
- // remove duplicates
- const ruleCache = {};
-
- for (let i = rules.length - 1; i >= 0 ; i--) {
- let rule = rules[i];
- if (rule instanceof tree.Declaration) {
- if (!Object.prototype.hasOwnProperty.call(ruleCache, rule.name)) {
- ruleCache[rule.name] = rule;
- } else {
- let ruleList = ruleCache[rule.name];
- if (!Array.isArray(ruleList)) {
- const prevRuleCSS = ruleList.toCSS(this._context);
- ruleList = ruleCache[rule.name] = [prevRuleCSS];
- }
- const ruleCSS = rule.toCSS(this._context);
- if (ruleList.indexOf(ruleCSS) !== -1) {
- rules.splice(i, 1);
- } else {
- ruleList.push(ruleCSS);
- }
- }
- }
- }
- },
-
- _mergeRules: mergeRules
- };
-
- var visitors = {
- Visitor,
- ImportVisitor,
- MarkVisibleSelectorsVisitor: SetTreeVisibilityVisitor,
- ExtendVisitor: ProcessExtendsVisitor,
- JoinSelectorVisitor,
- ToCSSVisitor
- };
-
- var getParserInput = () => {
- let // Less input string
- input;
-
- let // current chunk
- j;
-
- const // holds state for backtracking
- saveStack = [];
-
- let // furthest index the parser has gone to
- furthest;
-
- let // if this is furthest we got to, this is the probably cause
- furthestPossibleErrorMessage;
-
- let // chunkified input
- chunks;
-
- let // current chunk
- current;
-
- let // index of current chunk, in `input`
- currentPos;
-
- const parserInput = {};
- const CHARCODE_SPACE = 32;
- const CHARCODE_TAB = 9;
- const CHARCODE_LF = 10;
- const CHARCODE_CR = 13;
- const CHARCODE_PLUS = 43;
- const CHARCODE_COMMA = 44;
- const CHARCODE_FORWARD_SLASH = 47;
- const CHARCODE_9 = 57;
-
- function skipWhitespace(length) {
- const oldi = parserInput.i;
- const oldj = j;
- const curr = parserInput.i - currentPos;
- const endIndex = parserInput.i + current.length - curr;
- const mem = (parserInput.i += length);
- const inp = input;
- let c;
- let nextChar;
- let comment;
-
- for (; parserInput.i < endIndex; parserInput.i++) {
- c = inp.charCodeAt(parserInput.i);
-
- if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {
- nextChar = inp.charAt(parserInput.i + 1);
- if (nextChar === '/') {
- comment = {index: parserInput.i, isLineComment: true};
- let nextNewLine = inp.indexOf('\n', parserInput.i + 2);
- if (nextNewLine < 0) {
- nextNewLine = endIndex;
- }
- parserInput.i = nextNewLine;
- comment.text = inp.slice(comment.index, parserInput.i);
- parserInput.commentStore.push(comment);
- continue;
- } else if (nextChar === '*') {
- const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);
- if (nextStarSlash >= 0) {
- comment = {
- index: parserInput.i,
- text: inp.slice(parserInput.i, nextStarSlash + 2),
- isLineComment: false
- };
- parserInput.i += comment.text.length - 1;
- parserInput.commentStore.push(comment);
- continue;
- }
- }
- break;
- }
-
- if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {
- break;
- }
- }
-
- current = current.slice(length + parserInput.i - mem + curr);
- currentPos = parserInput.i;
-
- if (!current.length) {
- if (j < chunks.length - 1) {
- current = chunks[++j];
- skipWhitespace(0); // skip space at the beginning of a chunk
- return true; // things changed
- }
- parserInput.finished = true;
- }
-
- return oldi !== parserInput.i || oldj !== j;
- }
-
- parserInput.save = () => {
- currentPos = parserInput.i;
- saveStack.push( { current, i: parserInput.i, j });
- };
- parserInput.restore = possibleErrorMessage => {
-
- if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {
- furthest = parserInput.i;
- furthestPossibleErrorMessage = possibleErrorMessage;
- }
- const state = saveStack.pop();
- current = state.current;
- currentPos = parserInput.i = state.i;
- j = state.j;
- };
- parserInput.forget = () => {
- saveStack.pop();
- };
- parserInput.isWhitespace = offset => {
- const pos = parserInput.i + (offset || 0);
- const code = input.charCodeAt(pos);
- return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);
- };
-
- // Specialization of $(tok)
- parserInput.$re = tok => {
- if (parserInput.i > currentPos) {
- current = current.slice(parserInput.i - currentPos);
- currentPos = parserInput.i;
- }
-
- const m = tok.exec(current);
- if (!m) {
- return null;
- }
-
- skipWhitespace(m[0].length);
- if (typeof m === 'string') {
- return m;
- }
-
- return m.length === 1 ? m[0] : m;
- };
-
- parserInput.$char = tok => {
- if (input.charAt(parserInput.i) !== tok) {
- return null;
- }
- skipWhitespace(1);
- return tok;
- };
-
- parserInput.$peekChar = tok => {
- if (input.charAt(parserInput.i) !== tok) {
- return null;
- }
- return tok;
- };
-
- parserInput.$str = tok => {
- const tokLength = tok.length;
-
- // https://jsperf.com/string-startswith/21
- for (let i = 0; i < tokLength; i++) {
- if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {
- return null;
- }
- }
-
- skipWhitespace(tokLength);
- return tok;
- };
-
- parserInput.$quoted = loc => {
- const pos = loc || parserInput.i;
- const startChar = input.charAt(pos);
-
- if (startChar !== '\'' && startChar !== '"') {
- return;
- }
- const length = input.length;
- const currentPosition = pos;
-
- for (let i = 1; i + currentPosition < length; i++) {
- const nextChar = input.charAt(i + currentPosition);
- switch (nextChar) {
- case '\\':
- i++;
- continue;
- case '\r':
- case '\n':
- break;
- case startChar: {
- const str = input.slice(currentPosition, currentPosition + i + 1);
- if (!loc && loc !== 0) {
- skipWhitespace(i + 1);
- return str
- }
- return [startChar, str];
- }
- }
- }
- return null;
- };
-
- /**
- * Permissive parsing. Ignores everything except matching {} [] () and quotes
- * until matching token (outside of blocks)
- */
- parserInput.$parseUntil = tok => {
- let quote = '';
- let returnVal = null;
- let inComment = false;
- let blockDepth = 0;
- const blockStack = [];
- const parseGroups = [];
- const length = input.length;
- const startPos = parserInput.i;
- let lastPos = parserInput.i;
- let i = parserInput.i;
- let loop = true;
- let testChar;
-
- if (typeof tok === 'string') {
- testChar = char => char === tok;
- } else {
- testChar = char => tok.test(char);
- }
-
- do {
- let nextChar = input.charAt(i);
- if (blockDepth === 0 && testChar(nextChar)) {
- returnVal = input.slice(lastPos, i);
- if (returnVal) {
- parseGroups.push(returnVal);
- }
- else {
- parseGroups.push(' ');
- }
- returnVal = parseGroups;
- skipWhitespace(i - startPos);
- loop = false;
- } else {
- if (inComment) {
- if (nextChar === '*' &&
- input.charAt(i + 1) === '/') {
- i++;
- blockDepth--;
- inComment = false;
- }
- i++;
- continue;
- }
- switch (nextChar) {
- case '\\':
- i++;
- nextChar = input.charAt(i);
- parseGroups.push(input.slice(lastPos, i + 1));
- lastPos = i + 1;
- break;
- case '/':
- if (input.charAt(i + 1) === '*') {
- i++;
- inComment = true;
- blockDepth++;
- }
- break;
- case '\'':
- case '"':
- quote = parserInput.$quoted(i);
- if (quote) {
- parseGroups.push(input.slice(lastPos, i), quote);
- i += quote[1].length - 1;
- lastPos = i + 1;
- }
- else {
- skipWhitespace(i - startPos);
- returnVal = nextChar;
- loop = false;
- }
- break;
- case '{':
- blockStack.push('}');
- blockDepth++;
- break;
- case '(':
- blockStack.push(')');
- blockDepth++;
- break;
- case '[':
- blockStack.push(']');
- blockDepth++;
- break;
- case '}':
- case ')':
- case ']': {
- const expected = blockStack.pop();
- if (nextChar === expected) {
- blockDepth--;
- } else {
- // move the parser to the error and return expected
- skipWhitespace(i - startPos);
- returnVal = expected;
- loop = false;
- }
- }
- }
- i++;
- if (i > length) {
- loop = false;
- }
- }
- } while (loop);
-
- return returnVal ? returnVal : null;
- };
-
- parserInput.autoCommentAbsorb = true;
- parserInput.commentStore = [];
- parserInput.finished = false;
-
- // Same as $(), but don't change the state of the parser,
- // just return the match.
- parserInput.peek = tok => {
- if (typeof tok === 'string') {
- // https://jsperf.com/string-startswith/21
- for (let i = 0; i < tok.length; i++) {
- if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {
- return false;
- }
- }
- return true;
- } else {
- return tok.test(current);
- }
- };
-
- // Specialization of peek()
- // TODO remove or change some currentChar calls to peekChar
- parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;
-
- parserInput.currentChar = () => input.charAt(parserInput.i);
-
- parserInput.prevChar = () => input.charAt(parserInput.i - 1);
-
- parserInput.getInput = () => input;
-
- parserInput.peekNotNumeric = () => {
- const c = input.charCodeAt(parserInput.i);
- // Is the first char of the dimension 0-9, '.', '+' or '-'
- return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;
- };
-
- parserInput.start = (str) => {
- input = str;
- parserInput.i = j = currentPos = furthest = 0;
-
- chunks = [str];
- current = chunks[0];
-
- skipWhitespace(0);
- };
-
- parserInput.end = () => {
- let message;
- const isFinished = parserInput.i >= input.length;
-
- if (parserInput.i < furthest) {
- message = furthestPossibleErrorMessage;
- parserInput.i = furthest;
- }
- return {
- isFinished,
- furthest: parserInput.i,
- furthestPossibleErrorMessage: message,
- furthestReachedEnd: parserInput.i >= input.length - 1,
- furthestChar: input[parserInput.i]
- };
- };
-
- return parserInput;
- };
-
- function makeRegistry( base ) {
- return {
- _data: {},
- add: function(name, func) {
- // precautionary case conversion, as later querying of
- // the registry by function-caller uses lower case as well.
- name = name.toLowerCase();
-
- // eslint-disable-next-line no-prototype-builtins
- if (this._data.hasOwnProperty(name)) ;
- this._data[name] = func;
- },
- addMultiple: function(functions) {
- Object.keys(functions).forEach(
- name => {
- this.add(name, functions[name]);
- });
- },
- get: function(name) {
- return this._data[name] || ( base && base.get( name ));
- },
- getLocalFunctions: function() {
- return this._data;
- },
- inherit: function() {
- return makeRegistry( this );
- },
- create: function(base) {
- return makeRegistry(base);
- }
- };
- }
-
- var functionRegistry = makeRegistry( null );
-
- const MediaSyntaxOptions = {
- queryInParens: true
- };
-
- const ContainerSyntaxOptions = {
- queryInParens: true
- };
-
- /**
- * Deprecation registry for Less.js
- *
- * Each deprecation has a unique ID and description.
- * Repetition limiting caps warnings at 5 per deprecation type per parse.
- * Use --quiet-deprecations to suppress all deprecation warnings.
- */
-
- const MAX_REPETITIONS = 5;
-
- class DeprecationHandler {
- constructor() {
- this._counts = {};
- }
-
- shouldWarn(deprecationId) {
- if (!deprecationId) { return true; }
- const count = (this._counts[deprecationId] || 0) + 1;
- this._counts[deprecationId] = count;
- return count <= MAX_REPETITIONS;
- }
-
- summarize(logger) {
- for (const id of Object.keys(this._counts)) {
- const omitted = this._counts[id] - MAX_REPETITIONS;
- if (omitted > 0) {
- logger.warn(`${omitted} repetitive "${id}" deprecation warning(s) omitted.`);
- }
- }
- }
- }
-
- //
- // less.js - parser
- //
- // A relatively straight-forward predictive parser.
- // There is no tokenization/lexing stage, the input is parsed
- // in one sweep.
- //
- // To make the parser fast enough to run in the browser, several
- // optimization had to be made:
- //
- // - Matching and slicing on a huge input is often cause of slowdowns.
- // The solution is to chunkify the input into smaller strings.
- // The chunks are stored in the `chunks` var,
- // `j` holds the current chunk index, and `currentPos` holds
- // the index of the current chunk in relation to `input`.
- // This gives us an almost 4x speed-up.
- //
- // - In many cases, we don't need to match individual tokens;
- // for example, if a value doesn't hold any variables, operations
- // or dynamic references, the parser can effectively 'skip' it,
- // treating it as a literal.
- // An example would be '1px solid #000' - which evaluates to itself,
- // we don't need to know what the individual components are.
- // The drawback, of course is that you don't get the benefits of
- // syntax-checking on the CSS. This gives us a 50% speed-up in the parser,
- // and a smaller speed-up in the code-gen.
- //
- //
- // Token matching is done with the `$` function, which either takes
- // a terminal string or regexp, or a non-terminal function to call.
- // It also takes care of moving all the indices forwards.
- //
-
- const Parser = function Parser(context, imports, fileInfo, currentIndex) {
- currentIndex = currentIndex || 0;
- let parsers;
- const parserInput = getParserInput();
-
- function error(msg, type) {
- throw new LessError(
- {
- index: parserInput.i,
- filename: fileInfo.filename,
- type: type || 'Syntax',
- message: msg
- },
- imports
- );
- }
-
- const deprecationHandler = new DeprecationHandler();
-
- /**
- * @param {string} msg
- * @param {number} index
- * @param {string} type
- * @param {string} [deprecationId] - stable deprecation ID for repetition limiting
- */
- function warn(msg, index, type, deprecationId) {
- if (context.quiet) { return; }
- if (deprecationId && context.quietDeprecations) { return; }
- if (deprecationId && !deprecationHandler.shouldWarn(deprecationId)) { return; }
-
- logger$1.warn(
- (new LessError(
- {
- index: index ?? parserInput.i,
- filename: fileInfo.filename,
- type: type ? `${type.toUpperCase()} WARNING` : 'WARNING',
- message: msg
- },
- imports
- )).toString()
- );
- }
-
- function expect(arg, msg) {
- // some older browsers return typeof 'function' for RegExp
- const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);
- if (result) {
- return result;
- }
-
- error(msg || (typeof arg === 'string'
- ? `expected '${arg}' got '${parserInput.currentChar()}'`
- : 'unexpected token'));
- }
-
- // Specialization of expect()
- function expectChar(arg, msg) {
- if (parserInput.$char(arg)) {
- return arg;
- }
- error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);
- }
-
- function getDebugInfo(index) {
- const filename = fileInfo.filename;
-
- return {
- lineNumber: getLocation(index, parserInput.getInput()).line + 1,
- fileName: filename
- };
- }
-
- /**
- * Used after initial parsing to create nodes on the fly
- *
- * @param {String} str - string to parse
- * @param {Array} parseList - array of parsers to run input through e.g. ["value", "important"]
- * @param {Number} currentIndex - start number to begin indexing
- * @param {Object} fileInfo - fileInfo to attach to created nodes
- */
- function parseNode(str, parseList, callback) {
- let result;
- const returnNodes = [];
- const parser = parserInput;
-
- try {
- parser.start(str);
- for (let x = 0, p; (p = parseList[x]); x++) {
- result = parsers[p]();
- returnNodes.push(result || null);
- }
-
- const endInfo = parser.end();
- if (endInfo.isFinished) {
- callback(null, returnNodes);
- }
- else {
- callback(true, null);
- }
- } catch (e) {
- throw new LessError({
- index: e.index + currentIndex,
- message: e.message
- }, imports, fileInfo.filename);
- }
- }
-
- //
- // The Parser
- //
- return {
- parserInput,
- imports,
- fileInfo,
- parseNode,
- //
- // Parse an input string into an abstract syntax tree,
- // @param str A string containing 'less' markup
- // @param callback call `callback` when done.
- // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply
- //
- parse: function (str, callback, additionalData) {
- let root;
- let err = null;
- let globalVars;
- let modifyVars;
- let ignored;
- let preText = '';
-
- // Optionally disable @plugin parsing
- if (additionalData && additionalData.disablePluginRule) {
- parsers.plugin = function() {
- var dir = parserInput.$re(/^@plugin?\s+/);
- if (dir) {
- error('@plugin statements are not allowed when disablePluginRule is set to true');
- }
- };
- }
-
- globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\n` : '';
- modifyVars = (additionalData && additionalData.modifyVars) ? `\n${Parser.serializeVars(additionalData.modifyVars)}` : '';
-
- if (context.pluginManager) {
- const preProcessors = context.pluginManager.getPreProcessors();
- for (let i = 0; i < preProcessors.length; i++) {
- str = preProcessors[i].process(str, { context, imports, fileInfo });
- }
- }
-
- if (globalVars || (additionalData && additionalData.banner)) {
- preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;
- ignored = imports.contentsIgnoredChars;
- ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;
- ignored[fileInfo.filename] += preText.length;
- }
-
- str = str.replace(/\r\n?/g, '\n');
- // Remove potential UTF Byte Order Mark
- str = preText + str.replace(/^\uFEFF/, '') + modifyVars;
- imports.contents[fileInfo.filename] = str;
-
- // Start with the primary rule.
- // The whole syntax tree is held under a Ruleset node,
- // with the `root` property set to true, so no `{}` are
- // output. The callback is called when the input is parsed.
- try {
- parserInput.start(str);
-
- tree.Node.prototype.parse = this;
- root = new tree.Ruleset(null, this.parsers.primary());
- tree.Node.prototype.rootNode = root;
- root.root = true;
- root.firstRoot = true;
- root.functionRegistry = functionRegistry.inherit();
-
- } catch (e) {
- return callback(new LessError(e, imports, fileInfo.filename));
- }
-
- // If `i` is smaller than the `input.length - 1`,
- // it means the parser wasn't able to parse the whole
- // string, so we've got a parsing error.
- //
- // We try to extract a \n delimited string,
- // showing the line where the parse error occurred.
- // We split it up into two parts (the part which parsed,
- // and the part which didn't), so we can color them differently.
- const endInfo = parserInput.end();
- if (!endInfo.isFinished) {
-
- let message = endInfo.furthestPossibleErrorMessage;
-
- if (!message) {
- message = 'Unrecognised input';
- if (endInfo.furthestChar === '}') {
- message += '. Possibly missing opening \'{\'';
- } else if (endInfo.furthestChar === ')') {
- message += '. Possibly missing opening \'(\'';
- } else if (endInfo.furthestReachedEnd) {
- message += '. Possibly missing something';
- }
- }
-
- err = new LessError({
- type: 'Parse',
- message,
- index: endInfo.furthest,
- filename: fileInfo.filename
- }, imports);
- }
-
- const finish = e => {
- e = err || e || imports.error;
-
- if (e) {
- if (!(e instanceof LessError)) {
- e = new LessError(e, imports, fileInfo.filename);
- }
-
- return callback(e);
- }
- else {
- return callback(null, root);
- }
- };
-
- if (context.processImports !== false) {
- new visitors.ImportVisitor(imports, finish)
- .run(root);
- } else {
- return finish();
- }
- },
-
- //
- // Here in, the parsing rules/functions
- //
- // The basic structure of the syntax tree generated is as follows:
- //
- // Ruleset -> Declaration -> Value -> Expression -> Entity
- //
- // Here's some Less code:
- //
- // .class {
- // color: #fff;
- // border: 1px solid #000;
- // width: @w + 4px;
- // > .child {...}
- // }
- //
- // And here's what the parse tree might look like:
- //
- // Ruleset (Selector '.class', [
- // Declaration ("color", Value ([Expression [Color #fff]]))
- // Declaration ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]]))
- // Declaration ("width", Value ([Expression [Operation " + " [Variable "@w"][Dimension 4px]]]))
- // Ruleset (Selector [Element '>', '.child'], [...])
- // ])
- //
- // In general, most rules will try to parse a token with the `$re()` function, and if the return
- // value is truly, will return a new node, of the relevant type. Sometimes, we need to check
- // first, before parsing, that's when we use `peek()`.
- //
- parsers: parsers = {
- //
- // The `primary` rule is the *entry* and *exit* point of the parser.
- // The rules here can appear at any level of the parse tree.
- //
- // The recursive nature of the grammar is an interplay between the `block`
- // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,
- // as represented by this simplified grammar:
- //
- // primary → (ruleset | declaration)+
- // ruleset → selector+ block
- // block → '{' primary '}'
- //
- // Only at one point is the primary rule not called from the
- // block rule: at the root level.
- //
- primary: function () {
- const mixin = this.mixin;
- let root = [];
- let node;
-
- while (true) {
- while (true) {
- node = this.comment();
- if (!node) { break; }
- root.push(node);
- }
- // always process comments before deciding if finished
- if (parserInput.finished) {
- break;
- }
- if (parserInput.peek('}')) {
- break;
- }
-
- node = this.extendRule();
- if (node) {
- root = root.concat(node);
- continue;
- }
-
- node = mixin.definition() || this.declaration() || mixin.call(false, false) ||
- this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();
- if (node) {
- root.push(node);
- } else {
- let foundSemiColon = false;
- while (parserInput.$char(';')) {
- foundSemiColon = true;
- }
- if (!foundSemiColon) {
- break;
- }
- }
- }
-
- return root;
- },
-
- // comments are collected by the main parsing mechanism and then assigned to nodes
- // where the current structure allows it
- comment: function () {
- if (parserInput.commentStore.length) {
- const comment = parserInput.commentStore.shift();
- return new(tree.Comment)(comment.text, comment.isLineComment, comment.index + currentIndex, fileInfo);
- }
- },
-
- //
- // Entities are tokens which can be found inside an Expression
- //
- entities: {
- mixinLookup: function() {
- return parsers.mixin.call(true, true);
- },
- //
- // A string, which supports escaping " and '
- //
- // "milky way" 'he\'s the one!'
- //
- quoted: function (forceEscaped) {
- let str;
- const index = parserInput.i;
- let isEscaped = false;
-
- parserInput.save();
- if (parserInput.$char('~')) {
- isEscaped = true;
- } else if (forceEscaped) {
- parserInput.restore();
- return;
- }
-
- str = parserInput.$quoted();
- if (!str) {
- parserInput.restore();
- return;
- }
- parserInput.forget();
-
- return new(tree.Quoted)(str.charAt(0), str.slice(1, -1), isEscaped, index + currentIndex, fileInfo);
- },
-
- //
- // A catch-all word, such as:
- //
- // black border-collapse
- //
- keyword: function () {
- const k = parserInput.$char('%') || parserInput.$re(/^\[?(?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\]?/);
- if (k) {
- return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);
- }
- },
-
- //
- // A function call
- //
- // rgb(255, 0, 255)
- //
- // The arguments are parsed with the `entities.arguments` parser.
- //
- call: function () {
- let name;
- let args;
- let func;
- const index = parserInput.i;
-
- // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18
- if (parserInput.peek(/^url\(/i)) {
- return;
- }
-
- parserInput.save();
-
- name = parserInput.$re(/^([\w-]+|%|~|progid:[\w.]+)\(/);
- if (!name) {
- parserInput.forget();
- return;
- }
-
- name = name[1];
- func = this.customFuncCall(name);
- if (func) {
- args = func.parse();
- if (args && func.stop) {
- parserInput.forget();
- return args;
- }
- }
-
- args = this.arguments(args);
-
- if (!parserInput.$char(')')) {
- parserInput.restore('Could not parse call arguments or missing \')\'');
- return;
- }
-
- parserInput.forget();
-
- return new(tree.Call)(name, args, index + currentIndex, fileInfo);
- },
-
- declarationCall: function () {
- let validCall;
- let args;
- const index = parserInput.i;
-
- parserInput.save();
-
- validCall = parserInput.$re(/^[\w]+\(/);
- if (!validCall) {
- parserInput.forget();
- return;
- }
-
- validCall = validCall.substring(0, validCall.length - 1);
-
- // CSS at-rule keywords should never be parsed as declaration calls
- if (/^(and|or|not|only|layer)$/i.test(validCall)) {
- parserInput.restore();
- return;
- }
-
- let rule = this.ruleProperty();
- let value;
-
- if (rule) {
- value = this.value();
- }
-
- if (rule && value) {
- args = [new (tree.Declaration)(rule, value, null, null, parserInput.i + currentIndex, fileInfo, true)];
- }
-
- if (!parserInput.$char(')')) {
- parserInput.restore('Could not parse call arguments or missing \')\'');
- return;
- }
-
- parserInput.forget();
-
- return new(tree.Call)(validCall, args, index + currentIndex, fileInfo);
- },
-
- //
- // Parsing rules for functions with non-standard args, e.g.:
- //
- // boolean(not(2 > 1))
- //
- // This is a quick prototype, to be modified/improved when
- // more custom-parsed funcs come (e.g. `selector(...)`)
- //
-
- customFuncCall: function (name) {
- /* Ideally the table is to be moved out of here for faster perf.,
- but it's quite tricky since it relies on all these `parsers`
- and `expect` available only here */
- return {
- alpha: f(parsers.ieAlpha, true),
- boolean: f(condition),
- 'if': f(condition)
- }[name.toLowerCase()];
-
- function f(parse, stop) {
- return {
- parse, // parsing function
- stop // when true - stop after parse() and return its result,
- // otherwise continue for plain args
- };
- }
-
- function condition() {
- return [expect(parsers.condition, 'expected condition')];
- }
- },
-
- arguments: function (prevArgs) {
- let argsComma = prevArgs || [];
- const argsSemiColon = [];
- let isSemiColonSeparated;
- let value;
-
- parserInput.save();
-
- while (true) {
- if (prevArgs) {
- prevArgs = false;
- } else {
- value = parsers.detachedRuleset() || this.assignment() || parsers.expression();
- if (!value) {
- break;
- }
-
- if (value.value && value.value.length == 1) {
- value = value.value[0];
- }
-
- argsComma.push(value);
- }
-
- if (parserInput.$char(',')) {
- continue;
- }
-
- if (parserInput.$char(';') || isSemiColonSeparated) {
- isSemiColonSeparated = true;
- value = (argsComma.length < 1) ? argsComma[0]
- : new tree.Value(argsComma);
- argsSemiColon.push(value);
- argsComma = [];
- }
- }
-
- parserInput.forget();
- return isSemiColonSeparated ? argsSemiColon : argsComma;
- },
- literal: function () {
- return this.dimension() ||
- this.color() ||
- this.quoted() ||
- this.unicodeDescriptor();
- },
-
- // Assignments are argument entities for calls.
- // They are present in ie filter properties as shown below.
- //
- // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )
- //
-
- assignment: function () {
- let key;
- let value;
- parserInput.save();
- key = parserInput.$re(/^\w+(?=\s?=)/i);
- if (!key) {
- parserInput.restore();
- return;
- }
- if (!parserInput.$char('=')) {
- parserInput.restore();
- return;
- }
- value = parsers.entity();
- if (value) {
- parserInput.forget();
- return new(tree.Assignment)(key, value);
- } else {
- parserInput.restore();
- }
- },
-
- //
- // Parse url() tokens
- //
- // We use a specific rule for urls, because they don't really behave like
- // standard function calls. The difference is that the argument doesn't have
- // to be enclosed within a string, so it can't be parsed as an Expression.
- //
- url: function () {
- let value;
- const index = parserInput.i;
-
- parserInput.autoCommentAbsorb = false;
-
- if (!parserInput.$str('url(')) {
- parserInput.autoCommentAbsorb = true;
- return;
- }
-
- value = this.quoted() || this.variable() || this.property() ||
- parserInput.$re(/^(?:(?:\\[()'"])|[^()'"])+/) || '';
-
- parserInput.autoCommentAbsorb = true;
-
- expectChar(')');
-
- return new(tree.URL)((value.value !== undefined ||
- value instanceof tree.Variable ||
- value instanceof tree.Property) ?
- value : new(tree.Anonymous)(value, index), index + currentIndex, fileInfo);
- },
-
- //
- // A Variable entity, such as `@fink`, in
- //
- // width: @fink + 2px
- //
- // We use a different parser for variable definitions,
- // see `parsers.variable`.
- //
- variable: function () {
- let ch;
- let name;
- const index = parserInput.i;
-
- parserInput.save();
- if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\w-]+/))) {
- ch = parserInput.currentChar();
- if ((ch === '(' && !parserInput.prevChar().match(/^\s/))
- || (ch === '[' && !parserInput.prevChar().match(/^\s/))) {
- // this may be a VariableCall lookup
- const result = parsers.variableCall(name);
- if (result) {
- parserInput.forget();
- return result;
- }
- }
- parserInput.forget();
- return new(tree.Variable)(name, index + currentIndex, fileInfo);
- }
- parserInput.restore();
- },
-
- // A variable entity using the protective {} e.g. @{var}
- variableCurly: function () {
- let curly;
- const index = parserInput.i;
-
- if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\{([\w-]+)\}/))) {
- return new(tree.Variable)(`@${curly[1]}`, index + currentIndex, fileInfo);
- }
- },
- //
- // A Property accessor, such as `$color`, in
- //
- // background-color: $color
- //
- property: function () {
- let name;
- const index = parserInput.i;
-
- if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\$[\w-]+/))) {
- return new(tree.Property)(name, index + currentIndex, fileInfo);
- }
- },
-
- //
- // A Hexadecimal color
- //
- // #4F3C2F
- //
- // `rgb` and `hsl` colors are parsed through the `entities.call` parser.
- //
- color: function () {
- let rgb;
- parserInput.save();
-
- if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\w.#[])?/))) {
- if (!rgb[2]) {
- parserInput.forget();
- return new(tree.Color)(rgb[1], undefined, rgb[0]);
- }
- }
- parserInput.restore();
- },
-
- colorKeyword: function () {
- parserInput.save();
- const autoCommentAbsorb = parserInput.autoCommentAbsorb;
- parserInput.autoCommentAbsorb = false;
- const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);
- parserInput.autoCommentAbsorb = autoCommentAbsorb;
- if (!k) {
- parserInput.forget();
- return;
- }
- parserInput.restore();
- const color = tree.Color.fromKeyword(k);
- if (color) {
- parserInput.$str(k);
- return color;
- }
- },
-
- //
- // A Dimension, that is, a number and a unit
- //
- // 0.5em 95%
- //
- dimension: function () {
- if (parserInput.peekNotNumeric()) {
- return;
- }
-
- const value = parserInput.$re(/^([+-]?\d*\.?\d+)(%|[a-z_]+)?/i);
- if (value) {
- return new(tree.Dimension)(value[1], value[2]);
- }
- },
-
- //
- // A unicode descriptor, as is used in unicode-range
- //
- // U+0?? or U+00A1-00A9
- //
- unicodeDescriptor: function () {
- let ud;
-
- ud = parserInput.$re(/^U\+[0-9a-fA-F?]+(-[0-9a-fA-F?]+)?/);
- if (ud) {
- return new(tree.UnicodeDescriptor)(ud[0]);
- }
- },
-
- //
- // JavaScript code to be evaluated
- //
- // `window.location.href`
- //
- javascript: function () {
- let js;
- const index = parserInput.i;
-
- parserInput.save();
-
- const escape = parserInput.$char('~');
- const jsQuote = parserInput.$char('`');
-
- if (!jsQuote) {
- parserInput.restore();
- return;
- }
-
- js = parserInput.$re(/^[^`]*`/);
- if (js) {
- warn('Inline JavaScript evaluation (backtick expressions) is deprecated and will be removed in Less 5.x. Use Less functions or custom plugins instead.', index, 'DEPRECATED', 'js-eval');
- parserInput.forget();
- return new(tree.JavaScript)(js.slice(0, -1), Boolean(escape), index + currentIndex, fileInfo);
- }
- parserInput.restore('invalid javascript definition');
- }
- },
-
- //
- // The variable part of a variable definition. Used in the `rule` parser
- //
- // @fink:
- //
- variable: function () {
- let name;
-
- if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\w-]+)\s*:/))) { return name[1]; }
- },
-
- //
- // Call a variable value to retrieve a detached ruleset
- // or a value from a detached ruleset's rules.
- //
- // @fink();
- // @fink;
- // color: @fink[@color];
- //
- variableCall: function (parsedName) {
- let lookups;
- const i = parserInput.i;
- const inValue = !!parsedName;
- let name = parsedName;
-
- parserInput.save();
-
- if (name || (parserInput.currentChar() === '@'
- && (name = parserInput.$re(/^(@[\w-]+)(\(\s*\))?/)))) {
-
- lookups = this.mixin.ruleLookups();
-
- if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {
- parserInput.restore('Missing \'[...]\' lookup in variable call');
- return;
- }
-
- if (!inValue) {
- name = name[1];
- }
-
- const call = new tree.VariableCall(name, i, fileInfo);
- if (!inValue && parsers.end()) {
- parserInput.forget();
- return call;
- }
- else {
- parserInput.forget();
- return new tree.NamespaceValue(call, lookups, i, fileInfo);
- }
- }
-
- parserInput.restore();
- },
-
- //
- // extend syntax - used to extend selectors
- //
- extend: function(isRule) {
- let elements;
- let e;
- const index = parserInput.i;
- let option;
- let extendList;
- let extend;
-
- if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {
- return;
- }
-
- do {
- option = null;
- elements = null;
- let first = true;
- while (!(option = parserInput.$re(/^(!?all)(?=\s*(\)|,))/))) {
- e = this.element();
-
- if (!e) {
- break;
- }
- /**
- * @note - This will not catch selectors in pseudos like :is() and :where() because
- * they don't currently parse their contents as selectors.
- */
- if (!first && e.combinator.value) {
- warn('Targeting complex selectors can have unexpected behavior, and this behavior may change in the future.', index);
- }
-
- first = false;
- if (elements) {
- elements.push(e);
- } else {
- elements = [ e ];
- }
- }
-
- option = option && option[1];
- if (!elements) {
- error('Missing target selector for :extend().');
- }
- extend = new(tree.Extend)(new(tree.Selector)(elements), option, index + currentIndex, fileInfo);
- if (extendList) {
- extendList.push(extend);
- } else {
- extendList = [ extend ];
- }
- } while (parserInput.$char(','));
-
- expect(/^\)/);
-
- if (isRule) {
- expect(/^;/);
- }
-
- return extendList;
- },
-
- //
- // extendRule - used in a rule to extend all the parent selectors
- //
- extendRule: function() {
- return this.extend(true);
- },
-
- //
- // Mixins
- //
- mixin: {
- //
- // A Mixin call, with an optional argument list
- //
- // #mixins > .square(#fff);
- // #mixins.square(#fff);
- // .rounded(4px, black);
- // .button;
- //
- // We can lookup / return a value using the lookup syntax:
- //
- // color: #mixin.square(#fff)[@color];
- //
- // The `while` loop is there because mixins can be
- // namespaced, but we only support the child and descendant
- // selector for now.
- //
- call: function (inValue, getLookup) {
- const s = parserInput.currentChar();
- let important = false;
- let lookups;
- const index = parserInput.i;
- let elements;
- let args;
- let hasParens;
- let parensIndex;
- let parensWS = false;
-
- if (s !== '.' && s !== '#') { return; }
-
- parserInput.save(); // stop us absorbing part of an invalid selector
-
- elements = this.elements();
-
- if (elements) {
- parensIndex = parserInput.i;
- parensWS = parserInput.isWhitespace(-1);
- if (parserInput.$char('(')) {
- args = this.args(true).args;
- expectChar(')');
- hasParens = true;
- if (parensWS) {
- warn('Whitespace between a mixin name and parentheses for a mixin call is deprecated', parensIndex, 'DEPRECATED', 'mixin-call-whitespace');
- }
- }
-
- if (getLookup !== false) {
- lookups = this.ruleLookups();
- }
- if (getLookup === true && !lookups) {
- parserInput.restore();
- return;
- }
-
- if (inValue && !lookups && !hasParens) {
- // This isn't a valid in-value mixin call
- parserInput.restore();
- return;
- }
-
- if (!inValue && parsers.important()) {
- important = true;
- }
-
- if (inValue || parsers.end()) {
- parserInput.forget();
- const mixin = new(tree.mixin.Call)(elements, args, index + currentIndex, fileInfo, !lookups && important);
- if (lookups) {
- return new tree.NamespaceValue(mixin, lookups);
- }
- else {
- if (!hasParens) {
- warn('Calling a mixin without parentheses is deprecated', parensIndex, 'DEPRECATED', 'mixin-call-no-parens');
- }
- return mixin;
- }
- }
- }
-
- parserInput.restore();
- },
- /**
- * Matching elements for mixins
- * (Start with . or # and can have > )
- */
- elements: function() {
- let elements;
- let e;
- let c;
- let elem;
- let elemIndex;
- const re = /^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;
- while (true) {
- elemIndex = parserInput.i;
- e = parserInput.$re(re);
-
- if (!e) {
- break;
- }
- elem = new(tree.Element)(c, e, false, elemIndex + currentIndex, fileInfo);
- if (elements) {
- elements.push(elem);
- } else {
- elements = [ elem ];
- }
- c = parserInput.$char('>');
- }
- return elements;
- },
- args: function (isCall) {
- const entities = parsers.entities;
- const returner = { args:null, variadic: false };
- let expressions = [];
- const argsSemiColon = [];
- const argsComma = [];
- let isSemiColonSeparated;
- let expressionContainsNamed;
- let name;
- let nameLoop;
- let value;
- let arg;
- let expand;
- let hasSep = true;
-
- parserInput.save();
-
- while (true) {
- if (isCall) {
- arg = parsers.detachedRuleset() || parsers.expression();
- } else {
- parserInput.commentStore.length = 0;
- if (parserInput.$str('...')) {
- returner.variadic = true;
- if (parserInput.$char(';') && !isSemiColonSeparated) {
- isSemiColonSeparated = true;
- }
- (isSemiColonSeparated ? argsSemiColon : argsComma)
- .push({ variadic: true });
- break;
- }
- arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);
- }
-
- if (!arg || !hasSep) {
- break;
- }
-
- nameLoop = null;
- if (arg.throwAwayComments) {
- arg.throwAwayComments();
- }
- value = arg;
- let val = null;
-
- if (isCall) {
- // Variable
- if (arg.value && arg.value.length == 1) {
- val = arg.value[0];
- }
- } else {
- val = arg;
- }
-
- if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {
- if (parserInput.$char(':')) {
- if (expressions.length > 0) {
- if (isSemiColonSeparated) {
- error('Cannot mix ; and , as delimiter types');
- }
- expressionContainsNamed = true;
- }
-
- value = parsers.detachedRuleset() || parsers.expression();
-
- if (!value) {
- if (isCall) {
- error('could not understand value for named argument');
- } else {
- parserInput.restore();
- returner.args = [];
- return returner;
- }
- }
- nameLoop = (name = val.name);
- } else if (parserInput.$str('...')) {
- if (!isCall) {
- returner.variadic = true;
- if (parserInput.$char(';') && !isSemiColonSeparated) {
- isSemiColonSeparated = true;
- }
- (isSemiColonSeparated ? argsSemiColon : argsComma)
- .push({ name: arg.name, variadic: true });
- break;
- } else {
- expand = true;
- }
- } else if (!isCall) {
- name = nameLoop = val.name;
- value = null;
- }
- }
-
- if (value) {
- expressions.push(value);
- }
-
- argsComma.push({ name:nameLoop, value, expand });
-
- if (parserInput.$char(',')) {
- hasSep = true;
- continue;
- }
- hasSep = parserInput.$char(';') === ';';
-
- if (hasSep || isSemiColonSeparated) {
-
- if (expressionContainsNamed) {
- error('Cannot mix ; and , as delimiter types');
- }
-
- isSemiColonSeparated = true;
-
- if (expressions.length > 1) {
- value = new(tree.Value)(expressions);
- }
- argsSemiColon.push({ name, value, expand });
-
- name = null;
- expressions = [];
- expressionContainsNamed = false;
- }
- }
-
- parserInput.forget();
- returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;
- return returner;
- },
- //
- // A Mixin definition, with a list of parameters
- //
- // .rounded (@radius: 2px, @color) {
- // ...
- // }
- //
- // Until we have a finer grained state-machine, we have to
- // do a look-ahead, to make sure we don't have a mixin call.
- // See the `rule` function for more information.
- //
- // We start by matching `.rounded (`, and then proceed on to
- // the argument list, which has optional default values.
- // We store the parameters in `params`, with a `value` key,
- // if there is a value, such as in the case of `@radius`.
- //
- // Once we've got our params list, and a closing `)`, we parse
- // the `{...}` block.
- //
- definition: function () {
- let name;
- let params = [];
- let match;
- let ruleset;
- let cond;
- let variadic = false;
- if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||
- parserInput.peek(/^[^{]*\}/)) {
- return;
- }
-
- parserInput.save();
-
- match = parserInput.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/);
- if (match) {
- name = match[1];
-
- const argInfo = this.args(false);
- params = argInfo.args;
- variadic = argInfo.variadic;
-
- // .mixincall("@{a}");
- // looks a bit like a mixin definition..
- // also
- // .mixincall(@a: {rule: set;});
- // so we have to be nice and restore
- if (!parserInput.$char(')')) {
- parserInput.restore('Missing closing \')\'');
- return;
- }
-
- parserInput.commentStore.length = 0;
-
- if (parserInput.$str('when')) { // Guard
- cond = expect(parsers.conditions, 'expected condition');
- }
-
- ruleset = parsers.block();
-
- if (ruleset) {
- parserInput.forget();
- return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);
- } else {
- parserInput.restore();
- }
- } else {
- parserInput.restore();
- }
- },
-
- ruleLookups: function() {
- let rule;
- const lookups = [];
-
- if (parserInput.currentChar() !== '[') {
- return;
- }
-
- while (true) {
- parserInput.save();
- rule = this.lookupValue();
- if (!rule && rule !== '') {
- parserInput.restore();
- break;
- }
- lookups.push(rule);
- parserInput.forget();
- }
- if (lookups.length > 0) {
- return lookups;
- }
- },
-
- lookupValue: function() {
- parserInput.save();
-
- if (!parserInput.$char('[')) {
- parserInput.restore();
- return;
- }
-
- const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);
-
- if (!parserInput.$char(']')) {
- parserInput.restore();
- return;
- }
-
- if (name || name === '') {
- parserInput.forget();
- return name;
- }
-
- parserInput.restore();
- }
- },
- //
- // Entities are the smallest recognized token,
- // and can be found inside a rule's value.
- //
- entity: function () {
- const entities = this.entities;
-
- return this.comment() || entities.literal() || entities.variable() || entities.url() ||
- entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||
- entities.javascript();
- },
-
- //
- // A Declaration terminator. Note that we use `peek()` to check for '}',
- // because the `block` rule will be expecting it, but we still need to make sure
- // it's there, if ';' was omitted.
- //
- end: function () {
- return parserInput.$char(';') || parserInput.peek('}');
- },
-
- //
- // IE's alpha function
- //
- // alpha(opacity=88)
- //
- ieAlpha: function () {
- let value;
-
- // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18
- if (!parserInput.$re(/^opacity=/i)) { return; }
- value = parserInput.$re(/^\d+/);
- if (!value) {
- value = expect(parsers.entities.variable, 'Could not parse alpha');
- value = `@{${value.name.slice(1)}}`;
- }
- expectChar(')');
- return new tree.Quoted('', `alpha(opacity=${value})`);
- },
-
- /**
- * A Selector Element
- *
- * div
- * + h1
- * #socks
- * input[type="text"]
- *
- * Elements are the building blocks for Selectors,
- * they are made out of a `Combinator` (see combinator rule),
- * and an element name, such as a tag a class, or `*`.
- */
- element: function () {
- let e;
- let c;
- let v;
- const index = parserInput.i;
-
- c = this.combinator();
-
- /** This selector parser is quite simplistic and will pass a number of invalid selectors. */
- e = parserInput.$re(/^(?:\d+\.\d+|\d+)%/) ||
- // eslint-disable-next-line no-control-regex
- parserInput.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||
- parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||
- parserInput.$re(/^\([^&()@]+\)/) || parserInput.$re(/^[.#:](?=@)/) ||
- this.entities.variableCurly();
-
- if (!e) {
- parserInput.save();
- if (parserInput.$char('(')) {
- if ((v = this.selector(false))) {
- let selectors = [];
- while (parserInput.$char(',')) {
- selectors.push(v);
- selectors.push(new Anonymous(','));
- v = this.selector(false);
- }
- selectors.push(v);
-
- if (parserInput.$char(')')) {
- if (selectors.length > 1) {
- e = new (tree.Paren)(new Selector(selectors));
- } else {
- e = new(tree.Paren)(v);
- }
- parserInput.forget();
- } else {
- parserInput.restore('Missing closing \')\'');
- }
- } else {
- parserInput.restore('Missing closing \')\'');
- }
- } else {
- parserInput.forget();
- }
- }
-
- if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index + currentIndex, fileInfo); }
- },
-
- //
- // Combinators combine elements together, in a Selector.
- //
- // Because our parser isn't white-space sensitive, special care
- // has to be taken, when parsing the descendant combinator, ` `,
- // as it's an empty space. We have to check the previous character
- // in the input, to see if it's a ` ` character. More info on how
- // we deal with this in *combinator.js*.
- //
- combinator: function () {
- let c = parserInput.currentChar();
-
- if (c === '/') {
- parserInput.save();
- const slashedCombinator = parserInput.$re(/^\/[a-z]+\//i);
- if (slashedCombinator) {
- parserInput.forget();
- return new(tree.Combinator)(slashedCombinator);
- }
- parserInput.restore();
- }
-
- if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {
- parserInput.i++;
- if (c === '^' && parserInput.currentChar() === '^') {
- c = '^^';
- parserInput.i++;
- }
- while (parserInput.isWhitespace()) { parserInput.i++; }
- return new(tree.Combinator)(c);
- } else if (parserInput.isWhitespace(-1)) {
- return new(tree.Combinator)(' ');
- } else {
- return new(tree.Combinator)(null);
- }
- },
- //
- // A CSS Selector
- // with less extensions e.g. the ability to extend and guard
- //
- // .class > div + h1
- // li a:hover
- //
- // Selectors are made out of one or more Elements, see above.
- //
- selector: function (isLess) {
- const index = parserInput.i;
- let elements;
- let extendList;
- let c;
- let e;
- let allExtends;
- let when;
- let condition;
- isLess = isLess !== false;
- while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {
- if (when) {
- condition = expect(this.conditions, 'expected condition');
- } else if (condition) {
- error('CSS guard can only be used at the end of selector');
- } else if (extendList) {
- if (allExtends) {
- allExtends = allExtends.concat(extendList);
- } else {
- allExtends = extendList;
- }
- } else {
- if (allExtends) { error('Extend can only be used at the end of selector'); }
- c = parserInput.currentChar();
- if (Array.isArray(e)){
- e.forEach(ele => elements.push(ele));
- } if (elements) {
- elements.push(e);
- } else {
- elements = [ e ];
- }
- e = null;
- }
- if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {
- break;
- }
- }
-
- if (elements) { return new(tree.Selector)(elements, allExtends, condition, index + currentIndex, fileInfo); }
- if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }
- },
- selectors: function () {
- let s;
- let selectors;
- while (true) {
- s = this.selector();
- if (!s) {
- break;
- }
- if (selectors) {
- selectors.push(s);
- } else {
- selectors = [ s ];
- }
- parserInput.commentStore.length = 0;
- if (s.condition && selectors.length > 1) {
- error('Guards are only currently allowed on a single selector.');
- }
- if (!parserInput.$char(',')) { break; }
- if (s.condition) {
- error('Guards are only currently allowed on a single selector.');
- }
- parserInput.commentStore.length = 0;
- }
- return selectors;
- },
- attribute: function () {
- if (!parserInput.$char('[')) { return; }
-
- const entities = this.entities;
- let key;
- let val;
- let op;
- //
- // case-insensitive flag
- // e.g. [attr operator value i]
- //
- let cif;
-
- if (!(key = entities.variableCurly())) {
- key = expect(/^(?:[_A-Za-z0-9-*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/);
- }
-
- op = parserInput.$re(/^[|~*$^]?=/);
- if (op) {
- val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\w-]+/) || entities.variableCurly();
- if (val) {
- cif = parserInput.$re(/^[iIsS]/);
- }
- }
-
- expectChar(']');
-
- return new(tree.Attribute)(key, op, val, cif);
- },
-
- //
- // The `block` rule is used by `ruleset` and `mixin.definition`.
- // It's a wrapper around the `primary` rule, with added `{}`.
- //
- block: function () {
- let content;
- if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {
- return content;
- }
- },
-
- blockRuleset: function() {
- let block = this.block();
- if (block) {
- return new tree.Ruleset(null, block);
- }
- },
-
- detachedRuleset: function() {
- let argInfo;
- let params;
- let variadic;
-
- parserInput.save();
- if (parserInput.$re(/^[.#]\(/)) {
- /**
- * DR args currently only implemented for each() function, and not
- * yet settable as `@dr: #(@arg) {}`
- * This should be done when DRs are merged with mixins.
- * See: https://github.com/less/less-meta/issues/16
- */
- argInfo = this.mixin.args(false);
- params = argInfo.args;
- variadic = argInfo.variadic;
- if (!parserInput.$char(')')) {
- parserInput.restore();
- return;
- }
- }
- const blockRuleset = this.blockRuleset();
- if (blockRuleset) {
- parserInput.forget();
- if (params) {
- return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);
- }
- return new tree.DetachedRuleset(blockRuleset);
- }
- parserInput.restore();
- },
-
- //
- // div, .class, body > p {...}
- //
- ruleset: function () {
- let selectors;
- let rules;
- let debugInfo;
-
- parserInput.save();
-
- if (context.dumpLineNumbers) {
- debugInfo = getDebugInfo(parserInput.i);
- }
-
- selectors = this.selectors();
-
- if (selectors && (rules = this.block())) {
- parserInput.forget();
- const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);
- if (context.dumpLineNumbers) {
- ruleset.debugInfo = debugInfo;
- }
- return ruleset;
- } else {
- parserInput.restore();
- }
- },
- declaration: function () {
- let name;
- let value;
- const index = parserInput.i;
- let hasDR;
- const c = parserInput.currentChar();
- let important;
- let merge;
- let isVariable;
-
- if (c === '.' || c === '#' || c === '&' || c === ':') { return; }
-
- parserInput.save();
-
- name = this.variable() || this.ruleProperty();
- if (name) {
- isVariable = typeof name === 'string';
-
- if (isVariable) {
- value = this.detachedRuleset();
- if (value) {
- hasDR = true;
- }
- }
-
- parserInput.commentStore.length = 0;
- if (!value) {
- // a name returned by this.ruleProperty() is always an array of the form:
- // [string-1, ..., string-n, ""] or [string-1, ..., string-n, "+"]
- // where each item is a tree.Keyword or tree.Variable
- merge = !isVariable && name.length > 1 && name.pop().value;
-
- // Custom property values get permissive parsing
- if (name[0].value && name[0].value.slice(0, 2) === '--') {
- if (parserInput.$char(';')) {
- value = new Anonymous('');
- } else {
- value = this.permissiveValue(/[;}]/, true);
- }
- }
- // Try to store values as anonymous
- // If we need the value later we'll re-parse it in ruleset.parseValue
- else {
- value = this.anonymousValue();
- }
- if (value) {
- parserInput.forget();
- // anonymous values absorb the end ';' which is required for them to work
- return new(tree.Declaration)(name, value, false, merge, index + currentIndex, fileInfo);
- }
-
- if (!value) {
- value = this.value();
- }
-
- if (value) {
- important = this.important();
- } else if (isVariable) {
- /**
- * As a last resort, try permissiveValue
- *
- * @todo - This has created some knock-on problems of not
- * flagging incorrect syntax or detecting user intent.
- */
- value = this.permissiveValue();
- }
- }
-
- if (value && (this.end() || hasDR)) {
- parserInput.forget();
- return new(tree.Declaration)(name, value, important, merge, index + currentIndex, fileInfo);
- }
- else {
- parserInput.restore();
- }
- } else {
- parserInput.restore();
- }
- },
- anonymousValue: function () {
- const index = parserInput.i;
- const match = parserInput.$re(/^([^.#@$+/'"*`(;{}-]*);/);
- if (match) {
- return new(tree.Anonymous)(match[1], index + currentIndex);
- }
- },
- /**
- * Used for custom properties, at-rules, and variables (as fallback)
- * Parses almost anything inside of {} [] () "" blocks
- * until it reaches outer-most tokens.
- *
- * First, it will try to parse comments and entities to reach
- * the end. This is mostly like the Expression parser except no
- * math is allowed.
- *
- * @param {RexExp} untilTokens - Characters to stop parsing at
- */
- permissiveValue: function (untilTokens) {
- let i;
- let e;
- let done;
- let value;
- const tok = untilTokens || ';';
- const index = parserInput.i;
- const result = [];
-
- function testCurrentChar() {
- const char = parserInput.currentChar();
- if (typeof tok === 'string') {
- return char === tok;
- } else {
- return tok.test(char);
- }
- }
- if (testCurrentChar()) {
- return;
- }
- value = [];
- do {
- e = this.comment();
- if (e) {
- value.push(e);
- continue;
- }
- e = this.entity();
- if (e) {
- value.push(e);
- }
- if (parserInput.peek(',')) {
- value.push(new (tree.Anonymous)(',', parserInput.i));
- parserInput.$char(',');
- }
- } while (e);
-
- done = testCurrentChar();
-
- if (value.length > 0) {
- value = new(tree.Expression)(value);
- if (done) {
- return value;
- }
- else {
- result.push(value);
- }
- // Preserve space before $parseUntil as it will not
- if (parserInput.prevChar() === ' ') {
- result.push(new tree.Anonymous(' ', index));
- }
- }
- parserInput.save();
-
- value = parserInput.$parseUntil(tok);
-
- if (value) {
- if (typeof value === 'string') {
- error(`Expected '${value}'`, 'Parse');
- }
- if (value.length === 1 && value[0] === ' ') {
- parserInput.forget();
- return new tree.Anonymous('', index);
- }
- /** @type {string} */
- let item;
- for (i = 0; i < value.length; i++) {
- item = value[i];
- if (Array.isArray(item)) {
- // Treat actual quotes as normal quoted values
- result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));
- }
- else {
- if (i === value.length - 1) {
- item = item.trim();
- }
- // Treat like quoted values, but replace vars like unquoted expressions
- const quote = new tree.Quoted('\'', item, true, index, fileInfo);
- const variableRegex = /@([\w-]+)/g;
- const propRegex = /\$([\w-]+)/g;
- if (variableRegex.test(item)) {
- warn('@[ident] in unknown values will not be evaluated as variables in the future. Use @{[ident]}', index, 'DEPRECATED', 'variable-in-unknown-value');
- }
- if (propRegex.test(item)) {
- warn('$[ident] in unknown values will not be evaluated as property references in the future. Use ${[ident]}', index, 'DEPRECATED', 'property-in-unknown-value');
- }
- quote.variableRegex = /@([\w-]+)|@{([\w-]+)}/g;
- quote.propRegex = /\$([\w-]+)|\${([\w-]+)}/g;
- result.push(quote);
- }
- }
- parserInput.forget();
- return new tree.Expression(result, true);
- }
- parserInput.restore();
- },
-
- //
- // An @import atrule
- //
- // @import "lib";
- //
- // Depending on our environment, importing is done differently:
- // In the browser, it's an XHR request, in Node, it would be a
- // file-system operation. The function used for importing is
- // stored in `import`, which we pass to the Import constructor.
- //
- 'import': function () {
- let path;
- let features;
- const index = parserInput.i;
-
- const dir = parserInput.$re(/^@import\s+/);
-
- if (dir) {
- const options = (dir ? this.importOptions() : null) || {};
-
- if ((path = this.entities.quoted() || this.entities.url())) {
- features = this.mediaFeatures({});
-
- if (!parserInput.$char(';')) {
- parserInput.i = index;
- error('missing semi-colon or unrecognised media features on import');
- }
- features = features && new(tree.Value)(features);
- return new(tree.Import)(path, features, options, index + currentIndex, fileInfo);
- }
- else {
- parserInput.i = index;
- error('malformed import statement');
- }
- }
- },
-
- importOptions: function() {
- let o;
- const options = {};
- let optionName;
- let value;
-
- // list of options, surrounded by parens
- if (!parserInput.$char('(')) { return null; }
- do {
- o = this.importOption();
- if (o) {
- optionName = o;
- value = true;
- switch (optionName) {
- case 'css':
- optionName = 'less';
- value = false;
- break;
- case 'once':
- optionName = 'multiple';
- value = false;
- break;
- }
- options[optionName] = value;
- if (!parserInput.$char(',')) { break; }
- }
- } while (o);
- expectChar(')');
- return options;
- },
-
- importOption: function() {
- const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);
- if (opt) {
- return opt[1];
- }
- },
-
- mediaFeature: function (syntaxOptions) {
- const entities = this.entities;
- const nodes = [];
- let e;
- let p;
- let rangeP;
- let spacing = false;
- parserInput.save();
- do {
- parserInput.save();
- if (parserInput.$re(/^[0-9a-z-]*\s+\(/)) {
- spacing = true;
- }
- parserInput.restore();
-
- e = entities.declarationCall.bind(this)() || entities.keyword() || entities.variable() || entities.mixinLookup();
- if (e) {
- nodes.push(e);
- if (e.type === 'Variable' ||
- (e.type === 'Keyword' && /^(and|or|not|only)$/i.test(e.value))) {
- spacing = true;
- }
- } else if (parserInput.$char('(')) {
- p = this.property();
- parserInput.save();
- if (!p && syntaxOptions.queryInParens && parserInput.$re(/^[0-9a-z-]*\s*([<>]=|<=|>=|[<>]|=)/)) {
- parserInput.restore();
- p = this.condition();
-
- parserInput.save();
- rangeP = this.atomicCondition(null, p.rvalue);
- if (!rangeP) {
- parserInput.restore();
- }
- } else {
- parserInput.restore();
- e = this.value();
- }
- if (parserInput.$char(')')) {
- if (p && !e) {
- nodes.push(new (tree.Paren)(new (tree.QueryInParens)(p.op, p.lvalue, p.rvalue, rangeP ? rangeP.op : null, rangeP ? rangeP.rvalue : null, p._index)));
- e = p;
- } else if (p && e) {
- nodes.push(new (tree.Paren)(new (tree.Declaration)(p, e, null, null, parserInput.i + currentIndex, fileInfo, true)));
- if (!spacing) {
- nodes[nodes.length - 1].noSpacing = true;
- }
- spacing = false;
- } else if (e) {
- nodes.push(new(tree.Paren)(e));
- spacing = false;
- } else {
- error('badly formed media feature definition');
- }
- } else {
- error('Missing closing \')\'', 'Parse');
- }
- }
- } while (e);
-
- parserInput.forget();
- if (nodes.length > 0) {
- return new(tree.Expression)(nodes);
- }
- },
-
- mediaFeatures: function (syntaxOptions) {
- const entities = this.entities;
- const features = [];
- let e;
- do {
- e = this.mediaFeature(syntaxOptions);
- if (e) {
- features.push(e);
- if (!parserInput.$char(',')) { break; }
- else if (!features[features.length - 1].noSpacing) {
- features[features.length - 1].noSpacing = false;
- }
- } else {
- e = entities.variable() || entities.mixinLookup();
- if (e) {
- features.push(e);
- if (!parserInput.$char(',')) { break; }
- else if (!features[features.length - 1].noSpacing) {
- features[features.length - 1].noSpacing = false;
- }
- }
- }
- } while (e);
-
- return features.length > 0 ? features : null;
- },
-
- prepareAndGetNestableAtRule: function (treeType, index, debugInfo, syntaxOptions) {
- const features = this.mediaFeatures(syntaxOptions);
-
- const rules = this.block();
-
- if (!rules) {
- error('media definitions require block statements after any features');
- }
-
- parserInput.forget();
-
- const atRule = new (treeType)(rules, features, index + currentIndex, fileInfo);
- if (context.dumpLineNumbers) {
- atRule.debugInfo = debugInfo;
- }
-
- return atRule;
- },
-
- nestableAtRule: function () {
- let debugInfo;
- const index = parserInput.i;
-
- if (context.dumpLineNumbers) {
- debugInfo = getDebugInfo(index);
- }
- parserInput.save();
-
- if (parserInput.$peekChar('@')) {
- if (parserInput.$str('@media')) {
- return this.prepareAndGetNestableAtRule(tree.Media, index, debugInfo, MediaSyntaxOptions);
- }
-
- if (parserInput.$str('@container')) {
- return this.prepareAndGetNestableAtRule(tree.Container, index, debugInfo, ContainerSyntaxOptions);
- }
- }
-
- parserInput.restore();
- },
-
- //
-
- // A @plugin directive, used to import plugins dynamically.
- //
- // @plugin (args) "lib";
- //
- plugin: function () {
- let path;
- let args;
- let options;
- const index = parserInput.i;
- const dir = parserInput.$re(/^@plugin\s+/);
-
- if (dir) {
- warn('The @plugin directive is deprecated and will be removed in Less 5.x. Use --plugin CLI option or the programmatic plugin API instead.', index, 'DEPRECATED', 'at-plugin');
- args = this.pluginArgs();
-
- if (args) {
- options = {
- pluginArgs: args,
- isPlugin: true
- };
- }
- else {
- options = { isPlugin: true };
- }
-
- if ((path = this.entities.quoted() || this.entities.url())) {
-
- if (!parserInput.$char(';')) {
- parserInput.i = index;
- error('missing semi-colon on @plugin');
- }
- return new(tree.Import)(path, null, options, index + currentIndex, fileInfo);
- }
- else {
- parserInput.i = index;
- error('malformed @plugin statement');
- }
- }
- },
-
- pluginArgs: function() {
- // list of options, surrounded by parens
- parserInput.save();
- if (!parserInput.$char('(')) {
- parserInput.restore();
- return null;
- }
- const args = parserInput.$re(/^\s*([^);]+)\)\s*/);
- if (args[1]) {
- parserInput.forget();
- return args[1].trim();
- }
- else {
- parserInput.restore();
- return null;
- }
- },
- atruleUnknown: function (value, name, hasBlock) {
- value = this.permissiveValue(/^[{;]/);
- hasBlock = (parserInput.currentChar() === '{');
- if (!value) {
- if (!hasBlock && parserInput.currentChar() !== ';') {
- error(''.concat(name, ' rule is missing block or ending semi-colon'));
- }
- }
- else if (!value.value) {
- value = null;
- }
- return [value, hasBlock];
- },
- atruleBlock: function (rules, value, isRooted, isKeywordList) {
- rules = this.blockRuleset();
- parserInput.save();
- if (!rules && !isRooted) {
- value = this.entity();
- rules = this.blockRuleset();
- }
- if (!rules && !isRooted) {
- parserInput.restore();
- var e = [];
- value = this.entity();
- while (parserInput.$char(',')) {
- e.push(value);
- value = this.entity();
- }
- if (value && e.length > 0) {
- e.push(value);
- value = e;
- isKeywordList = true;
- }
- else {
- rules = this.blockRuleset();
- }
- }
- else {
- parserInput.forget();
- }
-
- return [rules, value, isKeywordList];
- },
- //
- // A CSS AtRule
- //
- // @charset "utf-8";
- //
- atrule: function () {
- const index = parserInput.i;
- let name;
- let value;
- let rules;
- let nonVendorSpecificName;
- let hasIdentifier;
- let hasExpression;
- let hasUnknown;
- let hasBlock = true;
- let isRooted = true;
- let isKeywordList = false;
-
- if (parserInput.currentChar() !== '@') { return; }
-
- value = this['import']() || this.plugin() || this.nestableAtRule();
- if (value) {
- return value;
- }
-
- parserInput.save();
-
- name = parserInput.$re(/^@[a-z-]+/);
-
- if (!name) { return; }
-
- nonVendorSpecificName = name;
- if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {
- nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;
- }
-
- switch (nonVendorSpecificName) {
- case '@charset':
- hasIdentifier = true;
- hasBlock = false;
- break;
- case '@namespace':
- hasExpression = true;
- hasBlock = false;
- break;
- case '@keyframes':
- case '@counter-style':
- hasIdentifier = true;
- break;
- case '@document':
- case '@supports':
- hasUnknown = true;
- isRooted = false;
- break;
- case '@starting-style':
- isRooted = false;
- break;
- case '@layer':
- isRooted = false;
- break;
- default:
- hasUnknown = true;
- break;
- }
-
- parserInput.commentStore.length = 0;
-
- if (hasIdentifier) {
- value = this.entity();
- if (!value) {
- error(`expected ${name} identifier`);
- }
- } else if (hasExpression) {
- value = this.expression();
- if (!value) {
- error(`expected ${name} expression`);
- }
- } else if (hasUnknown) {
- const unknownPackage = this.atruleUnknown(value, name, hasBlock);
- value = unknownPackage[0];
- hasBlock = unknownPackage[1];
- }
-
- if (hasBlock) {
- let blockPackage = this.atruleBlock(rules, value, isRooted, isKeywordList);
- rules = blockPackage[0];
- value = blockPackage[1];
- isKeywordList = blockPackage[2];
-
- if (!rules && !hasUnknown) {
- parserInput.restore();
- name = parserInput.$re(/^@[a-z-]+/);
- const unknownPackage = this.atruleUnknown(value, name, hasBlock);
- value = unknownPackage[0];
- hasBlock = unknownPackage[1];
- if (hasBlock) {
- blockPackage = this.atruleBlock(rules, value, isRooted, isKeywordList);
- rules = blockPackage[0];
- value = blockPackage[1];
- isKeywordList = blockPackage[2];
- }
- }
- }
-
- if (rules || isKeywordList || (!hasBlock && value && parserInput.$char(';'))) {
- parserInput.forget();
- return new(tree.AtRule)(name, value, rules, index + currentIndex, fileInfo,
- context.dumpLineNumbers ? getDebugInfo(index) : null,
- isRooted
- );
- }
-
- parserInput.restore('at-rule options not recognised');
- },
-
- //
- // A Value is a comma-delimited list of Expressions
- //
- // font-family: Baskerville, Georgia, serif;
- //
- // In a Rule, a Value represents everything after the `:`,
- // and before the `;`.
- //
- value: function () {
- let e;
- const expressions = [];
- const index = parserInput.i;
-
- do {
- e = this.expression();
- if (e) {
- expressions.push(e);
- if (!parserInput.$char(',')) { break; }
- }
- } while (e);
-
- if (expressions.length > 0) {
- return new(tree.Value)(expressions, index + currentIndex);
- }
- },
- important: function () {
- if (parserInput.currentChar() === '!') {
- return parserInput.$re(/^! *important/);
- }
- },
- sub: function () {
- let a;
- let e;
-
- parserInput.save();
- if (parserInput.$char('(')) {
- a = this.addition();
- if (a && parserInput.$char(')')) {
- parserInput.forget();
- e = new(tree.Expression)([a]);
- e.parens = true;
- return e;
- }
- parserInput.restore('Expected \')\'');
- return;
- }
- parserInput.restore();
- },
- colorOperand: function () {
- parserInput.save();
-
- // hsl or rgb or lch operand
- const match = parserInput.$re(/^[lchrgbs]\s+/);
- if (match) {
- parserInput.forget();
- return new tree.Keyword(match[0]);
- }
-
- parserInput.restore();
- },
- multiplication: function () {
- let m;
- let a;
- let op;
- let operation;
- let isSpaced;
- m = this.operand();
- if (m) {
- isSpaced = parserInput.isWhitespace(-1);
- while (true) {
- if (parserInput.peek(/^\/[*/]/)) {
- break;
- }
-
- parserInput.save();
-
- op = parserInput.$char('/') || parserInput.$char('*');
- if (!op) {
- let index = parserInput.i;
- op = parserInput.$str('./');
- if (op) {
- warn('./ operator is deprecated', index, 'DEPRECATED', 'dot-slash-operator');
- }
- }
-
- if (!op) { parserInput.forget(); break; }
-
- a = this.operand();
-
- if (!a) { parserInput.restore(); break; }
- parserInput.forget();
-
- m.parensInOp = true;
- a.parensInOp = true;
- operation = new(tree.Operation)(op, [operation || m, a], isSpaced);
- isSpaced = parserInput.isWhitespace(-1);
- }
- return operation || m;
- }
- },
- addition: function () {
- let m;
- let a;
- let op;
- let operation;
- let isSpaced;
- m = this.multiplication();
- if (m) {
- isSpaced = parserInput.isWhitespace(-1);
- while (true) {
- op = parserInput.$re(/^[-+]\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));
- if (!op) {
- break;
- }
- a = this.multiplication();
- if (!a) {
- break;
- }
-
- m.parensInOp = true;
- a.parensInOp = true;
- operation = new(tree.Operation)(op, [operation || m, a], isSpaced);
- isSpaced = parserInput.isWhitespace(-1);
- }
- return operation || m;
- }
- },
- conditions: function () {
- let a;
- let b;
- const index = parserInput.i;
- let condition;
-
- a = this.condition(true);
- if (a) {
- while (true) {
- if (!parserInput.peek(/^,\s*(not\s*)?\(/) || !parserInput.$char(',')) {
- break;
- }
- b = this.condition(true);
- if (!b) {
- break;
- }
- condition = new(tree.Condition)('or', condition || a, b, index + currentIndex);
- }
- return condition || a;
- }
- },
- condition: function (needsParens) {
- let result;
- let logical;
- let next;
- function or() {
- return parserInput.$str('or');
- }
-
- result = this.conditionAnd(needsParens);
- if (!result) {
- return ;
- }
- logical = or();
- if (logical) {
- next = this.condition(needsParens);
- if (next) {
- result = new(tree.Condition)(logical, result, next);
- } else {
- return ;
- }
- }
- return result;
- },
- conditionAnd: function (needsParens) {
- let result;
- let logical;
- let next;
- const self = this;
- function insideCondition() {
- const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);
- if (!cond && !needsParens) {
- return self.atomicCondition(needsParens);
- }
- return cond;
- }
- function and() {
- return parserInput.$str('and');
- }
-
- result = insideCondition();
- if (!result) {
- return ;
- }
- logical = and();
- if (logical) {
- next = this.conditionAnd(needsParens);
- if (next) {
- result = new(tree.Condition)(logical, result, next);
- } else {
- return ;
- }
- }
- return result;
- },
- negatedCondition: function (needsParens) {
- if (parserInput.$str('not')) {
- const result = this.parenthesisCondition(needsParens);
- if (result) {
- result.negate = !result.negate;
- }
- return result;
- }
- },
- parenthesisCondition: function (needsParens) {
- function tryConditionFollowedByParenthesis(me) {
- let body;
- parserInput.save();
- body = me.condition(needsParens);
- if (!body) {
- parserInput.restore();
- return ;
- }
- if (!parserInput.$char(')')) {
- parserInput.restore();
- return ;
- }
- parserInput.forget();
- return body;
- }
-
- let body;
- parserInput.save();
- if (!parserInput.$str('(')) {
- parserInput.restore();
- return ;
- }
- body = tryConditionFollowedByParenthesis(this);
- if (body) {
- parserInput.forget();
- return body;
- }
-
- body = this.atomicCondition(needsParens);
- if (!body) {
- parserInput.restore();
- return ;
- }
- if (!parserInput.$char(')')) {
- parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);
- return ;
- }
- parserInput.forget();
- return body;
- },
- atomicCondition: function (needsParens, preparsedCond) {
- const entities = this.entities;
- const index = parserInput.i;
- let a;
- let b;
- let c;
- let op;
-
- const cond = (function() {
- return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();
- }).bind(this);
-
- if (preparsedCond) {
- a = preparsedCond;
- } else {
- a = cond();
- }
-
- if (a) {
- if (parserInput.$char('>')) {
- if (parserInput.$char('=')) {
- op = '>=';
- } else {
- op = '>';
- }
- } else
- if (parserInput.$char('<')) {
- if (parserInput.$char('=')) {
- op = '<=';
- } else {
- op = '<';
- }
- } else
- if (parserInput.$char('=')) {
- if (parserInput.$char('>')) {
- op = '=>';
- } else if (parserInput.$char('<')) {
- op = '=<';
- } else {
- op = '=';
- }
- }
- if (op) {
- b = cond();
- if (b) {
- c = new(tree.Condition)(op, a, b, index + currentIndex, false);
- } else {
- error('expected expression');
- }
- } else if (!preparsedCond) {
- c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index + currentIndex, false);
- }
- return c;
- }
- },
-
- //
- // An operand is anything that can be part of an operation,
- // such as a Color, or a Variable
- //
- operand: function () {
- const entities = this.entities;
- let negate;
-
- if (parserInput.peek(/^-[@$(]/)) {
- negate = parserInput.$char('-');
- }
-
- let o = this.sub() || entities.dimension() ||
- entities.color() || entities.variable() ||
- entities.property() || entities.call() ||
- entities.quoted(true) || entities.colorKeyword() ||
- this.colorOperand() || entities.mixinLookup();
-
- if (negate) {
- o.parensInOp = true;
- o = new(tree.Negative)(o);
- }
-
- return o;
- },
-
- //
- // Expressions either represent mathematical operations,
- // or white-space delimited Entities.
- //
- // 1px solid black
- // @var * 2
- //
- expression: function () {
- const entities = [];
- let e;
- let delim;
- const index = parserInput.i;
-
- do {
- e = this.comment();
- if (e && !e.isLineComment) {
- entities.push(e);
- continue;
- }
- e = this.addition() || this.entity();
-
- if (e instanceof tree.Comment) {
- e = null;
- }
-
- if (e) {
- entities.push(e);
- // operations do not allow keyword "/" dimension (e.g. small/20px) so we support that here
- if (!parserInput.peek(/^\/[/*]/)) {
- delim = parserInput.$char('/');
- if (delim) {
- entities.push(new(tree.Anonymous)(delim, index + currentIndex));
- }
- }
- }
- } while (e);
- if (entities.length > 0) {
- return new(tree.Expression)(entities);
- }
- },
- property: function () {
- const name = parserInput.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);
- if (name) {
- return name[1];
- }
- },
- ruleProperty: function () {
- let name = [];
- const index = [];
- let s;
- let k;
-
- parserInput.save();
-
- const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\s*:/);
- if (simpleProperty) {
- name = [new(tree.Keyword)(simpleProperty[1])];
- parserInput.forget();
- return name;
- }
-
- function match(re) {
- const i = parserInput.i;
- const chunk = parserInput.$re(re);
- if (chunk) {
- index.push(i);
- return name.push(chunk[1]);
- }
- }
-
- match(/^(\*?)/);
- while (true) {
- if (!match(/^((?:[\w-]+)|(?:[@$]\{[\w-]+\}))/)) {
- break;
- }
- }
-
- if ((name.length > 1) && match(/^((?:\+_|\+)?)\s*:/)) {
- parserInput.forget();
-
- // at last, we have the complete match now. move forward,
- // convert name particles to tree objects and return:
- if (name[0] === '') {
- name.shift();
- index.shift();
- }
- for (k = 0; k < name.length; k++) {
- s = name[k];
- name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?
- new(tree.Keyword)(s) :
- (s.charAt(0) === '@' ?
- new(tree.Variable)(`@${s.slice(2, -1)}`, index[k] + currentIndex, fileInfo) :
- new(tree.Property)(`$${s.slice(2, -1)}`, index[k] + currentIndex, fileInfo));
- }
- return name;
- }
- parserInput.restore();
- }
- }
- };
- };
- Parser.serializeVars = vars => {
- let s = '';
-
- for (const name in vars) {
- if (Object.hasOwnProperty.call(vars, name)) {
- const value = vars[name];
- s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;
- }
- }
-
- return s;
- };
-
- const Selector = function(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {
- this.extendList = extendList;
- this.condition = condition;
- this.evaldCondition = !condition;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.elements = this.getElements(elements);
- this.mixinElements_ = undefined;
- this.copyVisibilityInfo(visibilityInfo);
- this.setParent(this.elements, this);
- };
-
- Selector.prototype = Object.assign(new Node(), {
- type: 'Selector',
-
- accept(visitor) {
- if (this.elements) {
- this.elements = visitor.visitArray(this.elements);
- }
- if (this.extendList) {
- this.extendList = visitor.visitArray(this.extendList);
- }
- if (this.condition) {
- this.condition = visitor.visit(this.condition);
- }
- },
-
- createDerived(elements, extendList, evaldCondition) {
- elements = this.getElements(elements);
- const newSelector = new Selector(elements, extendList || this.extendList,
- null, this.getIndex(), this.fileInfo(), this.visibilityInfo());
- newSelector.evaldCondition = (!isNullOrUndefined(evaldCondition)) ? evaldCondition : this.evaldCondition;
- newSelector.mediaEmpty = this.mediaEmpty;
- return newSelector;
- },
-
- getElements(els) {
- if (!els) {
- return [new Element('', '&', false, this._index, this._fileInfo)];
- }
- if (typeof els === 'string') {
- new Parser(this.parse.context, this.parse.importManager, this._fileInfo, this._index).parseNode(
- els,
- ['selector'],
- function(err, result) {
- if (err) {
- throw new LessError({
- index: err.index,
- message: err.message
- }, this.parse.imports, this._fileInfo.filename);
- }
- els = result[0].elements;
- });
- }
- return els;
- },
-
- createEmptySelectors() {
- const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];
- sels[0].mediaEmpty = true;
- return sels;
- },
-
- match(other) {
- const elements = this.elements;
- const len = elements.length;
- let olen;
- let i;
-
- other = other.mixinElements();
- olen = other.length;
- if (olen === 0 || len < olen) {
- return 0;
- } else {
- for (i = 0; i < olen; i++) {
- if (elements[i].value !== other[i]) {
- return 0;
- }
- }
- }
-
- return olen; // return number of matched elements
- },
-
- mixinElements() {
- if (this.mixinElements_) {
- return this.mixinElements_;
- }
-
- let elements = this.elements.map( function(v) {
- return v.combinator.value + (v.value.value || v.value);
- }).join('').match(/[,*.\w-]([\w-]|(\\.))*/g);
-
- if (elements) {
- if (elements[0] === '&') {
- elements.shift();
- }
- } else {
- elements = [];
- }
-
- return (this.mixinElements_ = elements);
- },
-
- isJustParentSelector() {
- return !this.mediaEmpty &&
- this.elements.length === 1 &&
- this.elements[0].value === '&' &&
- (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');
- },
-
- eval(context) {
- const evaldCondition = this.condition && this.condition.eval(context);
- let elements = this.elements;
- let extendList = this.extendList;
-
- if (elements) {
- const evaldElements = new Array(elements.length);
- for (let i = 0; i < elements.length; i++) {
- evaldElements[i] = elements[i].eval(context);
- }
- elements = evaldElements;
- }
- if (extendList) {
- const evaldExtends = new Array(extendList.length);
- for (let i = 0; i < extendList.length; i++) {
- evaldExtends[i] = extendList[i].eval(context);
- }
- extendList = evaldExtends;
- }
-
- return this.createDerived(elements, extendList, evaldCondition);
- },
-
- genCSS(context, output) {
- let i, element;
- if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {
- output.add(' ', this.fileInfo(), this.getIndex());
- }
- for (i = 0; i < this.elements.length; i++) {
- element = this.elements[i];
- element.genCSS(context, output);
- }
- },
-
- getIsOutput() {
- return this.evaldCondition;
- }
- });
-
- const Keyword = function(value) {
- this.value = value;
- };
-
- Keyword.prototype = Object.assign(new Node(), {
- type: 'Keyword',
-
- genCSS(context, output) {
- if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }
- output.add(this.value);
- }
- });
-
- Keyword.True = new Keyword('true');
- Keyword.False = new Keyword('false');
-
- const MATH$1 = Math$1;
-
- function evalName(context, name) {
- let value = '';
- let i;
- const n = name.length;
- const output = {add: function (s) {value += s;}};
- for (i = 0; i < n; i++) {
- name[i].eval(context).genCSS(context, output);
- }
- return value;
- }
-
- const Declaration = function(name, value, important, merge, index, currentFileInfo, inline, variable) {
- this.name = name;
- this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);
- this.important = important ? ` ${important.trim()}` : '';
- this.merge = merge;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.inline = inline || false;
- this.variable = (variable !== undefined) ? variable
- : (name.charAt && (name.charAt(0) === '@'));
- this.allowRoot = true;
- this.setParent(this.value, this);
- };
-
- Declaration.prototype = Object.assign(new Node(), {
- type: 'Declaration',
-
- genCSS(context, output) {
- output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());
- try {
- this.value.genCSS(context, output);
- }
- catch (e) {
- e.index = this._index;
- e.filename = this._fileInfo.filename;
- throw e;
- }
- output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);
- },
-
- eval(context) {
- let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;
- if (typeof name !== 'string') {
- // expand 'primitive' name directly to get
- // things faster (~10% for benchmark.less):
- name = (name.length === 1) && (name[0] instanceof Keyword) ?
- name[0].value : evalName(context, name);
- variable = false; // never treat expanded interpolation as new variable name
- }
-
- // @todo remove when parens-division is default
- if (name === 'font' && context.math === MATH$1.ALWAYS) {
- mathBypass = true;
- prevMath = context.math;
- context.math = MATH$1.PARENS_DIVISION;
- }
- try {
- context.importantScope.push({});
- evaldValue = this.value.eval(context);
-
- if (!this.variable && evaldValue.type === 'DetachedRuleset') {
- throw { message: 'Rulesets cannot be evaluated on a property.',
- index: this.getIndex(), filename: this.fileInfo().filename };
- }
- let important = this.important;
- const importantResult = context.importantScope.pop();
- if (!important && importantResult.important) {
- important = importantResult.important;
- }
-
- return new Declaration(name,
- evaldValue,
- important,
- this.merge,
- this.getIndex(), this.fileInfo(), this.inline,
- variable);
- }
- catch (e) {
- if (typeof e.index !== 'number') {
- e.index = this.getIndex();
- e.filename = this.fileInfo().filename;
- }
- throw e;
- }
- finally {
- if (mathBypass) {
- context.math = prevMath;
- }
- }
- },
-
- makeImportant() {
- return new Declaration(this.name,
- this.value,
- '!important',
- this.merge,
- this.getIndex(), this.fileInfo(), this.inline);
- }
- });
-
- const defaultFunc = {
- eval: function () {
- const v = this.value_;
- const e = this.error_;
- if (e) {
- throw e;
- }
- if (!isNullOrUndefined(v)) {
- return v ? Keyword.True : Keyword.False;
- }
- },
- value: function (v) {
- this.value_ = v;
- },
- error: function (e) {
- this.error_ = e;
- },
- reset: function () {
- this.value_ = this.error_ = null;
- }
- };
-
- const Ruleset = function(selectors, rules, strictImports, visibilityInfo) {
- this.selectors = selectors;
- this.rules = rules;
- this._lookups = {};
- this._variables = null;
- this._properties = null;
- this.strictImports = strictImports;
- this.copyVisibilityInfo(visibilityInfo);
- this.allowRoot = true;
-
- this.setParent(this.selectors, this);
- this.setParent(this.rules, this);
- };
-
- Ruleset.prototype = Object.assign(new Node(), {
- type: 'Ruleset',
- isRuleset: true,
-
- isRulesetLike() { return true; },
-
- accept(visitor) {
- if (this.paths) {
- this.paths = visitor.visitArray(this.paths, true);
- } else if (this.selectors) {
- this.selectors = visitor.visitArray(this.selectors);
- }
- if (this.rules && this.rules.length) {
- this.rules = visitor.visitArray(this.rules);
- }
- },
-
- eval(context) {
- let selectors;
- let selCnt;
- let selector;
- let i;
- let hasVariable;
- let hasOnePassingSelector = false;
-
- if (this.selectors && (selCnt = this.selectors.length)) {
- selectors = new Array(selCnt);
- defaultFunc.error({
- type: 'Syntax',
- message: 'it is currently only allowed in parametric mixin guards,'
- });
-
- for (i = 0; i < selCnt; i++) {
- selector = this.selectors[i].eval(context);
- for (let j = 0; j < selector.elements.length; j++) {
- if (selector.elements[j].isVariable) {
- hasVariable = true;
- break;
- }
- }
- selectors[i] = selector;
- if (selector.evaldCondition) {
- hasOnePassingSelector = true;
- }
- }
-
- if (hasVariable) {
- const toParseSelectors = new Array(selCnt);
- for (i = 0; i < selCnt; i++) {
- selector = selectors[i];
- toParseSelectors[i] = selector.toCSS(context);
- }
- const startingIndex = selectors[0].getIndex();
- const selectorFileInfo = selectors[0].fileInfo();
- new Parser(context, this.parse.importManager, selectorFileInfo, startingIndex).parseNode(
- toParseSelectors.join(','),
- ['selectors'],
- function(err, result) {
- if (result) {
- selectors = flattenArray(result);
- }
- });
- }
-
- defaultFunc.reset();
- } else {
- hasOnePassingSelector = true;
- }
-
- let rules = this.rules ? copyArray(this.rules) : null;
- const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());
- let rule;
- let subRule;
-
- ruleset.originalRuleset = this;
- ruleset.root = this.root;
- ruleset.firstRoot = this.firstRoot;
- ruleset.allowImports = this.allowImports;
-
- if (this.debugInfo) {
- ruleset.debugInfo = this.debugInfo;
- }
-
- if (!hasOnePassingSelector) {
- rules.length = 0;
- }
-
- // push the current ruleset to the frames stack
- const ctxFrames = context.frames;
-
- // inherit a function registry from the frames stack when possible;
- // otherwise from the global registry
- let foundRegistry;
- for (let fi = 0, fn = ctxFrames.length; fi !== fn; ++fi) {
- foundRegistry = ctxFrames[fi].functionRegistry;
- if (foundRegistry) { break; }
- }
- ruleset.functionRegistry = (foundRegistry || functionRegistry).inherit();
- ctxFrames.unshift(ruleset);
-
- // currrent selectors
- let ctxSelectors = context.selectors;
- if (!ctxSelectors) {
- context.selectors = ctxSelectors = [];
- }
- ctxSelectors.unshift(this.selectors);
-
- // Evaluate imports
- if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {
- ruleset.evalImports(context);
- }
-
- // Store the frames around mixin definitions,
- // so they can be evaluated like closures when the time comes.
- const rsRules = ruleset.rules;
- for (i = 0; (rule = rsRules[i]); i++) {
- if (rule.evalFirst) {
- rsRules[i] = rule.eval(context);
- }
- }
-
- const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;
-
- // Evaluate mixin calls.
- for (i = 0; (rule = rsRules[i]); i++) {
- if (rule.type === 'MixinCall') {
- /* jshint loopfunc:true */
- rules = rule.eval(context).filter(function(r) {
- if ((r instanceof Declaration) && r.variable) {
- // do not pollute the scope if the variable is
- // already there. consider returning false here
- // but we need a way to "return" variable from mixins
- return !(ruleset.variable(r.name));
- }
- return true;
- });
- rsRules.splice.apply(rsRules, [i, 1].concat(rules));
- i += rules.length - 1;
- ruleset.resetCache();
- } else if (rule.type === 'VariableCall') {
- /* jshint loopfunc:true */
- rules = rule.eval(context).rules.filter(function(r) {
- if ((r instanceof Declaration) && r.variable) {
- // do not pollute the scope at all
- return false;
- }
- return true;
- });
- rsRules.splice.apply(rsRules, [i, 1].concat(rules));
- i += rules.length - 1;
- ruleset.resetCache();
- }
- }
-
- // Evaluate everything else
- for (i = 0; (rule = rsRules[i]); i++) {
- if (!rule.evalFirst) {
- rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;
- }
- }
-
- // Evaluate everything else
- for (i = 0; (rule = rsRules[i]); i++) {
- // for rulesets, check if it is a css guard and can be removed
- if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {
- // check if it can be folded in (e.g. & where)
- if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {
- rsRules.splice(i--, 1);
-
- for (let j = 0; (subRule = rule.rules[j]); j++) {
- if (subRule instanceof Node) {
- subRule.copyVisibilityInfo(rule.visibilityInfo());
- if (!(subRule instanceof Declaration) || !subRule.variable) {
- rsRules.splice(++i, 0, subRule);
- }
- }
- }
- }
- }
- }
-
- // Pop the stack
- ctxFrames.shift();
- ctxSelectors.shift();
-
- if (context.mediaBlocks) {
- for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {
- context.mediaBlocks[i].bubbleSelectors(selectors);
- }
- }
-
- return ruleset;
- },
-
- evalImports(context) {
- const rules = this.rules;
- let i;
- let importRules;
- if (!rules) { return; }
-
- for (i = 0; i < rules.length; i++) {
- if (rules[i].type === 'Import') {
- importRules = rules[i].eval(context);
- if (importRules && (importRules.length || importRules.length === 0)) {
- rules.splice.apply(rules, [i, 1].concat(importRules));
- i += importRules.length - 1;
- } else {
- rules.splice(i, 1, importRules);
- }
- this.resetCache();
- }
- }
- },
-
- makeImportant() {
- const result = new Ruleset(this.selectors, this.rules.map(function (r) {
- if (r.makeImportant) {
- return r.makeImportant();
- } else {
- return r;
- }
- }), this.strictImports, this.visibilityInfo());
-
- return result;
- },
-
- matchArgs(args) {
- return !args || args.length === 0;
- },
-
- // lets you call a css selector with a guard
- matchCondition(args, context) {
- const lastSelector = this.selectors[this.selectors.length - 1];
- if (!lastSelector.evaldCondition) {
- return false;
- }
- if (lastSelector.condition &&
- !lastSelector.condition.eval(
- new contexts.Eval(context,
- context.frames))) {
- return false;
- }
- return true;
- },
-
- resetCache() {
- this._rulesets = null;
- this._variables = null;
- this._properties = null;
- this._lookups = {};
- },
-
- variables() {
- if (!this._variables) {
- this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {
- if (r instanceof Declaration && r.variable === true) {
- hash[r.name] = r;
- }
- // when evaluating variables in an import statement, imports have not been eval'd
- // so we need to go inside import statements.
- // guard against root being a string (in the case of inlined less)
- if (r.type === 'Import' && r.root && r.root.variables) {
- const vars = r.root.variables();
- for (const name in vars) {
- if (Object.prototype.hasOwnProperty.call(vars, name)) {
- hash[name] = r.root.variable(name);
- }
- }
- }
- return hash;
- }, {});
- }
- return this._variables;
- },
-
- properties() {
- if (!this._properties) {
- this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {
- if (r instanceof Declaration && r.variable !== true) {
- const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?
- r.name[0].value : r.name;
- // Properties don't overwrite as they can merge
- if (!hash[`$${name}`]) {
- hash[`$${name}`] = [ r ];
- }
- else {
- hash[`$${name}`].push(r);
- }
- }
- return hash;
- }, {});
- }
- return this._properties;
- },
-
- variable(name) {
- const decl = this.variables()[name];
- if (decl) {
- return this.parseValue(decl);
- }
- },
-
- property(name) {
- const decl = this.properties()[name];
- if (decl) {
- return this.parseValue(decl);
- }
- },
-
- lastDeclaration() {
- for (let i = this.rules.length; i > 0; i--) {
- const decl = this.rules[i - 1];
- if (decl instanceof Declaration) {
- return this.parseValue(decl);
- }
- }
- },
-
- parseValue(toParse) {
- const self = this;
- function transformDeclaration(decl) {
- if (decl.value instanceof Anonymous && !decl.parsed) {
- if (typeof decl.value.value === 'string') {
- new Parser(this.parse.context, this.parse.importManager, decl.fileInfo(), decl.value.getIndex()).parseNode(
- decl.value.value,
- ['value', 'important'],
- function(err, result) {
- if (err) {
- decl.parsed = true;
- }
- if (result) {
- decl.value = result[0];
- decl.important = result[1] || '';
- decl.parsed = true;
- }
- });
- } else {
- decl.parsed = true;
- }
-
- return decl;
- }
- else {
- return decl;
- }
- }
- if (!Array.isArray(toParse)) {
- return transformDeclaration.call(self, toParse);
- }
- else {
- const nodes = [];
- for (let ti = 0; ti < toParse.length; ti++) {
- nodes.push(transformDeclaration.call(self, toParse[ti]));
- }
- return nodes;
- }
- },
-
- rulesets() {
- if (!this.rules) { return []; }
-
- const filtRules = [];
- const rules = this.rules;
- let i;
- let rule;
-
- for (i = 0; (rule = rules[i]); i++) {
- if (rule.isRuleset) {
- filtRules.push(rule);
- }
- }
-
- return filtRules;
- },
-
- prependRule(rule) {
- const rules = this.rules;
- if (rules) {
- rules.unshift(rule);
- } else {
- this.rules = [ rule ];
- }
- this.setParent(rule, this);
- },
-
- find(selector, self, filter) {
- self = self || this;
- const rules = [];
- let match;
- let foundMixins;
- const key = selector.toCSS();
-
- if (key in this._lookups) { return this._lookups[key]; }
-
- this.rulesets().forEach(function (rule) {
- if (rule !== self) {
- for (let j = 0; j < rule.selectors.length; j++) {
- match = selector.match(rule.selectors[j]);
- if (match) {
- if (selector.elements.length > match) {
- if (!filter || filter(rule)) {
- foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);
- for (let i = 0; i < foundMixins.length; ++i) {
- foundMixins[i].path.push(rule);
- }
- Array.prototype.push.apply(rules, foundMixins);
- }
- } else {
- rules.push({ rule, path: []});
- }
- break;
- }
- }
- }
- });
- this._lookups[key] = rules;
- return rules;
- },
-
- genCSS(context, output) {
- let i;
- let j;
- const charsetRuleNodes = [];
- let ruleNodes = [];
-
- let // Line number debugging
- debugInfo$1;
-
- let rule;
- let path;
-
- context.tabLevel = (context.tabLevel || 0);
-
- if (!this.root) {
- context.tabLevel++;
- }
-
- const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');
- const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');
- let sep;
-
- let charsetNodeIndex = 0;
- let importNodeIndex = 0;
- for (i = 0; (rule = this.rules[i]); i++) {
- if (rule instanceof Comment) {
- if (importNodeIndex === i) {
- importNodeIndex++;
- }
- ruleNodes.push(rule);
- } else if (rule.isCharset && rule.isCharset()) {
- ruleNodes.splice(charsetNodeIndex, 0, rule);
- charsetNodeIndex++;
- importNodeIndex++;
- } else if (rule.type === 'Import') {
- ruleNodes.splice(importNodeIndex, 0, rule);
- importNodeIndex++;
- } else {
- ruleNodes.push(rule);
- }
- }
- ruleNodes = charsetRuleNodes.concat(ruleNodes);
-
- // If this is the root node, we don't render
- // a selector, or {}.
- if (!this.root) {
- debugInfo$1 = debugInfo(context, this, tabSetStr);
-
- if (debugInfo$1) {
- output.add(debugInfo$1);
- output.add(tabSetStr);
- }
-
- const paths = this.paths;
- const pathCnt = paths.length;
- let pathSubCnt;
-
- sep = context.compress ? ',' : (`,\n${tabSetStr}`);
-
- for (i = 0; i < pathCnt; i++) {
- path = paths[i];
- if (!(pathSubCnt = path.length)) { continue; }
- if (i > 0) { output.add(sep); }
-
- context.firstSelector = true;
- path[0].genCSS(context, output);
-
- context.firstSelector = false;
- for (j = 1; j < pathSubCnt; j++) {
- path[j].genCSS(context, output);
- }
- }
-
- output.add((context.compress ? '{' : ' {\n') + tabRuleStr);
- }
-
- // Compile rules and rulesets
- for (i = 0; (rule = ruleNodes[i]); i++) {
-
- if (i + 1 === ruleNodes.length) {
- context.lastRule = true;
- }
-
- const currentLastRule = context.lastRule;
- if (rule.isRulesetLike(rule)) {
- context.lastRule = false;
- }
-
- if (rule.genCSS) {
- rule.genCSS(context, output);
- } else if (rule.value) {
- output.add(rule.value.toString());
- }
-
- context.lastRule = currentLastRule;
-
- if (!context.lastRule && rule.isVisible()) {
- output.add(context.compress ? '' : (`\n${tabRuleStr}`));
- } else {
- context.lastRule = false;
- }
- }
-
- if (!this.root) {
- output.add((context.compress ? '}' : `\n${tabSetStr}}`));
- context.tabLevel--;
- }
-
- if (!output.isEmpty() && !context.compress && this.firstRoot) {
- output.add('\n');
- }
- },
-
- joinSelectors(paths, context, selectors) {
- for (let s = 0; s < selectors.length; s++) {
- this.joinSelector(paths, context, selectors[s]);
- }
- },
-
- joinSelector(paths, context, selector) {
-
- function createParenthesis(elementsToPak, originalElement) {
- let replacementParen, j;
- if (elementsToPak.length === 0) {
- replacementParen = new Paren(elementsToPak[0]);
- } else {
- const insideParent = new Array(elementsToPak.length);
- for (j = 0; j < elementsToPak.length; j++) {
- insideParent[j] = new Element(
- null,
- elementsToPak[j],
- originalElement.isVariable,
- originalElement._index,
- originalElement._fileInfo
- );
- }
- replacementParen = new Paren(new Selector(insideParent));
- }
- return replacementParen;
- }
-
- function createSelector(containedElement, originalElement) {
- let element, selector;
- element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);
- selector = new Selector([element]);
- return selector;
- }
-
- // joins selector path from `beginningPath` with selector path in `addPath`
- // `replacedElement` contains element that is being replaced by `addPath`
- // returns concatenated path
- function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {
- let newSelectorPath, lastSelector, newJoinedSelector;
- // our new selector path
- newSelectorPath = [];
-
- // construct the joined selector - if & is the first thing this will be empty,
- // if not newJoinedSelector will be the last set of elements in the selector
- if (beginningPath.length > 0) {
- newSelectorPath = copyArray(beginningPath);
- lastSelector = newSelectorPath.pop();
- newJoinedSelector = originalSelector.createDerived(copyArray(lastSelector.elements));
- }
- else {
- newJoinedSelector = originalSelector.createDerived([]);
- }
-
- if (addPath.length > 0) {
- // /deep/ is a CSS4 selector - (removed, so should deprecate)
- // that is valid without anything in front of it
- // so if the & does not have a combinator that is "" or " " then
- // and there is a combinator on the parent, then grab that.
- // this also allows + a { & .b { .a & { ... though not sure why you would want to do that
- let combinator = replacedElement.combinator;
-
- const parentEl = addPath[0].elements[0];
- if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {
- combinator = parentEl.combinator;
- }
- // join the elements so far with the first part of the parent
- newJoinedSelector.elements.push(new Element(
- combinator,
- parentEl.value,
- replacedElement.isVariable,
- replacedElement._index,
- replacedElement._fileInfo
- ));
- newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));
- }
-
- // now add the joined selector - but only if it is not empty
- if (newJoinedSelector.elements.length !== 0) {
- newSelectorPath.push(newJoinedSelector);
- }
-
- // put together the parent selectors after the join (e.g. the rest of the parent)
- if (addPath.length > 1) {
- let restOfPath = addPath.slice(1);
- restOfPath = restOfPath.map(function (selector) {
- return selector.createDerived(selector.elements, []);
- });
- newSelectorPath = newSelectorPath.concat(restOfPath);
- }
- return newSelectorPath;
- }
-
- // joins selector path from `beginningPath` with every selector path in `addPaths` array
- // `replacedElement` contains element that is being replaced by `addPath`
- // returns array with all concatenated paths
- function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {
- let j;
- for (j = 0; j < beginningPath.length; j++) {
- const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);
- result.push(newSelectorPath);
- }
- return result;
- }
-
- function mergeElementsOnToSelectors(elements, selectors) {
- let i, sel;
-
- if (elements.length === 0) {
- return ;
- }
- if (selectors.length === 0) {
- selectors.push([ new Selector(elements) ]);
- return;
- }
-
- for (i = 0; (sel = selectors[i]); i++) {
- // if the previous thing in sel is a parent this needs to join on to it
- if (sel.length > 0) {
- sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));
- }
- else {
- sel.push(new Selector(elements));
- }
- }
- }
-
- // replace all parent selectors inside `inSelector` by content of `context` array
- // resulting selectors are returned inside `paths` array
- // returns true if `inSelector` contained at least one parent selector
- function replaceParentSelector(paths, context, inSelector) {
- // The paths are [[Selector]]
- // The first list is a list of comma separated selectors
- // The inner list is a list of inheritance separated selectors
- // e.g.
- // .a, .b {
- // .c {
- // }
- // }
- // == [[.a] [.c]] [[.b] [.c]]
- //
- let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;
- function findNestedSelector(element) {
- let maybeSelector;
- if (!(element.value instanceof Paren)) {
- return null;
- }
-
- maybeSelector = element.value.value;
- if (!(maybeSelector instanceof Selector)) {
- return null;
- }
-
- return maybeSelector;
- }
-
- // the elements from the current selector so far
- currentElements = [];
- // the current list of new selectors to add to the path.
- // We will build it up. We initiate it with one empty selector as we "multiply" the new selectors
- // by the parents
- newSelectors = [
- []
- ];
-
- for (i = 0; (el = inSelector.elements[i]); i++) {
- // non parent reference elements just get added
- if (el.value !== '&') {
- const nestedSelector = findNestedSelector(el);
- if (nestedSelector !== null) {
- // merge the current list of non parent selector elements
- // on to the current list of selectors to add
- mergeElementsOnToSelectors(currentElements, newSelectors);
-
- const nestedPaths = [];
- let replaced;
- const replacedNewSelectors = [];
-
- // Check if this is a comma-separated selector list inside the paren
- // e.g. :not(&.a, &.b) produces Selector([Selector, Anonymous(','), Selector])
- const hasSubSelectors = nestedSelector.elements.some(e => e instanceof Selector);
-
- if (hasSubSelectors) {
- // Process each sub-selector individually
- const resolvedElements = [];
- for (const subEl of nestedSelector.elements) {
- if (subEl instanceof Selector) {
- const subPaths = [];
- const subReplaced = replaceParentSelector(subPaths, context, subEl);
- replaced = replaced || subReplaced;
- if (subPaths.length > 0 && subPaths[0].length > 0) {
- resolvedElements.push(subPaths[0][0]);
- } else {
- resolvedElements.push(subEl);
- }
- } else {
- resolvedElements.push(subEl);
- }
- }
- hadParentSelector = hadParentSelector || replaced;
- const resolvedNestedSelector = new Selector(resolvedElements);
- const replacementSelector = createSelector(createParenthesis([resolvedNestedSelector], el), el);
- addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);
- } else {
- replaced = replaceParentSelector(nestedPaths, context, nestedSelector);
- hadParentSelector = hadParentSelector || replaced;
- // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors
- for (k = 0; k < nestedPaths.length; k++) {
- const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);
- addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);
- }
- }
- newSelectors = replacedNewSelectors;
- currentElements = [];
- } else {
- currentElements.push(el);
- }
-
- } else {
- hadParentSelector = true;
- // the new list of selectors to add
- selectorsMultiplied = [];
-
- // merge the current list of non parent selector elements
- // on to the current list of selectors to add
- mergeElementsOnToSelectors(currentElements, newSelectors);
-
- // loop through our current selectors
- for (j = 0; j < newSelectors.length; j++) {
- sel = newSelectors[j];
- // if we don't have any parent paths, the & might be in a mixin so that it can be used
- // whether there are parents or not
- if (context.length === 0) {
- // the combinator used on el should now be applied to the next element instead so that
- // it is not lost
- if (sel.length > 0) {
- sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));
- }
- selectorsMultiplied.push(sel);
- }
- else {
- // and the parent selectors
- for (k = 0; k < context.length; k++) {
- // We need to put the current selectors
- // then join the last selector's elements on to the parents selectors
- const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);
- // add that to our new set of selectors
- selectorsMultiplied.push(newSelectorPath);
- }
- }
- }
-
- // our new selectors has been multiplied, so reset the state
- newSelectors = selectorsMultiplied;
- currentElements = [];
- }
- }
-
- // if we have any elements left over (e.g. .a& .b == .b)
- // add them on to all the current selectors
- mergeElementsOnToSelectors(currentElements, newSelectors);
-
- for (i = 0; i < newSelectors.length; i++) {
- length = newSelectors[i].length;
- if (length > 0) {
- paths.push(newSelectors[i]);
- lastSelector = newSelectors[i][length - 1];
- newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);
- }
- }
-
- return hadParentSelector;
- }
-
- function deriveSelector(visibilityInfo, deriveFrom) {
- const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);
- newSelector.copyVisibilityInfo(visibilityInfo);
- return newSelector;
- }
-
- // joinSelector code follows
- let i, newPaths, hadParentSelector;
-
- newPaths = [];
- hadParentSelector = replaceParentSelector(newPaths, context, selector);
-
- if (!hadParentSelector) {
- if (context.length > 0) {
- newPaths = [];
- for (i = 0; i < context.length; i++) {
-
- const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));
-
- concatenated.push(selector);
- newPaths.push(concatenated);
- }
- }
- else {
- newPaths = [[selector]];
- }
- }
-
- for (i = 0; i < newPaths.length; i++) {
- paths.push(newPaths[i]);
- }
-
- }
- });
-
- const NestableAtRulePrototype = {
-
- isRulesetLike() {
- return true;
- },
-
- accept(visitor) {
- if (this.features) {
- this.features = visitor.visit(this.features);
- }
- if (this.rules) {
- this.rules = visitor.visitArray(this.rules);
- }
- },
-
- evalFunction: function () {
- if (!this.features || !Array.isArray(this.features.value) || this.features.value.length < 1) {
- return;
- }
-
- const exprValues = this.features.value;
- let expr, paren;
-
- for (let index = 0; index < exprValues.length; ++index) {
- expr = exprValues[index];
-
- if ((expr.type === 'Keyword' || expr.type === 'Variable')
- && index + 1 < exprValues.length
- && (expr.noSpacing || expr.noSpacing == null)) {
- paren = exprValues[index + 1];
-
- if (paren.type === 'Paren' && paren.noSpacing) {
- exprValues[index]= new Expression([expr, paren]);
- exprValues.splice(index + 1, 1);
- exprValues[index].noSpacing = true;
- }
- }
- }
- },
-
- evalTop(context) {
- this.evalFunction();
-
- let result = this;
-
- // Render all dependent Media blocks.
- if (context.mediaBlocks.length > 1) {
- const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();
- result = new Ruleset(selectors, context.mediaBlocks);
- result.multiMedia = true;
- result.copyVisibilityInfo(this.visibilityInfo());
- this.setParent(result, this);
- }
-
- delete context.mediaBlocks;
- delete context.mediaPath;
-
- return result;
- },
-
- evalNested(context) {
- this.evalFunction();
-
- let i;
- let value;
- const path = context.mediaPath.concat([this]);
-
- // Extract the media-query conditions separated with `,` (OR).
- for (i = 0; i < path.length; i++) {
- if (path[i].type !== this.type) {
- const blockIndex = context.mediaBlocks.indexOf(this);
- if (blockIndex > -1) {
- context.mediaBlocks.splice(blockIndex, 1);
- }
- return this;
- }
-
- value = path[i].features instanceof Value ?
- path[i].features.value : path[i].features;
- path[i] = Array.isArray(value) ? value : [value];
- }
-
- // Trace all permutations to generate the resulting media-query.
- //
- // (a, b and c) with nested (d, e) ->
- // a and d
- // a and e
- // b and c and d
- // b and c and e
- this.features = new Value(this.permute(path).map(path => {
- path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));
-
- for (i = path.length - 1; i > 0; i--) {
- path.splice(i, 0, new Anonymous('and'));
- }
-
- return new Expression(path);
- }));
- this.setParent(this.features, this);
-
- // Fake a tree-node that doesn't output anything.
- return new Ruleset([], []);
- },
-
- permute(arr) {
- if (arr.length === 0) {
- return [];
- } else if (arr.length === 1) {
- return arr[0];
- } else {
- const result = [];
- const rest = this.permute(arr.slice(1));
- for (let i = 0; i < rest.length; i++) {
- for (let j = 0; j < arr[0].length; j++) {
- result.push([arr[0][j]].concat(rest[i]));
- }
- }
- return result;
- }
- },
-
- bubbleSelectors(selectors) {
- if (!selectors) {
- return;
- }
- this.rules = [new Ruleset(copyArray(selectors), [this.rules[0]])];
- this.setParent(this.rules, this);
- }
- };
-
- const AtRule = function(
- name,
- value,
- rules,
- index,
- currentFileInfo,
- debugInfo,
- isRooted,
- visibilityInfo
- ) {
- let i;
- var selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();
-
- this.name = name;
- this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);
- if (rules) {
- if (Array.isArray(rules)) {
- const allDeclarations = this.declarationsBlock(rules);
-
- let allRulesetDeclarations = true;
- rules.forEach(rule => {
- if (rule.type === 'Ruleset' && rule.rules) allRulesetDeclarations = allRulesetDeclarations && this.declarationsBlock(rule.rules, true);
- });
-
- if (allDeclarations && !isRooted) {
- this.simpleBlock = true;
- this.declarations = rules;
- } else if (allRulesetDeclarations && rules.length === 1 && !isRooted && !value) {
- this.simpleBlock = true;
- this.declarations = rules[0].rules ? rules[0].rules : rules;
- } else {
- this.rules = rules;
- }
- } else {
- const allDeclarations = this.declarationsBlock(rules.rules);
-
- if (allDeclarations && !isRooted && !value) {
- this.simpleBlock = true;
- this.declarations = rules.rules;
- } else {
- this.rules = [rules];
- this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();
- }
- }
- if (!this.simpleBlock) {
- for (i = 0; i < this.rules.length; i++) {
- this.rules[i].allowImports = true;
- }
- }
- this.setParent(selectors, this);
- this.setParent(this.rules, this);
- }
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.debugInfo = debugInfo;
- this.isRooted = isRooted || false;
- this.copyVisibilityInfo(visibilityInfo);
- this.allowRoot = true;
- };
-
- AtRule.prototype = Object.assign(new Node(), {
- type: 'AtRule',
-
- ...NestableAtRulePrototype,
-
- declarationsBlock(rules, mergeable = false) {
- if (!mergeable) {
- return rules.filter(function (node) { return (node.type === 'Declaration' || node.type === 'Comment') && !node.merge}).length === rules.length;
- } else {
- return rules.filter(function (node) { return (node.type === 'Declaration' || node.type === 'Comment'); }).length === rules.length;
- }
- },
-
- keywordList(rules) {
- if (!Array.isArray(rules)) {
- return false;
- } else {
- return rules.filter(function (node) { return (node.type === 'Keyword' || node.type === 'Comment'); }).length === rules.length;
- }
- },
-
- accept(visitor) {
- const value = this.value, rules = this.rules, declarations = this.declarations;
-
- if (rules) {
- this.rules = visitor.visitArray(rules);
- } else if (declarations) {
- this.declarations = visitor.visitArray(declarations);
- }
- if (value) {
- this.value = visitor.visit(value);
- }
- },
-
- isRulesetLike() {
- return this.rules || !this.isCharset();
- },
-
- isCharset() {
- return '@charset' === this.name;
- },
-
- genCSS(context, output) {
- const value = this.value, rules = this.rules || this.declarations;
- output.add(this.name, this.fileInfo(), this.getIndex());
- if (value) {
- output.add(' ');
- value.genCSS(context, output);
- }
- if (this.simpleBlock) {
- this.outputRuleset(context, output, this.declarations);
- } else if (rules) {
- this.outputRuleset(context, output, rules);
- } else {
- output.add(';');
- }
- },
-
- eval(context) {
- let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules || this.declarations;
-
- // media stored inside other atrule should not bubble over it
- // backpup media bubbling information
- mediaPathBackup = context.mediaPath;
- mediaBlocksBackup = context.mediaBlocks;
- // deleted media bubbling information
- context.mediaPath = [];
- context.mediaBlocks = [];
-
- if (value) {
- value = value.eval(context);
- }
-
- if (rules) {
- rules = this.evalRoot(context, rules);
- }
- if (Array.isArray(rules) && rules[0].rules && Array.isArray(rules[0].rules) && rules[0].rules.length) {
- const allMergeableDeclarations = this.declarationsBlock(rules[0].rules, true);
- if (allMergeableDeclarations && !this.isRooted && !value) {
- mergeRules(rules[0].rules);
- rules = rules[0].rules;
- rules.forEach(rule => rule.merge = false);
- }
- }
- if (this.simpleBlock && rules) {
- rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();
- rules = rules.map(function (rule) { return rule.eval(context); });
- }
-
- // restore media bubbling information
- context.mediaPath = mediaPathBackup;
- context.mediaBlocks = mediaBlocksBackup;
- return new AtRule(this.name, value, rules, this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());
- },
-
- evalRoot(context, rules) {
- let ampersandCount = 0;
- let noAmpersandCount = 0;
- let noAmpersands = true;
-
- if (!this.simpleBlock) {
- rules = [rules[0].eval(context)];
- }
-
- let precedingSelectors = [];
- if (context.frames.length > 0) {
- for (let index = 0; index < context.frames.length; index++) {
- const frame = context.frames[index];
- if (
- frame.type === 'Ruleset' &&
- frame.rules &&
- frame.rules.length > 0
- ) {
- if (frame && !frame.root && frame.selectors && frame.selectors.length > 0) {
- precedingSelectors = precedingSelectors.concat(frame.selectors);
- }
- }
- if (precedingSelectors.length > 0) {
- const allAmpersandElements = precedingSelectors.every(
- sel => sel.elements && sel.elements.length > 0 && sel.elements.every(
- el => el.value === '&'
- )
- );
- if (allAmpersandElements) {
- noAmpersands = false;
- noAmpersandCount++;
- } else {
- ampersandCount++;
- }
- }
- }
- }
-
- const mixedAmpersands = ampersandCount > 0 && noAmpersandCount > 0 && !noAmpersands;
- if (
- (this.isRooted && ampersandCount > 0 && noAmpersandCount === 0 && noAmpersands)
- || !mixedAmpersands
- ) {
- rules[0].root = true;
- }
- return rules;
- },
-
- variable(name) {
- if (this.rules) {
- // assuming that there is only one rule at this point - that is how parser constructs the rule
- return Ruleset.prototype.variable.call(this.rules[0], name);
- }
- },
-
- find() {
- if (this.rules) {
- // assuming that there is only one rule at this point - that is how parser constructs the rule
- return Ruleset.prototype.find.apply(this.rules[0], arguments);
- }
- },
-
- rulesets() {
- if (this.rules) {
- // assuming that there is only one rule at this point - that is how parser constructs the rule
- return Ruleset.prototype.rulesets.apply(this.rules[0]);
- }
- },
-
- outputRuleset(context, output, rules) {
- const ruleCnt = rules.length;
- let i;
- context.tabLevel = (context.tabLevel | 0) + 1;
-
- // Compressed
- if (context.compress) {
- output.add('{');
- for (i = 0; i < ruleCnt; i++) {
- rules[i].genCSS(context, output);
- }
- output.add('}');
- context.tabLevel--;
- return;
- }
-
- // Non-compressed
- const tabSetStr = `\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;
- if (!ruleCnt) {
- output.add(` {${tabSetStr}}`);
- } else {
- output.add(` {${tabRuleStr}`);
- rules[0].genCSS(context, output);
- for (i = 1; i < ruleCnt; i++) {
- output.add(tabRuleStr);
- rules[i].genCSS(context, output);
- }
- output.add(`${tabSetStr}}`);
- }
-
- context.tabLevel--;
- }
- });
-
- const DetachedRuleset = function(ruleset, frames) {
- this.ruleset = ruleset;
- this.frames = frames;
- this.setParent(this.ruleset, this);
- };
-
- DetachedRuleset.prototype = Object.assign(new Node(), {
- type: 'DetachedRuleset',
- evalFirst: true,
-
- accept(visitor) {
- this.ruleset = visitor.visit(this.ruleset);
- },
-
- eval(context) {
- const frames = this.frames || copyArray(context.frames);
- return new DetachedRuleset(this.ruleset, frames);
- },
-
- callEval(context) {
- return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);
- }
- });
-
- const MATH = Math$1;
-
-
- const Operation = function(op, operands, isSpaced) {
- this.op = op.trim();
- this.operands = operands;
- this.isSpaced = isSpaced;
- };
-
- Operation.prototype = Object.assign(new Node(), {
- type: 'Operation',
-
- accept(visitor) {
- this.operands = visitor.visitArray(this.operands);
- },
-
- eval(context) {
- let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;
-
- if (context.isMathOn(this.op)) {
- op = this.op === './' ? '/' : this.op;
- if (a instanceof Dimension && b instanceof Color) {
- a = a.toColor();
- }
- if (b instanceof Dimension && a instanceof Color) {
- b = b.toColor();
- }
- if (!a.operate || !b.operate) {
- if (
- (a instanceof Operation || b instanceof Operation)
- && a.op === '/' && context.math === MATH.PARENS_DIVISION
- ) {
- return new Operation(this.op, [a, b], this.isSpaced);
- }
- throw { type: 'Operation',
- message: 'Operation on an invalid type' };
- }
-
- return a.operate(context, op, b);
- } else {
- return new Operation(this.op, [a, b], this.isSpaced);
- }
- },
-
- genCSS(context, output) {
- this.operands[0].genCSS(context, output);
- if (this.isSpaced) {
- output.add(' ');
- }
- output.add(this.op);
- if (this.isSpaced) {
- output.add(' ');
- }
- this.operands[1].genCSS(context, output);
- }
- });
-
- class functionCaller {
- constructor(name, context, index, currentFileInfo) {
- this.name = name.toLowerCase();
- this.index = index;
- this.context = context;
- this.currentFileInfo = currentFileInfo;
-
- this.func = context.frames[0].functionRegistry.get(this.name);
- }
-
- isValid() {
- return Boolean(this.func);
- }
-
- call(args) {
- if (!(Array.isArray(args))) {
- args = [args];
- }
- const evalArgs = this.func.evalArgs;
- if (evalArgs !== false) {
- args = args.map(a => a.eval(this.context));
- }
- const commentFilter = item => !(item.type === 'Comment');
-
- // This code is terrible and should be replaced as per this issue...
- // https://github.com/less/less.js/issues/2477
- args = args
- .filter(commentFilter)
- .map(item => {
- if (item.type === 'Expression') {
- const subNodes = item.value.filter(commentFilter);
- if (subNodes.length === 1) {
- // https://github.com/less/less.js/issues/3616
- if (item.parens && subNodes[0].op === '/') {
- return item;
- }
- return subNodes[0];
- } else {
- return new Expression(subNodes);
- }
- }
- return item;
- });
-
- if (evalArgs === false) {
- return this.func(this.context, ...args);
- }
-
- return this.func(...args);
- }
- }
-
- //
- // A function call node.
- //
- const Call = function(name, args, index, currentFileInfo) {
- this.name = name;
- this.args = args;
- this.calc = name === 'calc';
- this._index = index;
- this._fileInfo = currentFileInfo;
- };
-
- Call.prototype = Object.assign(new Node(), {
- type: 'Call',
-
- accept(visitor) {
- if (this.args) {
- this.args = visitor.visitArray(this.args);
- }
- },
-
- //
- // When evaluating a function call,
- // we either find the function in the functionRegistry,
- // in which case we call it, passing the evaluated arguments,
- // if this returns null or we cannot find the function, we
- // simply print it out as it appeared originally [2].
- //
- // The reason why we evaluate the arguments, is in the case where
- // we try to pass a variable to a function, like: `saturate(@color)`.
- // The function should receive the value, not the variable.
- //
- eval(context) {
- /**
- * Turn off math for calc(), and switch back on for evaluating nested functions
- */
- const currentMathContext = context.mathOn;
- context.mathOn = !this.calc;
- if (this.calc || context.inCalc) {
- context.enterCalc();
- }
-
- const exitCalc = () => {
- if (this.calc || context.inCalc) {
- context.exitCalc();
- }
- context.mathOn = currentMathContext;
- };
-
- let result;
- const funcCaller = new functionCaller(this.name, context, this.getIndex(), this.fileInfo());
-
- if (funcCaller.isValid()) {
- try {
- result = funcCaller.call(this.args);
- exitCalc();
- } catch (e) {
- // eslint-disable-next-line no-prototype-builtins
- if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {
- throw e;
- }
- throw {
- type: e.type || 'Runtime',
- message: `Error evaluating function \`${this.name}\`${e.message ? `: ${e.message}` : ''}`,
- index: this.getIndex(),
- filename: this.fileInfo().filename,
- line: e.lineNumber,
- column: e.columnNumber
- };
- }
- }
-
- if (result !== null && result !== undefined) {
- // Results that that are not nodes are cast as Anonymous nodes
- // Falsy values or booleans are returned as empty nodes
- if (!(result instanceof Node)) {
- if (!result || result === true) {
- result = new Anonymous(null);
- }
- else {
- result = new Anonymous(result.toString());
- }
-
- }
- result._index = this._index;
- result._fileInfo = this._fileInfo;
- return result;
- }
-
- const args = this.args.map(a => a.eval(context));
- exitCalc();
-
- return new Call(this.name, args, this.getIndex(), this.fileInfo());
- },
-
- genCSS(context, output) {
- output.add(`${this.name}(`, this.fileInfo(), this.getIndex());
-
- for (let i = 0; i < this.args.length; i++) {
- this.args[i].genCSS(context, output);
- if (i + 1 < this.args.length) {
- output.add(', ');
- }
- }
-
- output.add(')');
- }
- });
-
- const Variable = function(name, index, currentFileInfo) {
- this.name = name;
- this._index = index;
- this._fileInfo = currentFileInfo;
- };
-
- Variable.prototype = Object.assign(new Node(), {
- type: 'Variable',
-
- eval(context) {
- let variable, name = this.name;
-
- if (name.indexOf('@@') === 0) {
- name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;
- }
-
- if (this.evaluating) {
- throw { type: 'Name',
- message: `Recursive variable definition for ${name}`,
- filename: this.fileInfo().filename,
- index: this.getIndex() };
- }
-
- this.evaluating = true;
-
- variable = this.find(context.frames, function (frame) {
- const v = frame.variable(name);
- if (v) {
- if (v.important) {
- const importantScope = context.importantScope[context.importantScope.length - 1];
- importantScope.important = v.important;
- }
- // If in calc, wrap vars in a function call to cascade evaluate args first
- if (context.inCalc) {
- return (new Call('_SELF', [v.value])).eval(context);
- }
- else {
- return v.value.eval(context);
- }
- }
- });
- if (variable) {
- this.evaluating = false;
- return variable;
- } else {
- throw { type: 'Name',
- message: `variable ${name} is undefined`,
- filename: this.fileInfo().filename,
- index: this.getIndex() };
- }
- },
-
- find(obj, fun) {
- for (let i = 0, r; i < obj.length; i++) {
- r = fun.call(obj, obj[i]);
- if (r) { return r; }
- }
- return null;
- }
- });
-
- const Property = function(name, index, currentFileInfo) {
- this.name = name;
- this._index = index;
- this._fileInfo = currentFileInfo;
- };
-
- Property.prototype = Object.assign(new Node(), {
- type: 'Property',
-
- eval(context) {
- let property;
- const name = this.name;
- // TODO: shorten this reference
- const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;
-
- if (this.evaluating) {
- throw { type: 'Name',
- message: `Recursive property reference for ${name}`,
- filename: this.fileInfo().filename,
- index: this.getIndex() };
- }
-
- this.evaluating = true;
-
- property = this.find(context.frames, function (frame) {
- let v;
- const vArr = frame.property(name);
- if (vArr) {
- for (let i = 0; i < vArr.length; i++) {
- v = vArr[i];
-
- vArr[i] = new Declaration(v.name,
- v.value,
- v.important,
- v.merge,
- v.index,
- v.currentFileInfo,
- v.inline,
- v.variable
- );
- }
- mergeRules(vArr);
-
- v = vArr[vArr.length - 1];
- if (v.important) {
- const importantScope = context.importantScope[context.importantScope.length - 1];
- importantScope.important = v.important;
- }
- v = v.value.eval(context);
- return v;
- }
- });
- if (property) {
- this.evaluating = false;
- return property;
- } else {
- throw { type: 'Name',
- message: `Property '${name}' is undefined`,
- filename: this.currentFileInfo.filename,
- index: this.index };
- }
- },
-
- find(obj, fun) {
- for (let i = 0, r; i < obj.length; i++) {
- r = fun.call(obj, obj[i]);
- if (r) { return r; }
- }
- return null;
- }
- });
-
- const Attribute = function(key, op, value, cif) {
- this.key = key;
- this.op = op;
- this.value = value;
- this.cif = cif;
- };
-
- Attribute.prototype = Object.assign(new Node(), {
- type: 'Attribute',
-
- eval(context) {
- return new Attribute(
- this.key.eval ? this.key.eval(context) : this.key,
- this.op,
- (this.value && this.value.eval) ? this.value.eval(context) : this.value,
- this.cif
- );
- },
-
- genCSS(context, output) {
- output.add(this.toCSS(context));
- },
-
- toCSS(context) {
- let value = this.key.toCSS ? this.key.toCSS(context) : this.key;
-
- if (this.op) {
- value += this.op;
- value += (this.value.toCSS ? this.value.toCSS(context) : this.value);
- }
-
- if (this.cif) {
- value = value + ' ' + this.cif;
- }
-
- return `[${value}]`;
- }
- });
-
- const Quoted = function(str, content, escaped, index, currentFileInfo) {
- this.escaped = (escaped === undefined) ? true : escaped;
- this.value = content || '';
- this.quote = str.charAt(0);
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.variableRegex = /@\{([\w-]+)\}/g;
- this.propRegex = /\$\{([\w-]+)\}/g;
- this.allowRoot = escaped;
- };
-
- Quoted.prototype = Object.assign(new Node(), {
- type: 'Quoted',
-
- genCSS(context, output) {
- if (!this.escaped) {
- output.add(this.quote, this.fileInfo(), this.getIndex());
- }
- output.add(this.value);
- if (!this.escaped) {
- output.add(this.quote);
- }
- },
-
- containsVariables() {
- return this.value.match(this.variableRegex);
- },
-
- eval(context) {
- const that = this;
- let value = this.value;
- const variableReplacement = function (_, name1, name2) {
- const v = new Variable(`@${name1 ?? name2}`, that.getIndex(), that.fileInfo()).eval(context, true);
- return (v instanceof Quoted) ? v.value : v.toCSS();
- };
- const propertyReplacement = function (_, name1, name2) {
- const v = new Property(`$${name1 ?? name2}`, that.getIndex(), that.fileInfo()).eval(context, true);
- return (v instanceof Quoted) ? v.value : v.toCSS();
- };
- function iterativeReplace(value, regexp, replacementFnc) {
- let evaluatedValue = value;
- do {
- value = evaluatedValue.toString();
- evaluatedValue = value.replace(regexp, replacementFnc);
- } while (value !== evaluatedValue);
- return evaluatedValue;
- }
- value = iterativeReplace(value, this.variableRegex, variableReplacement);
- value = iterativeReplace(value, this.propRegex, propertyReplacement);
- return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());
- },
-
- compare(other) {
- // when comparing quoted strings allow the quote to differ
- if (other.type === 'Quoted' && !this.escaped && !other.escaped) {
- return Node.numericCompare(this.value, other.value);
- } else {
- return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;
- }
- }
- });
-
- function escapePath(path) {
- return path.replace(/[()'"\s]/g, function(match) { return `\\${match}`; });
- }
-
- const URL = function(val, index, currentFileInfo, isEvald) {
- this.value = val;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.isEvald = isEvald;
- };
-
- URL.prototype = Object.assign(new Node(), {
- type: 'Url',
-
- accept(visitor) {
- this.value = visitor.visit(this.value);
- },
-
- genCSS(context, output) {
- output.add('url(');
- this.value.genCSS(context, output);
- output.add(')');
- },
-
- eval(context) {
- const val = this.value.eval(context);
- let rootpath;
-
- if (!this.isEvald) {
- // Add the rootpath if the URL requires a rewrite
- rootpath = this.fileInfo() && this.fileInfo().rootpath;
- if (typeof rootpath === 'string' &&
- typeof val.value === 'string' &&
- context.pathRequiresRewrite(val.value)) {
- if (!val.quote) {
- rootpath = escapePath(rootpath);
- }
- val.value = context.rewritePath(val.value, rootpath);
- } else {
- val.value = context.normalizePath(val.value);
- }
-
- // Add url args if enabled
- if (context.urlArgs) {
- if (!val.value.match(/^\s*data:/)) {
- const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';
- const urlArgs = delimiter + context.urlArgs;
- if (val.value.indexOf('#') !== -1) {
- val.value = val.value.replace('#', `${urlArgs}#`);
- } else {
- val.value += urlArgs;
- }
- }
- }
- }
-
- return new URL(val, this.getIndex(), this.fileInfo(), true);
- }
- });
-
- const Media = function(value, features, index, currentFileInfo, visibilityInfo) {
- this._index = index;
- this._fileInfo = currentFileInfo;
-
- const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();
-
- this.features = new Value(features);
- this.rules = [new Ruleset(selectors, value)];
- this.rules[0].allowImports = true;
- this.copyVisibilityInfo(visibilityInfo);
- this.allowRoot = true;
- this.setParent(selectors, this);
- this.setParent(this.features, this);
- this.setParent(this.rules, this);
- };
-
- Media.prototype = Object.assign(new AtRule(), {
- type: 'Media',
-
- ...NestableAtRulePrototype,
-
- genCSS(context, output) {
- output.add('@media ', this._fileInfo, this._index);
- this.features.genCSS(context, output);
- this.outputRuleset(context, output, this.rules);
- },
-
- eval(context) {
- if (!context.mediaBlocks) {
- context.mediaBlocks = [];
- context.mediaPath = [];
- }
-
- const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());
- if (this.debugInfo) {
- this.rules[0].debugInfo = this.debugInfo;
- media.debugInfo = this.debugInfo;
- }
-
- media.features = this.features.eval(context);
-
- context.mediaPath.push(media);
- context.mediaBlocks.push(media);
-
- this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();
- context.frames.unshift(this.rules[0]);
- media.rules = [this.rules[0].eval(context)];
- context.frames.shift();
-
- context.mediaPath.pop();
-
- return context.mediaPath.length === 0 ? media.evalTop(context) :
- media.evalNested(context);
- }
- });
-
- //
- // CSS @import node
- //
- // The general strategy here is that we don't want to wait
- // for the parsing to be completed, before we start importing
- // the file. That's because in the context of a browser,
- // most of the time will be spent waiting for the server to respond.
- //
- // On creation, we push the import path to our import queue, though
- // `import,push`, we also pass it a callback, which it'll call once
- // the file has been fetched, and parsed.
- //
- const Import = function(path, features, options, index, currentFileInfo, visibilityInfo) {
- this.options = options;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.path = path;
- this.features = features;
- this.allowRoot = true;
-
- if (this.options.less !== undefined || this.options.inline) {
- this.css = !this.options.less || this.options.inline;
- } else {
- const pathValue = this.getPath();
- if (pathValue && /[#.&?]css([?;].*)?$/.test(pathValue)) {
- this.css = true;
- }
- }
- this.copyVisibilityInfo(visibilityInfo);
- this.setParent(this.features, this);
- this.setParent(this.path, this);
- };
-
- Import.prototype = Object.assign(new Node(), {
- type: 'Import',
-
- accept(visitor) {
- if (this.features) {
- this.features = visitor.visit(this.features);
- }
- this.path = visitor.visit(this.path);
- if (!this.options.isPlugin && !this.options.inline && this.root) {
- this.root = visitor.visit(this.root);
- }
- },
-
- genCSS(context, output) {
- if (this.css && this.path._fileInfo.reference === undefined) {
- output.add('@import ', this._fileInfo, this._index);
- this.path.genCSS(context, output);
- if (this.features) {
- output.add(' ');
- this.features.genCSS(context, output);
- }
- output.add(';');
- }
- },
-
- getPath() {
- return (this.path instanceof URL) ?
- this.path.value.value : this.path.value;
- },
-
- isVariableImport() {
- let path = this.path;
- if (path instanceof URL) {
- path = path.value;
- }
- if (path instanceof Quoted) {
- return path.containsVariables();
- }
-
- return true;
- },
-
- evalForImport(context) {
- let path = this.path;
-
- if (path instanceof URL) {
- path = path.value;
- }
-
- return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());
- },
-
- evalPath(context) {
- const path = this.path.eval(context);
- const fileInfo = this._fileInfo;
-
- if (!(path instanceof URL)) {
- // Add the rootpath if the URL requires a rewrite
- const pathValue = path.value;
- if (fileInfo &&
- pathValue &&
- context.pathRequiresRewrite(pathValue)) {
- path.value = context.rewritePath(pathValue, fileInfo.rootpath);
- } else {
- path.value = context.normalizePath(path.value);
- }
- }
-
- return path;
- },
-
- eval(context) {
- const result = this.doEval(context);
- if (this.options.reference || this.blocksVisibility()) {
- if (result.length || result.length === 0) {
- result.forEach(function (node) {
- node.addVisibilityBlock();
- }
- );
- } else {
- result.addVisibilityBlock();
- }
- }
- return result;
- },
-
- doEval(context) {
- let ruleset;
- let registry;
- const features = this.features && this.features.eval(context);
-
- if (this.options.isPlugin) {
- if (this.root && this.root.eval) {
- try {
- this.root.eval(context);
- }
- catch (e) {
- e.message = 'Plugin error during evaluation';
- throw new LessError(e, this.root.imports, this.root.filename);
- }
- }
- registry = context.frames[0] && context.frames[0].functionRegistry;
- if ( registry && this.root && this.root.functions ) {
- registry.addMultiple( this.root.functions );
- }
-
- return [];
- }
-
- if (this.skip) {
- if (typeof this.skip === 'function') {
- this.skip = this.skip();
- }
- if (this.skip) {
- return [];
- }
- }
- if (this.features) {
- let featureValue = this.features.value;
- if (Array.isArray(featureValue) && featureValue.length >= 1) {
- const expr = featureValue[0];
- if (expr.type === 'Expression' && Array.isArray(expr.value) && expr.value.length >= 2) {
- featureValue = expr.value;
- const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'
- && featureValue[1].type === 'Paren';
- if (isLayer) {
- this.css = false;
- }
- }
- }
- }
- if (this.options.inline) {
- const contents = new Anonymous(this.root, 0,
- {
- filename: this.importedFilename,
- reference: this.path._fileInfo && this.path._fileInfo.reference
- }, true, true);
-
- return this.features ? new Media([contents], this.features.value) : [contents];
- } else if (this.css || this.layerCss) {
- const newImport = new Import(this.evalPath(context), features, this.options, this._index);
- if (this.layerCss) {
- newImport.css = this.layerCss;
- newImport.path._fileInfo = this._fileInfo;
- }
- if (!newImport.css && this.error) {
- throw this.error;
- }
- return newImport;
- } else if (this.root) {
- if (this.features) {
- let featureValue = this.features.value;
- if (Array.isArray(featureValue) && featureValue.length === 1) {
- const expr = featureValue[0];
- if (expr.type === 'Expression' && Array.isArray(expr.value) && expr.value.length >= 2) {
- featureValue = expr.value;
- const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'
- && featureValue[1].type === 'Paren';
- if (isLayer) {
- this.layerCss = true;
- featureValue[0] = new Expression(featureValue.slice(0, 2));
- featureValue.splice(1, 1);
- featureValue[0].noSpacing = true;
- return this;
- }
- }
- }
- }
- ruleset = new Ruleset(null, copyArray(this.root.rules));
- ruleset.evalImports(context);
-
- return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;
- } else {
- if (this.features) {
- let featureValue = this.features.value;
- if (Array.isArray(featureValue) && featureValue.length >= 1) {
- featureValue = featureValue[0].value;
- if (Array.isArray(featureValue) && featureValue.length >= 2) {
- const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'
- && featureValue[1].type === 'Paren';
- if (isLayer) {
- this.css = true;
- featureValue[0] = new Expression(featureValue.slice(0, 2));
- featureValue.splice(1, 1);
- featureValue[0].noSpacing = true;
- return this;
- }
- }
- }
- }
- return [];
- }
- }
- });
-
- const JsEvalNode = function() {};
-
- JsEvalNode.prototype = Object.assign(new Node(), {
- evaluateJavaScript(expression, context) {
- let result;
- const that = this;
- const evalContext = {};
-
- if (!context.javascriptEnabled) {
- throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',
- filename: this.fileInfo().filename,
- index: this.getIndex() };
- }
-
- expression = expression.replace(/@\{([\w-]+)\}/g, function (_, name) {
- return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));
- });
-
- try {
- expression = new Function(`return (${expression})`);
- } catch (e) {
- throw { message: `JavaScript evaluation error: ${e.message} from \`${expression}\`` ,
- filename: this.fileInfo().filename,
- index: this.getIndex() };
- }
-
- const variables = context.frames[0].variables();
- for (const k in variables) {
- // eslint-disable-next-line no-prototype-builtins
- if (variables.hasOwnProperty(k)) {
- evalContext[k.slice(1)] = {
- value: variables[k].value,
- toJS: function () {
- return this.value.eval(context).toCSS();
- }
- };
- }
- }
-
- try {
- result = expression.call(evalContext);
- } catch (e) {
- throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/["]/g, '\'')}'` ,
- filename: this.fileInfo().filename,
- index: this.getIndex() };
- }
- return result;
- },
-
- jsify(obj) {
- if (Array.isArray(obj.value) && (obj.value.length > 1)) {
- return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;
- } else {
- return obj.toCSS();
- }
- }
- });
-
- const JavaScript = function(string, escaped, index, currentFileInfo) {
- this.escaped = escaped;
- this.expression = string;
- this._index = index;
- this._fileInfo = currentFileInfo;
- };
-
- JavaScript.prototype = Object.assign(new JsEvalNode(), {
- type: 'JavaScript',
-
- eval(context) {
- const result = this.evaluateJavaScript(this.expression, context);
- const type = typeof result;
-
- if (type === 'number' && !isNaN(result)) {
- return new Dimension(result);
- } else if (type === 'string') {
- return new Quoted(`"${result}"`, result, this.escaped, this._index);
- } else if (Array.isArray(result)) {
- return new Anonymous(result.join(', '));
- } else {
- return new Anonymous(result);
- }
- }
- });
-
- const Assignment = function(key, val) {
- this.key = key;
- this.value = val;
- };
-
- Assignment.prototype = Object.assign(new Node(), {
- type: 'Assignment',
-
- accept(visitor) {
- this.value = visitor.visit(this.value);
- },
-
- eval(context) {
- if (this.value.eval) {
- return new Assignment(this.key, this.value.eval(context));
- }
- return this;
- },
-
- genCSS(context, output) {
- output.add(`${this.key}=`);
- if (this.value.genCSS) {
- this.value.genCSS(context, output);
- } else {
- output.add(this.value);
- }
- }
- });
-
- const Condition = function(op, l, r, i, negate) {
- this.op = op.trim();
- this.lvalue = l;
- this.rvalue = r;
- this._index = i;
- this.negate = negate;
- };
-
- Condition.prototype = Object.assign(new Node(), {
- type: 'Condition',
-
- accept(visitor) {
- this.lvalue = visitor.visit(this.lvalue);
- this.rvalue = visitor.visit(this.rvalue);
- },
-
- eval(context) {
- const result = (function (op, a, b) {
- switch (op) {
- case 'and': return a && b;
- case 'or': return a || b;
- default:
- switch (Node.compare(a, b)) {
- case -1:
- return op === '<' || op === '=<' || op === '<=';
- case 0:
- return op === '=' || op === '>=' || op === '=<' || op === '<=';
- case 1:
- return op === '>' || op === '>=';
- default:
- return false;
- }
- }
- })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));
-
- return this.negate ? !result : result;
- }
- });
-
- const QueryInParens = function (op, l, m, op2, r, i) {
- this.op = op.trim();
- this.lvalue = l;
- this.mvalue = m;
- this.op2 = op2 ? op2.trim() : null;
- this.rvalue = r;
- this._index = i;
- };
-
- QueryInParens.prototype = Object.assign(new Node(), {
- type: 'QueryInParens',
-
- accept(visitor) {
- this.lvalue = visitor.visit(this.lvalue);
- this.mvalue = visitor.visit(this.mvalue);
- if (this.rvalue) {
- this.rvalue = visitor.visit(this.rvalue);
- }
- },
-
- eval(context) {
- const node = new QueryInParens(
- this.op,
- this.lvalue.eval(context),
- this.mvalue.eval(context),
- this.op2,
- this.rvalue ? this.rvalue.eval(context) : null,
- this._index
- );
- return node;
- },
-
- genCSS(context, output) {
- this.lvalue.genCSS(context, output);
- output.add(' ' + this.op + ' ');
- this.mvalue.genCSS(context, output);
- if (this.rvalue) {
- output.add(' ' + this.op2 + ' ');
- this.rvalue.genCSS(context, output);
- }
- },
- });
-
- const Container = function(value, features, index, currentFileInfo, visibilityInfo) {
- this._index = index;
- this._fileInfo = currentFileInfo;
-
- const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();
-
- this.features = new Value(features);
- this.rules = [new Ruleset(selectors, value)];
- this.rules[0].allowImports = true;
- this.copyVisibilityInfo(visibilityInfo);
- this.allowRoot = true;
- this.setParent(selectors, this);
- this.setParent(this.features, this);
- this.setParent(this.rules, this);
- };
-
- Container.prototype = Object.assign(new AtRule(), {
- type: 'Container',
-
- ...NestableAtRulePrototype,
-
- genCSS(context, output) {
- output.add('@container ', this._fileInfo, this._index);
- this.features.genCSS(context, output);
- this.outputRuleset(context, output, this.rules);
- },
-
- eval(context) {
- if (this._evaluated) {
- return this;
- }
- if (!context.mediaBlocks) {
- context.mediaBlocks = [];
- context.mediaPath = [];
- }
-
- const media = new Container(null, [], this._index, this._fileInfo, this.visibilityInfo());
- media._evaluated = true;
- if (this.debugInfo) {
- this.rules[0].debugInfo = this.debugInfo;
- media.debugInfo = this.debugInfo;
- }
-
- media.features = this.features.eval(context);
-
- context.mediaPath.push(media);
- context.mediaBlocks.push(media);
-
- this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();
- context.frames.unshift(this.rules[0]);
- media.rules = [this.rules[0].eval(context)];
- context.frames.shift();
-
- context.mediaPath.pop();
-
- return context.mediaPath.length === 0 ? media.evalTop(context) :
- media.evalNested(context);
- }
- });
-
- const UnicodeDescriptor = function(value) {
- this.value = value;
- };
-
- UnicodeDescriptor.prototype = Object.assign(new Node(), {
- type: 'UnicodeDescriptor'
- });
-
- const Negative = function(node) {
- this.value = node;
- };
-
- Negative.prototype = Object.assign(new Node(), {
- type: 'Negative',
-
- genCSS(context, output) {
- output.add('-');
- this.value.genCSS(context, output);
- },
-
- eval(context) {
- if (context.isMathOn()) {
- return (new Operation('*', [new Dimension(-1), this.value])).eval(context);
- }
- return new Negative(this.value.eval(context));
- }
- });
-
- const Extend = function(selector, option, index, currentFileInfo, visibilityInfo) {
- this.selector = selector;
- this.option = option;
- this.object_id = Extend.next_id++;
- this.parent_ids = [this.object_id];
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.copyVisibilityInfo(visibilityInfo);
- this.allowRoot = true;
-
- switch (option) {
- case '!all':
- case 'all':
- this.allowBefore = true;
- this.allowAfter = true;
- break;
- default:
- this.allowBefore = false;
- this.allowAfter = false;
- break;
- }
- this.setParent(this.selector, this);
- };
-
- Extend.prototype = Object.assign(new Node(), {
- type: 'Extend',
-
- accept(visitor) {
- this.selector = visitor.visit(this.selector);
- },
-
- eval(context) {
- return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());
- },
-
- // remove when Nodes have JSDoc types
- // eslint-disable-next-line no-unused-vars
- clone(context) {
- return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());
- },
-
- // it concatenates (joins) all selectors in selector array
- findSelfSelectors(selectors) {
- let selfElements = [], i, selectorElements;
-
- for (i = 0; i < selectors.length; i++) {
- selectorElements = selectors[i].elements;
- // duplicate the logic in genCSS function inside the selector node.
- // future TODO - move both logics into the selector joiner visitor
- if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {
- selectorElements[0].combinator.value = ' ';
- }
- selfElements = selfElements.concat(selectors[i].elements);
- }
-
- this.selfSelectors = [new Selector(selfElements)];
- this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());
- }
- });
-
- Extend.next_id = 0;
-
- const VariableCall = function(variable, index, currentFileInfo) {
- this.variable = variable;
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.allowRoot = true;
- };
-
- VariableCall.prototype = Object.assign(new Node(), {
- type: 'VariableCall',
-
- eval(context) {
- let rules;
- let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);
- const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});
-
- if (!detachedRuleset.ruleset) {
- if (detachedRuleset.rules) {
- rules = detachedRuleset;
- }
- else if (Array.isArray(detachedRuleset)) {
- rules = new Ruleset('', detachedRuleset);
- }
- else if (Array.isArray(detachedRuleset.value)) {
- rules = new Ruleset('', detachedRuleset.value);
- }
- else {
- throw error;
- }
- detachedRuleset = new DetachedRuleset(rules);
- }
-
- if (detachedRuleset.ruleset) {
- return detachedRuleset.callEval(context);
- }
- throw error;
- }
- });
-
- const NamespaceValue = function(ruleCall, lookups, index, fileInfo) {
- this.value = ruleCall;
- this.lookups = lookups;
- this._index = index;
- this._fileInfo = fileInfo;
- };
-
- NamespaceValue.prototype = Object.assign(new Node(), {
- type: 'NamespaceValue',
-
- eval(context) {
- let i, name, rules = this.value.eval(context);
-
- for (i = 0; i < this.lookups.length; i++) {
- name = this.lookups[i];
-
- /**
- * Eval'd DRs return rulesets.
- * Eval'd mixins return rules, so let's make a ruleset if we need it.
- * We need to do this because of late parsing of values
- */
- if (Array.isArray(rules)) {
- rules = new Ruleset([new Selector()], rules);
- }
-
- if (name === '') {
- rules = rules.lastDeclaration();
- }
- else if (name.charAt(0) === '@') {
- if (name.charAt(1) === '@') {
- name = `@${new Variable(name.slice(1)).eval(context).value}`;
- }
- if (rules.variables) {
- rules = rules.variable(name);
- }
-
- if (!rules) {
- throw { type: 'Name',
- message: `variable ${name} not found`,
- filename: this.fileInfo().filename,
- index: this.getIndex() };
- }
- }
- else {
- if (name.substring(0, 2) === '$@') {
- name = `$${new Variable(name.slice(1)).eval(context).value}`;
- }
- else {
- name = name.charAt(0) === '$' ? name : `$${name}`;
- }
- if (rules.properties) {
- rules = rules.property(name);
- }
-
- if (!rules) {
- throw { type: 'Name',
- message: `property "${name.slice(1)}" not found`,
- filename: this.fileInfo().filename,
- index: this.getIndex() };
- }
- // Properties are an array of values, since a ruleset can have multiple props.
- // We pick the last one (the "cascaded" value)
- rules = rules[rules.length - 1];
- }
-
- if (rules.value) {
- rules = rules.eval(context).value;
- }
- if (rules.ruleset) {
- rules = rules.ruleset.eval(context);
- }
- }
- return rules;
- }
- });
-
- const Definition = function(name, params, rules, condition, variadic, frames, visibilityInfo) {
- this.name = name || 'anonymous mixin';
- this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];
- this.params = params;
- this.condition = condition;
- this.variadic = variadic;
- this.arity = params.length;
- this.rules = rules;
- this._lookups = {};
- const optionalParameters = [];
- this.required = params.reduce(function (count, p) {
- if (!p.name || (p.name && !p.value)) {
- return count + 1;
- }
- else {
- optionalParameters.push(p.name);
- return count;
- }
- }, 0);
- this.optionalParameters = optionalParameters;
- this.frames = frames;
- this.copyVisibilityInfo(visibilityInfo);
- this.allowRoot = true;
- };
-
- Definition.prototype = Object.assign(new Ruleset(), {
- type: 'MixinDefinition',
- evalFirst: true,
-
- accept(visitor) {
- if (this.params && this.params.length) {
- this.params = visitor.visitArray(this.params);
- }
- this.rules = visitor.visitArray(this.rules);
- if (this.condition) {
- this.condition = visitor.visit(this.condition);
- }
- },
-
- evalParams(context, mixinEnv, args, evaldArguments) {
- /* jshint boss:true */
- const frame = new Ruleset(null, null);
-
- let varargs;
- let arg;
- const params = copyArray(this.params);
- let i;
- let j;
- let val;
- let name;
- let isNamedFound;
- let argIndex;
- let argsLength = 0;
-
- if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {
- frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();
- }
- mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));
-
- if (args) {
- args = copyArray(args);
- argsLength = args.length;
-
- for (i = 0; i < argsLength; i++) {
- arg = args[i];
- if (name = (arg && arg.name)) {
- isNamedFound = false;
- for (j = 0; j < params.length; j++) {
- if (!evaldArguments[j] && name === params[j].name) {
- evaldArguments[j] = arg.value.eval(context);
- frame.prependRule(new Declaration(name, arg.value.eval(context)));
- isNamedFound = true;
- break;
- }
- }
- if (isNamedFound) {
- args.splice(i, 1);
- i--;
- continue;
- } else {
- throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };
- }
- }
- }
- }
- argIndex = 0;
- for (i = 0; i < params.length; i++) {
- if (evaldArguments[i]) { continue; }
-
- arg = args && args[argIndex];
-
- if (name = params[i].name) {
- if (params[i].variadic) {
- varargs = [];
- for (j = argIndex; j < argsLength; j++) {
- varargs.push(args[j].value.eval(context));
- }
- frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));
- } else {
- val = arg && arg.value;
- if (val) {
- // This was a mixin call, pass in a detached ruleset of it's eval'd rules
- if (Array.isArray(val)) {
- val = new DetachedRuleset(new Ruleset('', val));
- }
- else {
- val = val.eval(context);
- }
- } else if (params[i].value) {
- val = params[i].value.eval(mixinEnv);
- frame.resetCache();
- } else {
- throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };
- }
-
- frame.prependRule(new Declaration(name, val));
- evaldArguments[i] = val;
- }
- }
-
- if (params[i].variadic && args) {
- for (j = argIndex; j < argsLength; j++) {
- evaldArguments[j] = args[j].value.eval(context);
- }
- }
- argIndex++;
- }
-
- return frame;
- },
-
- makeImportant() {
- const rules = !this.rules ? this.rules : this.rules.map(function (r) {
- if (r.makeImportant) {
- return r.makeImportant(true);
- } else {
- return r;
- }
- });
- const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);
- return result;
- },
-
- eval(context) {
- return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || copyArray(context.frames));
- },
-
- evalCall(context, args, important) {
- const _arguments = [];
- const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;
- const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);
- let rules;
- let ruleset;
-
- frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));
-
- rules = copyArray(this.rules);
-
- ruleset = new Ruleset(null, rules);
- ruleset.originalRuleset = this;
- ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));
- if (important) {
- ruleset = ruleset.makeImportant();
- }
- return ruleset;
- },
-
- matchCondition(args, context) {
- if (this.condition && !this.condition.eval(
- new contexts.Eval(context,
- [this.evalParams(context, /* the parameter variables */
- new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]
- .concat(this.frames || []) // the parent namespace/mixin frames
- .concat(context.frames)))) { // the current environment frames
- return false;
- }
- return true;
- },
-
- matchArgs(args, context) {
- const allArgsCnt = (args && args.length) || 0;
- let len;
- const optionalParameters = this.optionalParameters;
- const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {
- if (optionalParameters.indexOf(p.name) < 0) {
- return count + 1;
- } else {
- return count;
- }
- }, 0);
-
- if (!this.variadic) {
- if (requiredArgsCnt < this.required) {
- return false;
- }
- if (allArgsCnt > this.params.length) {
- return false;
- }
- } else {
- if (requiredArgsCnt < (this.required - 1)) {
- return false;
- }
- }
-
- // check patterns
- len = Math.min(requiredArgsCnt, this.arity);
-
- for (let i = 0; i < len; i++) {
- if (!this.params[i].name && !this.params[i].variadic) {
- if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {
- return false;
- }
- }
- }
- return true;
- }
- });
-
- const MixinCall = function(elements, args, index, currentFileInfo, important) {
- this.selector = new Selector(elements);
- this.arguments = args || [];
- this._index = index;
- this._fileInfo = currentFileInfo;
- this.important = important;
- this.allowRoot = true;
- this.setParent(this.selector, this);
- };
-
- MixinCall.prototype = Object.assign(new Node(), {
- type: 'MixinCall',
-
- accept(visitor) {
- if (this.selector) {
- this.selector = visitor.visit(this.selector);
- }
- if (this.arguments.length) {
- this.arguments = visitor.visitArray(this.arguments);
- }
- },
-
- eval(context) {
- let mixins;
- let mixin;
- let mixinPath;
- const args = [];
- let arg;
- let argValue;
- const rules = [];
- let match = false;
- let i;
- let m;
- let f;
- let isRecursive;
- let isOneFound;
- const candidates = [];
- let candidate;
- const conditionResult = [];
- let defaultResult;
- const defFalseEitherCase = -1;
- const defNone = 0;
- const defTrue = 1;
- const defFalse = 2;
- let count;
- let originalRuleset;
- let noArgumentsFilter;
-
- this.selector = this.selector.eval(context);
-
- function calcDefGroup(mixin, mixinPath) {
- let f, p, namespace;
-
- for (f = 0; f < 2; f++) {
- conditionResult[f] = true;
- defaultFunc.value(f);
- for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {
- namespace = mixinPath[p];
- if (namespace.matchCondition) {
- conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);
- }
- }
- if (mixin.matchCondition) {
- conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);
- }
- }
- if (conditionResult[0] || conditionResult[1]) {
- if (conditionResult[0] != conditionResult[1]) {
- return conditionResult[1] ?
- defTrue : defFalse;
- }
-
- return defNone;
- }
- return defFalseEitherCase;
- }
-
- for (i = 0; i < this.arguments.length; i++) {
- arg = this.arguments[i];
- argValue = arg.value.eval(context);
- if (arg.expand && Array.isArray(argValue.value)) {
- argValue = argValue.value;
- for (m = 0; m < argValue.length; m++) {
- args.push({value: argValue[m]});
- }
- } else {
- args.push({name: arg.name, value: argValue});
- }
- }
-
- noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};
-
- for (i = 0; i < context.frames.length; i++) {
- if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {
- isOneFound = true;
-
- // To make `default()` function independent of definition order we have two "subpasses" here.
- // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),
- // and build candidate list with corresponding flags. Then, when we know all possible matches,
- // we make a final decision.
-
- for (m = 0; m < mixins.length; m++) {
- mixin = mixins[m].rule;
- mixinPath = mixins[m].path;
- isRecursive = false;
- for (f = 0; f < context.frames.length; f++) {
- if ((!(mixin instanceof Definition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {
- isRecursive = true;
- break;
- }
- }
- if (isRecursive) {
- continue;
- }
-
- if (mixin.matchArgs(args, context)) {
- candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};
-
- if (candidate.group !== defFalseEitherCase) {
- candidates.push(candidate);
- }
-
- match = true;
- }
- }
-
- defaultFunc.reset();
-
- count = [0, 0, 0];
- for (m = 0; m < candidates.length; m++) {
- count[candidates[m].group]++;
- }
-
- if (count[defNone] > 0) {
- defaultResult = defFalse;
- } else {
- defaultResult = defTrue;
- if ((count[defTrue] + count[defFalse]) > 1) {
- throw { type: 'Runtime',
- message: `Ambiguous use of \`default()\` found when matching for \`${this.format(args)}\``,
- index: this.getIndex(), filename: this.fileInfo().filename };
- }
- }
-
- for (m = 0; m < candidates.length; m++) {
- candidate = candidates[m].group;
- if ((candidate === defNone) || (candidate === defaultResult)) {
- try {
- mixin = candidates[m].mixin;
- if (!(mixin instanceof Definition)) {
- originalRuleset = mixin.originalRuleset || mixin;
- mixin = new Definition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());
- mixin.originalRuleset = originalRuleset;
- }
- const newRules = mixin.evalCall(context, args, this.important).rules;
- this._setVisibilityToReplacement(newRules);
- Array.prototype.push.apply(rules, newRules);
- } catch (e) {
- throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };
- }
- }
- }
-
- if (match) {
- return rules;
- }
- }
- }
- if (isOneFound) {
- throw { type: 'Runtime',
- message: `No matching definition was found for \`${this.format(args)}\``,
- index: this.getIndex(), filename: this.fileInfo().filename };
- } else {
- throw { type: 'Name',
- message: `${this.selector.toCSS().trim()} is undefined`,
- index: this.getIndex(), filename: this.fileInfo().filename };
- }
- },
-
- _setVisibilityToReplacement(replacement) {
- let i, rule;
- if (this.blocksVisibility()) {
- for (i = 0; i < replacement.length; i++) {
- rule = replacement[i];
- rule.addVisibilityBlock();
- }
- }
- },
-
- format(args) {
- return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {
- let argValue = '';
- if (a.name) {
- argValue += `${a.name}:`;
- }
- if (a.value.toCSS) {
- argValue += a.value.toCSS();
- } else {
- argValue += '???';
- }
- return argValue;
- }).join(', ') : ''})`;
- }
- });
-
- var tree = {
- Node, Color, AtRule, DetachedRuleset, Operation,
- Dimension, Unit, Keyword, Variable, Property,
- Ruleset, Element, Attribute, Combinator, Selector,
- Quoted, Expression, Declaration, Call, URL, Import,
- Comment, Anonymous, Value, JavaScript, Assignment,
- Condition, Paren, Media, Container, QueryInParens,
- UnicodeDescriptor, Negative, Extend, VariableCall,
- NamespaceValue,
- mixin: {
- Call: MixinCall,
- Definition: Definition
- }
- };
-
- class AbstractFileManager {
- getPath(filename) {
- let j = filename.lastIndexOf('?');
- if (j > 0) {
- filename = filename.slice(0, j);
- }
- j = filename.lastIndexOf('/');
- if (j < 0) {
- j = filename.lastIndexOf('\\');
- }
- if (j < 0) {
- return '';
- }
- return filename.slice(0, j + 1);
- }
-
- tryAppendExtension(path, ext) {
- return /(\.[a-z]*$)|([?;].*)$/.test(path) ? path : path + ext;
- }
-
- tryAppendLessExtension(path) {
- return this.tryAppendExtension(path, '.less');
- }
-
- supportsSync() {
- return false;
- }
-
- alwaysMakePathsAbsolute() {
- return false;
- }
-
- isPathAbsolute(filename) {
- return (/^(?:[a-z-]+:|\/|\\|#)/i).test(filename);
- }
-
- // TODO: pull out / replace?
- join(basePath, laterPath) {
- if (!basePath) {
- return laterPath;
- }
- return basePath + laterPath;
- }
-
- pathDiff(url, baseUrl) {
- // diff between two paths to create a relative path
-
- const urlParts = this.extractUrlParts(url);
-
- const baseUrlParts = this.extractUrlParts(baseUrl);
- let i;
- let max;
- let urlDirectories;
- let baseUrlDirectories;
- let diff = '';
- if (urlParts.hostPart !== baseUrlParts.hostPart) {
- return '';
- }
- max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);
- for (i = 0; i < max; i++) {
- if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }
- }
- baseUrlDirectories = baseUrlParts.directories.slice(i);
- urlDirectories = urlParts.directories.slice(i);
- for (i = 0; i < baseUrlDirectories.length - 1; i++) {
- diff += '../';
- }
- for (i = 0; i < urlDirectories.length - 1; i++) {
- diff += `${urlDirectories[i]}/`;
- }
- return diff;
- }
-
- /**
- * Helper function, not part of API.
- * This should be replaceable by newer Node / Browser APIs
- *
- * @param {string} url
- * @param {string} baseUrl
- */
- extractUrlParts(url, baseUrl) {
- // urlParts[1] = protocol://hostname/ OR /
- // urlParts[2] = / if path relative to host base
- // urlParts[3] = directories
- // urlParts[4] = filename
- // urlParts[5] = parameters
-
- const urlPartsRegex = /^((?:[a-z-]+:)?\/{2}(?:[^/?#]*\/)|([/\\]))?((?:[^/\\?#]*[/\\])*)([^/\\?#]*)([#?].*)?$/i;
-
- const urlParts = url.match(urlPartsRegex);
- const returner = {};
- let rawDirectories = [];
- const directories = [];
- let i;
- let baseUrlParts;
-
- if (!urlParts) {
- throw new Error(`Could not parse sheet href - '${url}'`);
- }
-
- // Stylesheets in IE don't always return the full path
- if (baseUrl && (!urlParts[1] || urlParts[2])) {
- baseUrlParts = baseUrl.match(urlPartsRegex);
- if (!baseUrlParts) {
- throw new Error(`Could not parse page url - '${baseUrl}'`);
- }
- urlParts[1] = urlParts[1] || baseUrlParts[1] || '';
- if (!urlParts[2]) {
- urlParts[3] = baseUrlParts[3] + urlParts[3];
- }
- }
-
- if (urlParts[3]) {
- rawDirectories = urlParts[3].replace(/\\/g, '/').split('/');
-
- // collapse '..' and skip '.'
- for (i = 0; i < rawDirectories.length; i++) {
-
- if (rawDirectories[i] === '..') {
- directories.pop();
- }
- else if (rawDirectories[i] !== '.') {
- directories.push(rawDirectories[i]);
- }
-
- }
- }
-
- returner.hostPart = urlParts[1];
- returner.directories = directories;
- returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');
- returner.path = (urlParts[1] || '') + directories.join('/');
- returner.filename = urlParts[4];
- returner.fileUrl = returner.path + (urlParts[4] || '');
- returner.url = returner.fileUrl + (urlParts[5] || '');
- return returner;
- }
- }
-
- class AbstractPluginLoader {
- constructor() {
- // Implemented by Node.js plugin loader
- this.require = function() {
- return null;
- };
- }
-
- evalPlugin(contents, context, imports, pluginOptions, fileInfo) {
-
- let loader, registry, pluginObj, localModule, pluginManager, filename, result;
-
- pluginManager = context.pluginManager;
-
- if (fileInfo) {
- if (typeof fileInfo === 'string') {
- filename = fileInfo;
- }
- else {
- filename = fileInfo.filename;
- }
- }
- const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;
-
- if (filename) {
- pluginObj = pluginManager.get(filename);
-
- if (pluginObj) {
- result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);
- if (result) {
- return result;
- }
- try {
- if (pluginObj.use) {
- pluginObj.use.call(this.context, pluginObj);
- }
- }
- catch (e) {
- e.message = e.message || 'Error during @plugin call';
- return new LessError(e, imports, filename);
- }
- return pluginObj;
- }
- }
- localModule = {
- exports: {},
- pluginManager,
- fileInfo
- };
- registry = functionRegistry.create();
-
- const registerPlugin = function(obj) {
- pluginObj = obj;
- };
-
- try {
- loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);
- loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);
- }
- catch (e) {
- return new LessError(e, imports, filename);
- }
-
- if (!pluginObj) {
- pluginObj = localModule.exports;
- }
- pluginObj = this.validatePlugin(pluginObj, filename, shortname);
-
- if (pluginObj instanceof LessError) {
- return pluginObj;
- }
-
- if (pluginObj) {
- pluginObj.imports = imports;
- pluginObj.filename = filename;
-
- // For < 3.x (or unspecified minVersion) - setOptions() before install()
- if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {
- result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);
-
- if (result) {
- return result;
- }
- }
-
- // Run on first load
- pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);
- pluginObj.functions = registry.getLocalFunctions();
-
- // Need to call setOptions again because the pluginObj might have functions
- result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);
- if (result) {
- return result;
- }
-
- // Run every @plugin call
- try {
- if (pluginObj.use) {
- pluginObj.use.call(this.context, pluginObj);
- }
- }
- catch (e) {
- e.message = e.message || 'Error during @plugin call';
- return new LessError(e, imports, filename);
- }
-
- }
- else {
- return new LessError({ message: 'Not a valid plugin' }, imports, filename);
- }
-
- return pluginObj;
-
- }
-
- trySetOptions(plugin, filename, name, options) {
- if (options && !plugin.setOptions) {
- return new LessError({
- message: `Options have been provided but the plugin ${name} does not support any options.`
- });
- }
- try {
- plugin.setOptions && plugin.setOptions(options);
- }
- catch (e) {
- return new LessError(e);
- }
- }
-
- validatePlugin(plugin, filename, name) {
- if (plugin) {
- // support plugins being a function
- // so that the plugin can be more usable programmatically
- if (typeof plugin === 'function') {
- plugin = new plugin();
- }
-
- if (plugin.minVersion) {
- if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {
- return new LessError({
- message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`
- });
- }
- }
- return plugin;
- }
- return null;
- }
-
- compareVersion(aVersion, bVersion) {
- if (typeof aVersion === 'string') {
- aVersion = aVersion.match(/^(\d+)\.?(\d+)?\.?(\d+)?/);
- aVersion.shift();
- }
- for (let i = 0; i < aVersion.length; i++) {
- if (aVersion[i] !== bVersion[i]) {
- return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;
- }
- }
- return 0;
- }
-
- versionToString(version) {
- let versionString = '';
- for (let i = 0; i < version.length; i++) {
- versionString += (versionString ? '.' : '') + version[i];
- }
- return versionString;
- }
-
- printUsage(plugins) {
- for (let i = 0; i < plugins.length; i++) {
- const plugin = plugins[i];
- if (plugin.printUsage) {
- plugin.printUsage();
- }
- }
- }
- }
-
- function boolean(condition) {
- return condition ? Keyword.True : Keyword.False;
- }
-
- /**
- * Functions with evalArgs set to false are sent context
- * as the first argument.
- */
- function If(context, condition, trueValue, falseValue) {
- return condition.eval(context) ? trueValue.eval(context)
- : (falseValue ? falseValue.eval(context) : new Anonymous);
- }
- If.evalArgs = false;
-
- function isdefined(context, variable) {
- try {
- variable.eval(context);
- return Keyword.True;
- } catch (e) {
- return Keyword.False;
- }
- }
-
- isdefined.evalArgs = false;
-
- var boolean$1 = { isdefined, boolean, 'if': If };
-
- let colorFunctions;
-
- function clamp(val) {
- return Math.min(1, Math.max(0, val));
- }
- function hsla(origColor, hsl) {
- const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);
- if (color) {
- if (origColor.value &&
- /^(rgb|hsl)/.test(origColor.value)) {
- color.value = origColor.value;
- } else {
- color.value = 'rgb';
- }
- return color;
- }
- }
- function toHSL(color) {
- if (color.toHSL) {
- return color.toHSL();
- } else {
- throw new Error('Argument cannot be evaluated to a color');
- }
- }
-
- function toHSV(color) {
- if (color.toHSV) {
- return color.toHSV();
- } else {
- throw new Error('Argument cannot be evaluated to a color');
- }
- }
-
- function number$1(n) {
- if (n instanceof Dimension) {
- return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);
- } else if (typeof n === 'number') {
- return n;
- } else {
- throw {
- type: 'Argument',
- message: 'color functions take numbers as parameters'
- };
- }
- }
- function scaled(n, size) {
- if (n instanceof Dimension && n.unit.is('%')) {
- return parseFloat(n.value * size / 100);
- } else {
- return number$1(n);
- }
- }
- colorFunctions = {
- rgb: function (r, g, b) {
- let a = 1;
- /**
- * Comma-less syntax
- * e.g. rgb(0 128 255 / 50%)
- */
- if (r instanceof Expression) {
- const val = r.value;
- r = val[0];
- g = val[1];
- b = val[2];
- /**
- * @todo - should this be normalized in
- * function caller? Or parsed differently?
- */
- if (b instanceof Operation) {
- const op = b;
- b = op.operands[0];
- a = op.operands[1];
- }
- }
- const color = colorFunctions.rgba(r, g, b, a);
- if (color) {
- color.value = 'rgb';
- return color;
- }
- },
- rgba: function (r, g, b, a) {
- try {
- if (r instanceof Color) {
- if (g) {
- a = number$1(g);
- } else {
- a = r.alpha;
- }
- return new Color(r.rgb, a, 'rgba');
- }
- const rgb = [r, g, b].map(c => scaled(c, 255));
- a = number$1(a);
- return new Color(rgb, a, 'rgba');
- }
- catch (e) {}
- },
- hsl: function (h, s, l) {
- let a = 1;
- if (h instanceof Expression) {
- const val = h.value;
- h = val[0];
- s = val[1];
- l = val[2];
-
- if (l instanceof Operation) {
- const op = l;
- l = op.operands[0];
- a = op.operands[1];
- }
- }
- const color = colorFunctions.hsla(h, s, l, a);
- if (color) {
- color.value = 'hsl';
- return color;
- }
- },
- hsla: function (h, s, l, a) {
- let m1;
- let m2;
-
- function hue(h) {
- h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);
- if (h * 6 < 1) {
- return m1 + (m2 - m1) * h * 6;
- }
- else if (h * 2 < 1) {
- return m2;
- }
- else if (h * 3 < 2) {
- return m1 + (m2 - m1) * (2 / 3 - h) * 6;
- }
- else {
- return m1;
- }
- }
-
- try {
- if (h instanceof Color) {
- if (s) {
- a = number$1(s);
- } else {
- a = h.alpha;
- }
- return new Color(h.rgb, a, 'hsla');
- }
-
- h = (number$1(h) % 360) / 360;
- s = clamp(number$1(s));l = clamp(number$1(l));a = clamp(number$1(a));
-
- m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;
- m1 = l * 2 - m2;
-
- const rgb = [
- hue(h + 1 / 3) * 255,
- hue(h) * 255,
- hue(h - 1 / 3) * 255
- ];
- a = number$1(a);
- return new Color(rgb, a, 'hsla');
- }
- catch (e) {}
- },
-
- hsv: function(h, s, v) {
- return colorFunctions.hsva(h, s, v, 1.0);
- },
-
- hsva: function(h, s, v, a) {
- h = ((number$1(h) % 360) / 360) * 360;
- s = number$1(s);v = number$1(v);a = number$1(a);
-
- let i;
- let f;
- i = Math.floor((h / 60) % 6);
- f = (h / 60) - i;
-
- const vs = [v,
- v * (1 - s),
- v * (1 - f * s),
- v * (1 - (1 - f) * s)];
- const perm = [[0, 3, 1],
- [2, 0, 1],
- [1, 0, 3],
- [1, 2, 0],
- [3, 1, 0],
- [0, 1, 2]];
-
- return colorFunctions.rgba(vs[perm[i][0]] * 255,
- vs[perm[i][1]] * 255,
- vs[perm[i][2]] * 255,
- a);
- },
-
- hue: function (color) {
- return new Dimension(toHSL(color).h);
- },
- saturation: function (color) {
- return new Dimension(toHSL(color).s * 100, '%');
- },
- lightness: function (color) {
- return new Dimension(toHSL(color).l * 100, '%');
- },
- hsvhue: function(color) {
- return new Dimension(toHSV(color).h);
- },
- hsvsaturation: function (color) {
- return new Dimension(toHSV(color).s * 100, '%');
- },
- hsvvalue: function (color) {
- return new Dimension(toHSV(color).v * 100, '%');
- },
- red: function (color) {
- return new Dimension(color.rgb[0]);
- },
- green: function (color) {
- return new Dimension(color.rgb[1]);
- },
- blue: function (color) {
- return new Dimension(color.rgb[2]);
- },
- alpha: function (color) {
- return new Dimension(toHSL(color).a);
- },
- luma: function (color) {
- return new Dimension(color.luma() * color.alpha * 100, '%');
- },
- luminance: function (color) {
- const luminance =
- (0.2126 * color.rgb[0] / 255) +
- (0.7152 * color.rgb[1] / 255) +
- (0.0722 * color.rgb[2] / 255);
-
- return new Dimension(luminance * color.alpha * 100, '%');
- },
- saturate: function (color, amount, method) {
- // filter: saturate(3.2);
- // should be kept as is, so check for color
- if (!color.rgb) {
- return null;
- }
- const hsl = toHSL(color);
-
- if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.s += hsl.s * amount.value / 100;
- }
- else {
- hsl.s += amount.value / 100;
- }
- hsl.s = clamp(hsl.s);
- return hsla(color, hsl);
- },
- desaturate: function (color, amount, method) {
- const hsl = toHSL(color);
-
- if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.s -= hsl.s * amount.value / 100;
- }
- else {
- hsl.s -= amount.value / 100;
- }
- hsl.s = clamp(hsl.s);
- return hsla(color, hsl);
- },
- lighten: function (color, amount, method) {
- const hsl = toHSL(color);
-
- if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.l += hsl.l * amount.value / 100;
- }
- else {
- hsl.l += amount.value / 100;
- }
- hsl.l = clamp(hsl.l);
- return hsla(color, hsl);
- },
- darken: function (color, amount, method) {
- const hsl = toHSL(color);
-
- if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.l -= hsl.l * amount.value / 100;
- }
- else {
- hsl.l -= amount.value / 100;
- }
- hsl.l = clamp(hsl.l);
- return hsla(color, hsl);
- },
- fadein: function (color, amount, method) {
- const hsl = toHSL(color);
-
- if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.a += hsl.a * amount.value / 100;
- }
- else {
- hsl.a += amount.value / 100;
- }
- hsl.a = clamp(hsl.a);
- return hsla(color, hsl);
- },
- fadeout: function (color, amount, method) {
- const hsl = toHSL(color);
-
- if (typeof method !== 'undefined' && method.value === 'relative') {
- hsl.a -= hsl.a * amount.value / 100;
- }
- else {
- hsl.a -= amount.value / 100;
- }
- hsl.a = clamp(hsl.a);
- return hsla(color, hsl);
- },
- fade: function (color, amount) {
- const hsl = toHSL(color);
-
- hsl.a = amount.value / 100;
- hsl.a = clamp(hsl.a);
- return hsla(color, hsl);
- },
- spin: function (color, amount) {
- const hsl = toHSL(color);
- const hue = (hsl.h + amount.value) % 360;
-
- hsl.h = hue < 0 ? 360 + hue : hue;
-
- return hsla(color, hsl);
- },
- //
- // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein
- // http://sass-lang.com
- //
- mix: function (color1, color2, weight) {
- if (!weight) {
- weight = new Dimension(50);
- }
- const p = weight.value / 100.0;
- const w = p * 2 - 1;
- const a = toHSL(color1).a - toHSL(color2).a;
-
- const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;
- const w2 = 1 - w1;
-
- const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,
- color1.rgb[1] * w1 + color2.rgb[1] * w2,
- color1.rgb[2] * w1 + color2.rgb[2] * w2];
-
- const alpha = color1.alpha * p + color2.alpha * (1 - p);
-
- return new Color(rgb, alpha);
- },
- greyscale: function (color) {
- return colorFunctions.desaturate(color, new Dimension(100));
- },
- contrast: function (color, dark, light, threshold) {
- // filter: contrast(3.2);
- // should be kept as is, so check for color
- if (!color.rgb) {
- return null;
- }
- if (typeof light === 'undefined') {
- light = colorFunctions.rgba(255, 255, 255, 1.0);
- }
- if (typeof dark === 'undefined') {
- dark = colorFunctions.rgba(0, 0, 0, 1.0);
- }
- // Figure out which is actually light and dark:
- if (dark.luma() > light.luma()) {
- const t = light;
- light = dark;
- dark = t;
- }
- if (typeof threshold === 'undefined') {
- threshold = 0.43;
- } else {
- threshold = number$1(threshold);
- }
- if (color.luma() < threshold) {
- return light;
- } else {
- return dark;
- }
- },
- // Changes made in 2.7.0 - Reverted in 3.0.0
- // contrast: function (color, color1, color2, threshold) {
- // // Return which of `color1` and `color2` has the greatest contrast with `color`
- // // according to the standard WCAG contrast ratio calculation.
- // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef
- // // The threshold param is no longer used, in line with SASS.
- // // filter: contrast(3.2);
- // // should be kept as is, so check for color
- // if (!color.rgb) {
- // return null;
- // }
- // if (typeof color1 === 'undefined') {
- // color1 = colorFunctions.rgba(0, 0, 0, 1.0);
- // }
- // if (typeof color2 === 'undefined') {
- // color2 = colorFunctions.rgba(255, 255, 255, 1.0);
- // }
- // var contrast1, contrast2;
- // var luma = color.luma();
- // var luma1 = color1.luma();
- // var luma2 = color2.luma();
- // // Calculate contrast ratios for each color
- // if (luma > luma1) {
- // contrast1 = (luma + 0.05) / (luma1 + 0.05);
- // } else {
- // contrast1 = (luma1 + 0.05) / (luma + 0.05);
- // }
- // if (luma > luma2) {
- // contrast2 = (luma + 0.05) / (luma2 + 0.05);
- // } else {
- // contrast2 = (luma2 + 0.05) / (luma + 0.05);
- // }
- // if (contrast1 > contrast2) {
- // return color1;
- // } else {
- // return color2;
- // }
- // },
- argb: function (color) {
- return new Anonymous(color.toARGB());
- },
- color: function(c) {
- if ((c instanceof Quoted) &&
- (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {
- const val = c.value.slice(1);
- return new Color(val, undefined, `#${val}`);
- }
- if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {
- c.value = undefined;
- return c;
- }
- throw {
- type: 'Argument',
- message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'
- };
- },
- tint: function(color, amount) {
- return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);
- },
- shade: function(color, amount) {
- return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);
- }
- };
-
- var color = colorFunctions;
-
- // Color Blending
- // ref: http://www.w3.org/TR/compositing-1
-
- function colorBlend(mode, color1, color2) {
- const ab = color1.alpha; // result
-
- let // backdrop
- cb;
-
- const as = color2.alpha;
-
- let // source
- cs;
-
- let ar;
- let cr;
- const r = [];
-
- ar = as + ab * (1 - as);
- for (let i = 0; i < 3; i++) {
- cb = color1.rgb[i] / 255;
- cs = color2.rgb[i] / 255;
- cr = mode(cb, cs);
- if (ar) {
- cr = (as * cs + ab * (cb -
- as * (cb + cs - cr))) / ar;
- }
- r[i] = cr * 255;
- }
-
- return new Color(r, ar);
- }
-
- const colorBlendModeFunctions = {
- multiply: function(cb, cs) {
- return cb * cs;
- },
- screen: function(cb, cs) {
- return cb + cs - cb * cs;
- },
- overlay: function(cb, cs) {
- cb *= 2;
- return (cb <= 1) ?
- colorBlendModeFunctions.multiply(cb, cs) :
- colorBlendModeFunctions.screen(cb - 1, cs);
- },
- softlight: function(cb, cs) {
- let d = 1;
- let e = cb;
- if (cs > 0.5) {
- e = 1;
- d = (cb > 0.25) ? Math.sqrt(cb)
- : ((16 * cb - 12) * cb + 4) * cb;
- }
- return cb - (1 - 2 * cs) * e * (d - cb);
- },
- hardlight: function(cb, cs) {
- return colorBlendModeFunctions.overlay(cs, cb);
- },
- difference: function(cb, cs) {
- return Math.abs(cb - cs);
- },
- exclusion: function(cb, cs) {
- return cb + cs - 2 * cb * cs;
- },
-
- // non-w3c functions:
- average: function(cb, cs) {
- return (cb + cs) / 2;
- },
- negation: function(cb, cs) {
- return 1 - Math.abs(cb + cs - 1);
- }
- };
-
- for (const f in colorBlendModeFunctions) {
- // eslint-disable-next-line no-prototype-builtins
- if (colorBlendModeFunctions.hasOwnProperty(f)) {
- colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);
- }
- }
-
- var dataUri = environment => {
-
- const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context);
-
- return { 'data-uri': function(mimetypeNode, filePathNode) {
-
- if (!filePathNode) {
- filePathNode = mimetypeNode;
- mimetypeNode = null;
- }
-
- let mimetype = mimetypeNode && mimetypeNode.value;
- let filePath = filePathNode.value;
- const currentFileInfo = this.currentFileInfo;
- const currentDirectory = currentFileInfo.rewriteUrls ?
- currentFileInfo.currentDirectory : currentFileInfo.entryPath;
-
- const fragmentStart = filePath.indexOf('#');
- let fragment = '';
- if (fragmentStart !== -1) {
- fragment = filePath.slice(fragmentStart);
- filePath = filePath.slice(0, fragmentStart);
- }
- const context = clone(this.context);
- context.rawBuffer = true;
-
- const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);
-
- if (!fileManager) {
- return fallback(this, filePathNode);
- }
-
- let useBase64 = false;
-
- // detect the mimetype if not given
- if (!mimetypeNode) {
-
- mimetype = environment.mimeLookup(filePath);
-
- if (mimetype === 'image/svg+xml') {
- useBase64 = false;
- } else {
- // use base 64 unless it's an ASCII or UTF-8 format
- const charset = environment.charsetLookup(mimetype);
- useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;
- }
- if (useBase64) { mimetype += ';base64'; }
- }
- else {
- useBase64 = /;base64$/.test(mimetype);
- }
-
- const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);
- if (!fileSync.contents) {
- logger$1.warn(`Skipped data-uri embedding of ${filePath} because file not found`);
- return fallback(this, filePathNode || mimetypeNode);
- }
- let buf = fileSync.contents;
- if (useBase64 && !environment.encodeBase64) {
- return fallback(this, filePathNode);
- }
-
- buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);
-
- const uri = `data:${mimetype},${buf}${fragment}`;
-
- return new URL(new Quoted(`"${uri}"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);
- }};
- };
-
- const getItemsFromNode = node => {
- // handle non-array values as an array of length 1
- // return 'undefined' if index is invalid
- const items = Array.isArray(node.value) ?
- node.value : Array(node);
-
- return items;
- };
-
- var list = {
- _SELF: function(n) {
- return n;
- },
- '~': function(...expr) {
- if (expr.length === 1) {
- return expr[0];
- }
- return new Value(expr);
- },
- extract: function(values, index) {
- // (1-based index)
- index = index.value - 1;
-
- return getItemsFromNode(values)[index];
- },
- length: function(values) {
- return new Dimension(getItemsFromNode(values).length);
- },
- /**
- * Creates a Less list of incremental values.
- * Modeled after Lodash's range function, also exists natively in PHP
- *
- * @param {Dimension} [start=1]
- * @param {Dimension} end - e.g. 10 or 10px - unit is added to output
- * @param {Dimension} [step=1]
- */
- range: function(start, end, step) {
- let from;
- let to;
- let stepValue = 1;
- const list = [];
- if (end) {
- to = end;
- from = start.value;
- if (step) {
- stepValue = step.value;
- }
- }
- else {
- from = 1;
- to = start;
- }
-
- for (let i = from; i <= to.value; i += stepValue) {
- list.push(new Dimension(i, to.unit));
- }
-
- return new Expression(list);
- },
- each: function(list, rs) {
- const rules = [];
- let newRules;
- let iterator;
-
- const tryEval = val => {
- if (val instanceof Node) {
- return val.eval(this.context);
- }
- return val;
- };
-
- if (list.value && !(list instanceof Quoted)) {
- if (Array.isArray(list.value)) {
- iterator = list.value.map(tryEval);
- } else {
- iterator = [tryEval(list.value)];
- }
- } else if (list.ruleset) {
- iterator = tryEval(list.ruleset).rules;
- } else if (list.rules) {
- iterator = list.rules.map(tryEval);
- } else if (Array.isArray(list)) {
- iterator = list.map(tryEval);
- } else {
- iterator = [tryEval(list)];
- }
-
- let valueName = '@value';
- let keyName = '@key';
- let indexName = '@index';
-
- if (rs.params) {
- valueName = rs.params[0] && rs.params[0].name;
- keyName = rs.params[1] && rs.params[1].name;
- indexName = rs.params[2] && rs.params[2].name;
- rs = rs.rules;
- } else {
- rs = rs.ruleset;
- }
-
- for (let i = 0; i < iterator.length; i++) {
- let key;
- let value;
- const item = iterator[i];
- if (item instanceof Declaration) {
- key = typeof item.name === 'string' ? item.name : item.name[0].value;
- value = item.value;
- } else {
- key = new Dimension(i + 1);
- value = item;
- }
-
- if (item instanceof Comment) {
- continue;
- }
-
- newRules = rs.rules.slice(0);
- if (valueName) {
- newRules.push(new Declaration(valueName,
- value,
- false, false, this.index, this.currentFileInfo));
- }
- if (indexName) {
- newRules.push(new Declaration(indexName,
- new Dimension(i + 1),
- false, false, this.index, this.currentFileInfo));
- }
- if (keyName) {
- newRules.push(new Declaration(keyName,
- key,
- false, false, this.index, this.currentFileInfo));
- }
-
- rules.push(new Ruleset([ new(Selector)([ new Element('', '&') ]) ],
- newRules,
- rs.strictImports,
- rs.visibilityInfo()
- ));
- }
-
- return new Ruleset([ new(Selector)([ new Element('', '&') ]) ],
- rules,
- rs.strictImports,
- rs.visibilityInfo()
- ).eval(this.context);
- }
- };
-
- const MathHelper = (fn, unit, n) => {
- if (!(n instanceof Dimension)) {
- throw { type: 'Argument', message: 'argument must be a number' };
- }
- if (unit === null) {
- unit = n.unit;
- } else {
- n = n.unify();
- }
- return new Dimension(fn(parseFloat(n.value)), unit);
- };
-
- const mathFunctions = {
- // name, unit
- ceil: null,
- floor: null,
- sqrt: null,
- abs: null,
- tan: '',
- sin: '',
- cos: '',
- atan: 'rad',
- asin: 'rad',
- acos: 'rad'
- };
-
- for (const f in mathFunctions) {
- // eslint-disable-next-line no-prototype-builtins
- if (mathFunctions.hasOwnProperty(f)) {
- mathFunctions[f] = MathHelper.bind(null, Math[f], mathFunctions[f]);
- }
- }
-
- mathFunctions.round = (n, f) => {
- const fraction = typeof f === 'undefined' ? 0 : f.value;
- return MathHelper(num => num.toFixed(fraction), null, n);
- };
-
- const minMax = function (isMin, args) {
- args = Array.prototype.slice.call(args);
- switch (args.length) {
- case 0: throw { type: 'Argument', message: 'one or more arguments required' };
- }
- let i; // key is the unit.toString() for unified Dimension values,
- let j;
- let current;
- let currentUnified;
- let referenceUnified;
- let unit;
- let unitStatic;
- let unitClone;
-
- const // elems only contains original argument values.
- order = [];
-
- const values = {};
- // value is the index into the order array.
- for (i = 0; i < args.length; i++) {
- current = args[i];
- if (!(current instanceof Dimension)) {
- if (Array.isArray(args[i].value)) {
- Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));
- continue;
- } else {
- throw { type: 'Argument', message: 'incompatible types' };
- }
- }
- currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();
- unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();
- unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;
- unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;
- j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];
- if (j === undefined) {
- if (unitStatic !== undefined && unit !== unitStatic) {
- throw { type: 'Argument', message: 'incompatible types' };
- }
- values[unit] = order.length;
- order.push(current);
- continue;
- }
- referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();
- if ( isMin && currentUnified.value < referenceUnified.value ||
- !isMin && currentUnified.value > referenceUnified.value) {
- order[j] = current;
- }
- }
- if (order.length == 1) {
- return order[0];
- }
- args = order.map(a => { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');
- return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);
- };
-
- var number = {
- min: function(...args) {
- try {
- return minMax.call(this, true, args);
- } catch (e) {}
- },
- max: function(...args) {
- try {
- return minMax.call(this, false, args);
- } catch (e) {}
- },
- convert: function (val, unit) {
- return val.convertTo(unit.value);
- },
- pi: function () {
- return new Dimension(Math.PI);
- },
- mod: function(a, b) {
- return new Dimension(a.value % b.value, a.unit);
- },
- pow: function(x, y) {
- if (typeof x === 'number' && typeof y === 'number') {
- x = new Dimension(x);
- y = new Dimension(y);
- } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {
- throw { type: 'Argument', message: 'arguments must be numbers' };
- }
-
- return new Dimension(Math.pow(x.value, y.value), x.unit);
- },
- percentage: function (n) {
- const result = MathHelper(num => num * 100, '%', n);
-
- return result;
- }
- };
-
- var string = {
- e: function (str) {
- return new Quoted('"', str instanceof JavaScript ? str.evaluated : str.value, true);
- },
- escape: function (str) {
- return new Anonymous(
- encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')
- .replace(/\(/g, '%28').replace(/\)/g, '%29'));
- },
- replace: function (string, pattern, replacement, flags) {
- let result = string.value;
- replacement = (replacement.type === 'Quoted') ?
- replacement.value : replacement.toCSS();
- result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);
- return new Quoted(string.quote || '', result, string.escaped);
- },
- '%': function (string /* arg, arg, ... */) {
- const args = Array.prototype.slice.call(arguments, 1);
- let result = string.value;
-
- for (let i = 0; i < args.length; i++) {
- /* jshint loopfunc:true */
- result = result.replace(/%[sda]/i, token => {
- const value = ((args[i].type === 'Quoted') &&
- token.match(/s/i)) ? args[i].value : args[i].toCSS();
- return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;
- });
- }
- result = result.replace(/%%/g, '%');
- return new Quoted(string.quote || '', result, string.escaped);
- }
- };
-
- var svg = () => {
- return { 'svg-gradient': function(direction) {
- let stops;
- let gradientDirectionSvg;
- let gradientType = 'linear';
- let rectangleDimension = 'x="0" y="0" width="1" height="1"';
- const renderEnv = {compress: false};
- let returner;
- const directionValue = direction.toCSS(renderEnv);
- let i;
- let color;
- let position;
- let positionValue;
- let alpha;
-
- function throwArgumentDescriptor() {
- throw { type: 'Argument',
- message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +
- ' end_color [end_position] or direction, color list' };
- }
-
- if (arguments.length == 2) {
- if (arguments[1].value.length < 2) {
- throwArgumentDescriptor();
- }
- stops = arguments[1].value;
- } else if (arguments.length < 3) {
- throwArgumentDescriptor();
- } else {
- stops = Array.prototype.slice.call(arguments, 1);
- }
-
- switch (directionValue) {
- case 'to bottom':
- gradientDirectionSvg = 'x1="0%" y1="0%" x2="0%" y2="100%"';
- break;
- case 'to right':
- gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="0%"';
- break;
- case 'to bottom right':
- gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="100%"';
- break;
- case 'to top right':
- gradientDirectionSvg = 'x1="0%" y1="100%" x2="100%" y2="0%"';
- break;
- case 'ellipse':
- case 'ellipse at center':
- gradientType = 'radial';
- gradientDirectionSvg = 'cx="50%" cy="50%" r="75%"';
- rectangleDimension = 'x="-50" y="-50" width="101" height="101"';
- break;
- default:
- throw { type: 'Argument', message: 'svg-gradient direction must be \'to bottom\', \'to right\',' +
- ' \'to bottom right\', \'to top right\' or \'ellipse at center\'' };
- }
- returner = `<${gradientType}Gradient id="g" ${gradientDirectionSvg}>`;
-
- for (i = 0; i < stops.length; i += 1) {
- if (stops[i] instanceof Expression) {
- color = stops[i].value[0];
- position = stops[i].value[1];
- } else {
- color = stops[i];
- position = undefined;
- }
-
- if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {
- throwArgumentDescriptor();
- }
- positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';
- alpha = color.alpha;
- returner += ``;
- }
- returner += `${gradientType}Gradient>`;
-
- returner = encodeURIComponent(returner);
-
- returner = `data:image/svg+xml,${returner}`;
- return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);
- }};
- };
-
- const isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;
- const isunit = (n, unit) => {
- if (unit === undefined) {
- throw { type: 'Argument', message: 'missing the required second argument to isunit.' };
- }
- unit = typeof unit.value === 'string' ? unit.value : unit;
- if (typeof unit !== 'string') {
- throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };
- }
- return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;
- };
-
- var types = {
- isruleset: function (n) {
- return isa(n, DetachedRuleset);
- },
- iscolor: function (n) {
- return isa(n, Color);
- },
- isnumber: function (n) {
- return isa(n, Dimension);
- },
- isstring: function (n) {
- return isa(n, Quoted);
- },
- iskeyword: function (n) {
- return isa(n, Keyword);
- },
- isurl: function (n) {
- return isa(n, URL);
- },
- ispixel: function (n) {
- return isunit(n, 'px');
- },
- ispercentage: function (n) {
- return isunit(n, '%');
- },
- isem: function (n) {
- return isunit(n, 'em');
- },
- isunit,
- unit: function (val, unit) {
- if (!(val instanceof Dimension)) {
- throw { type: 'Argument',
- message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };
- }
- if (unit) {
- if (unit instanceof Keyword) {
- unit = unit.value;
- } else {
- unit = unit.toCSS();
- }
- } else {
- unit = '';
- }
- return new Dimension(val.value, unit);
- },
- 'get-unit': function (n) {
- return new Anonymous(n.unit);
- }
- };
-
- const styleExpression = function (args) {
- args = Array.prototype.slice.call(args);
- if (args.length === 0) {
- throw { type: 'Argument', message: 'one or more arguments required' };
- }
-
- const entityList = [new Variable(args[0].value, this.index, this.currentFileInfo).eval(this.context)];
-
- args = entityList.map(a => { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');
-
- return new Anonymous(`style(${args})`);
- };
-
- var style$1 = {
- style: function(...args) {
- try {
- return styleExpression.call(this, args);
- } catch (e) {
- // When style() is used as a CSS function (e.g. @container style(--responsive: true)),
- // arguments won't be valid Less variables. Return undefined to let the
- // parser fall through and treat it as plain CSS.
- }
- },
- };
-
- var functions = environment => {
- const functions = { functionRegistry, functionCaller };
-
- // register functions
- functionRegistry.addMultiple(boolean$1);
- functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));
- functionRegistry.addMultiple(color);
- functionRegistry.addMultiple(colorBlend);
- functionRegistry.addMultiple(dataUri(environment));
- functionRegistry.addMultiple(list);
- functionRegistry.addMultiple(mathFunctions);
- functionRegistry.addMultiple(number);
- functionRegistry.addMultiple(string);
- functionRegistry.addMultiple(svg());
- functionRegistry.addMultiple(types);
- functionRegistry.addMultiple(style$1);
-
- return functions;
- };
-
- function transformTree(root, options) {
- options = options || {};
- let evaldRoot;
- let variables = options.variables;
- const evalEnv = new contexts.Eval(options);
-
- //
- // Allows setting variables with a hash, so:
- //
- // `{ color: new tree.Color('#f01') }` will become:
- //
- // new tree.Declaration('@color',
- // new tree.Value([
- // new tree.Expression([
- // new tree.Color('#f01')
- // ])
- // ])
- // )
- //
- if (typeof variables === 'object' && !Array.isArray(variables)) {
- variables = Object.keys(variables).map(function (k) {
- let value = variables[k];
-
- if (!(value instanceof tree.Value)) {
- if (!(value instanceof tree.Expression)) {
- value = new tree.Expression([value]);
- }
- value = new tree.Value([value]);
- }
- return new tree.Declaration(`@${k}`, value, false, null, 0);
- });
- evalEnv.frames = [new tree.Ruleset(null, variables)];
- }
-
- const visitors$1 = [
- new visitors.JoinSelectorVisitor(),
- new visitors.MarkVisibleSelectorsVisitor(true),
- new visitors.ExtendVisitor(),
- new visitors.ToCSSVisitor({compress: Boolean(options.compress)})
- ];
-
- const preEvalVisitors = [];
- let v;
- let visitorIterator;
-
- /**
- * first() / get() allows visitors to be added while visiting
- *
- * @todo Add scoping for visitors just like functions for @plugin; right now they're global
- */
- if (options.pluginManager) {
- visitorIterator = options.pluginManager.visitor();
- for (let i = 0; i < 2; i++) {
- visitorIterator.first();
- while ((v = visitorIterator.get())) {
- if (v.isPreEvalVisitor) {
- if (i === 0 || preEvalVisitors.indexOf(v) === -1) {
- preEvalVisitors.push(v);
- v.run(root);
- }
- }
- else {
- if (i === 0 || visitors$1.indexOf(v) === -1) {
- if (v.isPreVisitor) {
- visitors$1.unshift(v);
- }
- else {
- visitors$1.push(v);
- }
- }
- }
- }
- }
- }
-
- evaldRoot = root.eval(evalEnv);
-
- for (let i = 0; i < visitors$1.length; i++) {
- visitors$1[i].run(evaldRoot);
- }
-
- // Run any remaining visitors added after eval pass
- if (options.pluginManager) {
- visitorIterator.first();
- while ((v = visitorIterator.get())) {
- if (visitors$1.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {
- v.run(evaldRoot);
- }
- }
- }
-
- return evaldRoot;
- }
-
- /**
- * Plugin Manager
- */
- class PluginManager {
- constructor(less) {
- this.less = less;
- this.visitors = [];
- this.preProcessors = [];
- this.postProcessors = [];
- this.installedPlugins = [];
- this.fileManagers = [];
- this.iterator = -1;
- this.pluginCache = {};
- this.Loader = new less.PluginLoader(less);
- }
-
- /**
- * Adds all the plugins in the array
- * @param {Array} plugins
- */
- addPlugins(plugins) {
- if (plugins) {
- for (let i = 0; i < plugins.length; i++) {
- this.addPlugin(plugins[i]);
- }
- }
- }
-
- /**
- *
- * @param plugin
- * @param {String} filename
- */
- addPlugin(plugin, filename, functionRegistry) {
- this.installedPlugins.push(plugin);
- if (filename) {
- this.pluginCache[filename] = plugin;
- }
- if (plugin.install) {
- plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);
- }
- }
-
- /**
- *
- * @param filename
- */
- get(filename) {
- return this.pluginCache[filename];
- }
-
- /**
- * Adds a visitor. The visitor object has options on itself to determine
- * when it should run.
- * @param visitor
- */
- addVisitor(visitor) {
- this.visitors.push(visitor);
- }
-
- /**
- * Adds a pre processor object
- * @param {object} preProcessor
- * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import
- */
- addPreProcessor(preProcessor, priority) {
- let indexToInsertAt;
- for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {
- if (this.preProcessors[indexToInsertAt].priority >= priority) {
- break;
- }
- }
- this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});
- }
-
- /**
- * Adds a post processor object
- * @param {object} postProcessor
- * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression
- */
- addPostProcessor(postProcessor, priority) {
- let indexToInsertAt;
- for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {
- if (this.postProcessors[indexToInsertAt].priority >= priority) {
- break;
- }
- }
- this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});
- }
-
- /**
- *
- * @param manager
- */
- addFileManager(manager) {
- this.fileManagers.push(manager);
- }
-
- /**
- *
- * @returns {Array}
- * @private
- */
- getPreProcessors() {
- const preProcessors = [];
- for (let i = 0; i < this.preProcessors.length; i++) {
- preProcessors.push(this.preProcessors[i].preProcessor);
- }
- return preProcessors;
- }
-
- /**
- *
- * @returns {Array}
- * @private
- */
- getPostProcessors() {
- const postProcessors = [];
- for (let i = 0; i < this.postProcessors.length; i++) {
- postProcessors.push(this.postProcessors[i].postProcessor);
- }
- return postProcessors;
- }
-
- /**
- *
- * @returns {Array}
- * @private
- */
- getVisitors() {
- return this.visitors;
- }
-
- visitor() {
- const self = this;
- return {
- first: function() {
- self.iterator = -1;
- return self.visitors[self.iterator];
- },
- get: function() {
- self.iterator += 1;
- return self.visitors[self.iterator];
- }
- };
- }
-
- /**
- *
- * @returns {Array}
- * @private
- */
- getFileManagers() {
- return this.fileManagers;
- }
- }
-
- let pm;
-
- const PluginManagerFactory = function(less, newFactory) {
- if (newFactory || !pm) {
- pm = new PluginManager(less);
- }
- return pm;
- };
-
- function SourceMapOutput (environment) {
- class SourceMapOutput {
- constructor(options) {
- this._css = [];
- this._rootNode = options.rootNode;
- this._contentsMap = options.contentsMap;
- this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;
- if (options.sourceMapFilename) {
- this._sourceMapFilename = options.sourceMapFilename.replace(/\\/g, '/');
- }
- this._outputFilename = options.outputFilename ? options.outputFilename.replace(/\\/g, '/') : options.outputFilename;
- this.sourceMapURL = options.sourceMapURL;
- if (options.sourceMapBasepath) {
- this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\/g, '/');
- }
- if (options.sourceMapRootpath) {
- this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\/g, '/');
- if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {
- this._sourceMapRootpath += '/';
- }
- } else {
- this._sourceMapRootpath = '';
- }
- this._outputSourceFiles = options.outputSourceFiles;
- this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();
-
- this._lineNumber = 0;
- this._column = 0;
- }
-
- removeBasepath(path) {
- if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {
- path = path.substring(this._sourceMapBasepath.length);
- if (path.charAt(0) === '\\' || path.charAt(0) === '/') {
- path = path.substring(1);
- }
- }
-
- return path;
- }
-
- normalizeFilename(filename) {
- filename = filename.replace(/\\/g, '/');
- filename = this.removeBasepath(filename);
- return (this._sourceMapRootpath || '') + filename;
- }
-
- add(chunk, fileInfo, index, mapLines) {
-
- // ignore adding empty strings
- if (!chunk) {
- return;
- }
-
- let lines, sourceLines, columns, sourceColumns, i;
-
- if (fileInfo && fileInfo.filename) {
- let inputSource = this._contentsMap[fileInfo.filename];
-
- // remove vars/banner added to the top of the file
- if (this._contentsIgnoredCharsMap[fileInfo.filename]) {
- // adjust the index
- index -= this._contentsIgnoredCharsMap[fileInfo.filename];
- if (index < 0) { index = 0; }
- // adjust the source
- inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);
- }
-
- /**
- * ignore empty content, or failsafe
- * if contents map is incorrect
- */
- if (inputSource === undefined) {
- this._css.push(chunk);
- return;
- }
-
- inputSource = inputSource.substring(0, index);
- sourceLines = inputSource.split('\n');
- sourceColumns = sourceLines[sourceLines.length - 1];
- }
-
- lines = chunk.split('\n');
- columns = lines[lines.length - 1];
-
- if (fileInfo && fileInfo.filename) {
- if (!mapLines) {
- this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},
- original: { line: sourceLines.length, column: sourceColumns.length},
- source: this.normalizeFilename(fileInfo.filename)});
- } else {
- for (i = 0; i < lines.length; i++) {
- this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},
- original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},
- source: this.normalizeFilename(fileInfo.filename)});
- }
- }
- }
-
- if (lines.length === 1) {
- this._column += columns.length;
- } else {
- this._lineNumber += lines.length - 1;
- this._column = columns.length;
- }
-
- this._css.push(chunk);
- }
-
- isEmpty() {
- return this._css.length === 0;
- }
-
- toCSS(context) {
- this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });
-
- if (this._outputSourceFiles) {
- for (const filename in this._contentsMap) {
- // eslint-disable-next-line no-prototype-builtins
- if (this._contentsMap.hasOwnProperty(filename)) {
- let source = this._contentsMap[filename];
- if (this._contentsIgnoredCharsMap[filename]) {
- source = source.slice(this._contentsIgnoredCharsMap[filename]);
- }
- this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);
- }
- }
- }
-
- this._rootNode.genCSS(context, this);
-
- if (this._css.length > 0) {
- let sourceMapURL;
- const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());
-
- if (this.sourceMapURL) {
- sourceMapURL = this.sourceMapURL;
- } else if (this._sourceMapFilename) {
- sourceMapURL = this._sourceMapFilename;
- }
- this.sourceMapURL = sourceMapURL;
-
- this.sourceMap = sourceMapContent;
- }
-
- return this._css.join('');
- }
- }
-
- return SourceMapOutput;
- }
-
- function SourceMapBuilder (SourceMapOutput, environment) {
- class SourceMapBuilder {
- constructor(options) {
- this.options = options;
- }
-
- toCSS(rootNode, options, imports) {
- const sourceMapOutput = new SourceMapOutput(
- {
- contentsIgnoredCharsMap: imports.contentsIgnoredChars,
- rootNode,
- contentsMap: imports.contents,
- sourceMapFilename: this.options.sourceMapFilename,
- sourceMapURL: this.options.sourceMapURL,
- outputFilename: this.options.sourceMapOutputFilename,
- sourceMapBasepath: this.options.sourceMapBasepath,
- sourceMapRootpath: this.options.sourceMapRootpath,
- outputSourceFiles: this.options.outputSourceFiles,
- sourceMapGenerator: this.options.sourceMapGenerator,
- sourceMapFileInline: this.options.sourceMapFileInline,
- disableSourcemapAnnotation: this.options.disableSourcemapAnnotation
- });
-
- const css = sourceMapOutput.toCSS(options);
- this.sourceMap = sourceMapOutput.sourceMap;
- this.sourceMapURL = sourceMapOutput.sourceMapURL;
- if (this.options.sourceMapInputFilename) {
- this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);
- }
- if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {
- this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);
- }
- return css + this.getCSSAppendage();
- }
-
- getCSSAppendage() {
-
- let sourceMapURL = this.sourceMapURL;
- if (this.options.sourceMapFileInline) {
- if (this.sourceMap === undefined) {
- return '';
- }
- sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;
- }
-
- if (this.options.disableSourcemapAnnotation) {
- return '';
- }
-
- if (sourceMapURL) {
- return `/*# sourceMappingURL=${sourceMapURL} */`;
- }
- return '';
- }
-
- getExternalSourceMap() {
- return this.sourceMap;
- }
-
- setExternalSourceMap(sourceMap) {
- this.sourceMap = sourceMap;
- }
-
- isInline() {
- return this.options.sourceMapFileInline;
- }
-
- getSourceMapURL() {
- return this.sourceMapURL;
- }
-
- getOutputFilename() {
- return this.options.sourceMapOutputFilename;
- }
-
- getInputFilename() {
- return this.sourceMapInputFilename;
- }
- }
-
- return SourceMapBuilder;
- }
-
- function ParseTree(SourceMapBuilder) {
- class ParseTree {
- constructor(root, imports) {
- this.root = root;
- this.imports = imports;
- }
-
- toCSS(options) {
- let evaldRoot;
- const result = {};
- let sourceMapBuilder;
- try {
- evaldRoot = transformTree(this.root, options);
- } catch (e) {
- throw new LessError(e, this.imports);
- }
-
- try {
- const compress = Boolean(options.compress);
- if (compress) {
- logger$1.warn('The compress option has been deprecated. ' +
- 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');
- }
-
- const toCSSOptions = {
- compress,
- // @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead. All modes will be removed in a future version.
- dumpLineNumbers: options.dumpLineNumbers,
- strictUnits: Boolean(options.strictUnits),
- numPrecision: 8};
-
- if (options.sourceMap) {
- // Normalize sourceMap option: if it's just true, convert to object
- if (options.sourceMap === true) {
- options.sourceMap = {};
- }
- const sourceMapOpts = options.sourceMap;
-
- // Set sourceMapInputFilename if not set and filename is available
- if (!sourceMapOpts.sourceMapInputFilename && options.filename) {
- sourceMapOpts.sourceMapInputFilename = options.filename;
- }
-
- // Default sourceMapBasepath to the input file's directory if not set
- // This matches the behavior documented and implemented in bin/lessc
- if (sourceMapOpts.sourceMapBasepath === undefined && options.filename) {
- // Get directory from filename using string manipulation (works cross-platform)
- const lastSlash = Math.max(options.filename.lastIndexOf('/'), options.filename.lastIndexOf('\\'));
- if (lastSlash >= 0) {
- sourceMapOpts.sourceMapBasepath = options.filename.substring(0, lastSlash);
- } else {
- // No directory separator found, use current directory
- sourceMapOpts.sourceMapBasepath = '.';
- }
- }
-
- // Handle sourceMapFullFilename (CLI-specific: --source-map=filename)
- // This is converted to sourceMapFilename and sourceMapOutputFilename
- if (sourceMapOpts.sourceMapFullFilename && !sourceMapOpts.sourceMapFileInline) {
- // This case is handled by lessc before calling render
- // We just need to ensure sourceMapFilename is set if sourceMapFullFilename is provided
- if (!sourceMapOpts.sourceMapFilename && !sourceMapOpts.sourceMapURL) {
- // Extract just the basename for the sourceMappingURL comment
- const mapBase = sourceMapOpts.sourceMapFullFilename.split(/[/\\]/).pop();
- sourceMapOpts.sourceMapFilename = mapBase;
- }
- } else if (!sourceMapOpts.sourceMapFilename && !sourceMapOpts.sourceMapURL) {
- // If sourceMapFilename is not set and sourceMapURL is not set,
- // derive it from the output filename (if available) or input filename
- if (sourceMapOpts.sourceMapOutputFilename) {
- // Use output filename + .map
- sourceMapOpts.sourceMapFilename = sourceMapOpts.sourceMapOutputFilename + '.map';
- } else if (options.filename) {
- // Fallback to input filename + .css.map (basename only)
- const inputBasename = options.filename.split(/[/\\]/).pop().replace(/\.[^/.]+$/, '');
- sourceMapOpts.sourceMapFilename = inputBasename + '.css.map';
- }
- }
-
- // Default sourceMapOutputFilename if not set
- if (!sourceMapOpts.sourceMapOutputFilename) {
- if (options.filename) {
- const inputBasename = options.filename.split(/[/\\]/).pop().replace(/\.[^/.]+$/, '');
- sourceMapOpts.sourceMapOutputFilename = inputBasename + '.css';
- } else {
- sourceMapOpts.sourceMapOutputFilename = 'output.css';
- }
- }
-
- sourceMapBuilder = new SourceMapBuilder(sourceMapOpts);
- result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);
- } else {
- result.css = evaldRoot.toCSS(toCSSOptions);
- }
- } catch (e) {
- throw new LessError(e, this.imports);
- }
-
- if (options.pluginManager) {
- const postProcessors = options.pluginManager.getPostProcessors();
- for (let i = 0; i < postProcessors.length; i++) {
- result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });
- }
- }
- if (options.sourceMap) {
- result.map = sourceMapBuilder.getExternalSourceMap();
- }
-
- result.imports = [];
- for (const file in this.imports.files) {
- if (Object.prototype.hasOwnProperty.call(this.imports.files, file) && file !== this.imports.rootFilename) {
- result.imports.push(file);
- }
- }
- return result;
- }
- }
-
- return ParseTree;
- }
-
- function ImportManager(environment) {
- // FileInfo = {
- // 'rewriteUrls' - option - whether to adjust URL's to be relative
- // 'filename' - full resolved filename of current file
- // 'rootpath' - path to append to normal URLs for this node
- // 'currentDirectory' - path to the current file, absolute
- // 'rootFilename' - filename of the base file
- // 'entryPath' - absolute path to the entry file
- // 'reference' - whether the file should not be output and only output parts that are referenced
-
- class ImportManager {
- constructor(less, context, rootFileInfo) {
- this.less = less;
- this.rootFilename = rootFileInfo.filename;
- this.paths = context.paths || []; // Search paths, when importing
- this.contents = {}; // map - filename to contents of all the files
- this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore
- this.mime = context.mime;
- this.error = null;
- this.context = context;
- // Deprecated? Unused outside of here, could be useful.
- this.queue = []; // Files which haven't been imported yet
- this.files = {}; // Holds the imported parse trees.
- }
-
- /**
- * Add an import to be imported
- * @param path - the raw path
- * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)
- * @param currentFileInfo - the current file info (used for instance to work out relative paths)
- * @param importOptions - import options
- * @param callback - callback for when it is imported
- */
- push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {
- const importManager = this, pluginLoader = this.context.pluginManager.Loader;
-
- this.queue.push(path);
-
- const fileParsedFunc = function (e, root, fullPath) {
- importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue
-
- const importedEqualsRoot = fullPath === importManager.rootFilename;
- if (importOptions.optional && e) {
- callback(null, {rules:[]}, false, null);
- logger$1.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);
- }
- else {
- // Inline imports aren't cached here.
- // If we start to cache them, please make sure they won't conflict with non-inline imports of the
- // same name as they used to do before this comment and the condition below have been added.
- if (!importManager.files[fullPath] && !importOptions.inline) {
- importManager.files[fullPath] = { root, options: importOptions };
- }
- if (e && !importManager.error) { importManager.error = e; }
- callback(e, root, importedEqualsRoot, fullPath);
- }
- };
-
- const newFileInfo = {
- rewriteUrls: this.context.rewriteUrls,
- entryPath: currentFileInfo.entryPath,
- rootpath: currentFileInfo.rootpath,
- rootFilename: currentFileInfo.rootFilename
- };
-
- const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);
-
- if (!fileManager) {
- fileParsedFunc({ message: `Could not find a file-manager for ${path}` });
- return;
- }
-
- const loadFileCallback = function(loadedFile) {
- let plugin;
- const resolvedFilename = loadedFile.filename;
- const contents = loadedFile.contents.replace(/^\uFEFF/, '');
-
- // Pass on an updated rootpath if path of imported file is relative and file
- // is in a (sub|sup) directory
- //
- // Examples:
- // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',
- // then rootpath should become 'less/module/nav/'
- // - If path of imported file is '../mixins.less' and rootpath is 'less/',
- // then rootpath should become 'less/../'
- newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);
- if (newFileInfo.rewriteUrls) {
- newFileInfo.rootpath = fileManager.join(
- (importManager.context.rootpath || ''),
- fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));
-
- if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {
- newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);
- }
- }
- newFileInfo.filename = resolvedFilename;
-
- const newEnv = new contexts.Parse(importManager.context);
-
- newEnv.processImports = false;
- importManager.contents[resolvedFilename] = contents;
-
- if (currentFileInfo.reference || importOptions.reference) {
- newFileInfo.reference = true;
- }
-
- if (importOptions.isPlugin) {
- plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);
- if (plugin instanceof LessError) {
- fileParsedFunc(plugin, null, resolvedFilename);
- }
- else {
- fileParsedFunc(null, plugin, resolvedFilename);
- }
- } else if (importOptions.inline) {
- fileParsedFunc(null, contents, resolvedFilename);
- } else {
- // import (multiple) parse trees apparently get altered and can't be cached.
- // TODO: investigate why this is
- if (importManager.files[resolvedFilename]
- && !importManager.files[resolvedFilename].options.multiple
- && !importOptions.multiple) {
-
- fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);
- }
- else {
- new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {
- fileParsedFunc(e, root, resolvedFilename);
- });
- }
- }
- };
- let loadedFile;
- let promise;
- const context = clone(this.context);
-
- if (tryAppendExtension) {
- context.ext = importOptions.isPlugin ? '.js' : '.less';
- }
-
- if (importOptions.isPlugin) {
- context.mime = 'application/javascript';
-
- if (context.syncImport) {
- loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);
- } else {
- promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);
- }
- }
- else {
- if (context.syncImport) {
- loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);
- } else {
- promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,
- (err, loadedFile) => {
- if (err) {
- fileParsedFunc(err);
- } else {
- loadFileCallback(loadedFile);
- }
- });
- }
- }
- if (loadedFile) {
- if (!loadedFile.filename) {
- fileParsedFunc(loadedFile);
- } else {
- loadFileCallback(loadedFile);
- }
- } else if (promise) {
- promise.then(loadFileCallback, fileParsedFunc);
- }
- }
- }
-
- return ImportManager;
- }
-
- function Parse(environment, ParseTree, ImportManager) {
- const parse = function (input, options, callback) {
-
- if (typeof options === 'function') {
- callback = options;
- options = copyOptions(this.options, {});
- }
- else {
- options = copyOptions(this.options, options || {});
- }
-
- if (!callback) {
- const self = this;
- return new Promise(function (resolve, reject) {
- parse.call(self, input, options, function(err, output) {
- if (err) {
- reject(err);
- } else {
- resolve(output);
- }
- });
- });
- } else {
- let context;
- let rootFileInfo;
- const pluginManager = new PluginManagerFactory(this, !options.reUsePluginManager);
-
- options.pluginManager = pluginManager;
-
- context = new contexts.Parse(options);
-
- if (options.rootFileInfo) {
- rootFileInfo = options.rootFileInfo;
- } else {
- const filename = options.filename || 'input';
- const entryPath = filename.replace(/[^/\\]*$/, '');
- rootFileInfo = {
- filename,
- rewriteUrls: context.rewriteUrls,
- rootpath: context.rootpath || '',
- currentDirectory: entryPath,
- entryPath,
- rootFilename: filename
- };
- // add in a missing trailing slash
- if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {
- rootFileInfo.rootpath += '/';
- }
- }
-
- const imports = new ImportManager(this, context, rootFileInfo);
- this.importManager = imports;
-
- // TODO: allow the plugins to be just a list of paths or names
- // Do an async plugin queue like lessc
-
- if (options.plugins) {
- options.plugins.forEach(function(plugin) {
- let evalResult, contents;
- if (plugin.fileContent) {
- contents = plugin.fileContent.replace(/^\uFEFF/, '');
- evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);
- if (evalResult instanceof LessError) {
- return callback(evalResult);
- }
- }
- else {
- pluginManager.addPlugin(plugin);
- }
- });
- }
-
- new Parser(context, imports, rootFileInfo)
- .parse(input, function (e, root) {
- if (e) { return callback(e); }
- callback(null, root, imports, options);
- }, options);
- }
- };
- return parse;
- }
-
- function Render(environment, ParseTree) {
- const render = function (input, options, callback) {
- if (typeof options === 'function') {
- callback = options;
- options = copyOptions(this.options, {});
- }
- else {
- options = copyOptions(this.options, options || {});
- }
-
- if (!callback) {
- const self = this;
- return new Promise(function (resolve, reject) {
- render.call(self, input, options, function(err, output) {
- if (err) {
- reject(err);
- } else {
- resolve(output);
- }
- });
- });
- } else {
- this.parse(input, options, function(err, root, imports, options) {
- if (err) { return callback(err); }
-
- let result;
- try {
- const parseTree = new ParseTree(root, imports);
- result = parseTree.toCSS(options);
- }
- catch (err) { return callback(err); }
-
- callback(null, result);
- });
- }
- };
-
- return render;
- }
-
- function parseNodeVersion(version) {
- var match = version.match(/^v(\d{1,2})\.(\d{1,2})\.(\d{1,2})(?:-([0-9A-Za-z-.]+))?(?:\+([0-9A-Za-z-.]+))?$/); // eslint-disable-line max-len
- if (!match) {
- throw new Error('Unable to parse: ' + version);
- }
-
- var res = {
- major: parseInt(match[1], 10),
- minor: parseInt(match[2], 10),
- patch: parseInt(match[3], 10),
- pre: match[4] || '',
- build: match[5] || '',
- };
-
- return res;
- }
-
- var parseNodeVersion_1 = parseNodeVersion;
-
- function lessRoot(environment, fileManagers, version = '0.0.0') {
- let sourceMapOutput, sourceMapBuilder, parseTree, importManager;
-
- environment = new Environment(environment, fileManagers);
- sourceMapOutput = SourceMapOutput(environment);
- sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);
- parseTree = ParseTree(sourceMapBuilder);
- importManager = ImportManager(environment);
-
- const render = Render(environment, parseTree);
- const parse = Parse(environment, parseTree, importManager);
-
- const v = parseNodeVersion_1(`v${version}`);
- const initial = {
- version: [v.major, v.minor, v.patch],
- data,
- tree,
- Environment,
- AbstractFileManager,
- AbstractPluginLoader,
- environment,
- visitors,
- Parser,
- functions: functions(environment),
- contexts,
- SourceMapOutput: sourceMapOutput,
- SourceMapBuilder: sourceMapBuilder,
- ParseTree: parseTree,
- ImportManager: importManager,
- render,
- parse,
- LessError,
- transformTree,
- utils,
- PluginManager: PluginManagerFactory,
- logger: logger$1
- };
-
- // Create a public API
-
- const ctor = function(t) {
- return function() {
- const obj = Object.create(t.prototype);
- t.apply(obj, Array.prototype.slice.call(arguments, 0));
- return obj;
- };
- };
- let t;
- const api = Object.create(initial);
- for (const n in initial.tree) {
- /* eslint guard-for-in: 0 */
- t = initial.tree[n];
- if (typeof t === 'function') {
- api[n.toLowerCase()] = ctor(t);
- }
- else {
- api[n] = Object.create(null);
- for (const o in t) {
- /* eslint guard-for-in: 0 */
- api[n][o.toLowerCase()] = ctor(t[o]);
- }
- }
- }
-
- /**
- * Some of the functions assume a `this` context of the API object,
- * which causes it to fail when wrapped for ES6 imports.
- *
- * An assumed `this` should be removed in the future.
- */
- initial.parse = initial.parse.bind(api);
- initial.render = initial.render.bind(api);
-
- return api;
- }
-
- let options$1;
- let logger;
- let fileCache = {};
-
- // TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load
- const FileManager = function() {};
- FileManager.prototype = Object.assign(new AbstractFileManager(), {
- alwaysMakePathsAbsolute() {
- return true;
- },
-
- join(basePath, laterPath) {
- if (!basePath) {
- return laterPath;
- }
- return this.extractUrlParts(laterPath, basePath).path;
- },
-
- doXHR(url, type, callback, errback) {
- const xhr = new XMLHttpRequest();
- const async = options$1.isFileProtocol ? options$1.fileAsync : true;
-
- if (typeof xhr.overrideMimeType === 'function') {
- xhr.overrideMimeType('text/css');
- }
- logger.debug(`XHR: Getting '${url}'`);
- xhr.open('GET', url, async);
- xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');
- xhr.send(null);
-
- function handleResponse(xhr, callback, errback) {
- if (xhr.status >= 200 && xhr.status < 300) {
- callback(xhr.responseText,
- xhr.getResponseHeader('Last-Modified'));
- } else if (typeof errback === 'function') {
- errback(xhr.status, url);
- }
- }
-
- if (options$1.isFileProtocol && !options$1.fileAsync) {
- if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {
- callback(xhr.responseText);
- } else {
- errback(xhr.status, url);
- }
- } else if (async) {
- xhr.onreadystatechange = () => {
- if (xhr.readyState == 4) {
- handleResponse(xhr, callback, errback);
- }
- };
- } else {
- handleResponse(xhr, callback, errback);
- }
- },
-
- supports() {
- return true;
- },
-
- clearFileCache() {
- fileCache = {};
- },
-
- loadFile(filename, currentDirectory, options) {
- // TODO: Add prefix support like less-node?
- // What about multiple paths?
-
- if (currentDirectory && !this.isPathAbsolute(filename)) {
- filename = currentDirectory + filename;
- }
-
- filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;
-
- options = options || {};
-
- // sheet may be set to the stylesheet for the initial load or a collection of properties including
- // some context variables for imports
- const hrefParts = this.extractUrlParts(filename, window.location.href);
- const href = hrefParts.url;
- const self = this;
-
- return new Promise((resolve, reject) => {
- if (options.useFileCache && fileCache[href]) {
- try {
- const lessText = fileCache[href];
- return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});
- } catch (e) {
- return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });
- }
- }
-
- self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {
- // per file cache
- fileCache[href] = data;
-
- // Use remote copy (re-parse)
- resolve({ contents: data, filename: href, webInfo: { lastModified }});
- }, function doXHRError(status, url) {
- reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });
- });
- });
- }
- });
-
- var FM = (opts, log) => {
- options$1 = opts;
- logger = log;
- return FileManager;
- };
-
- /**
- * @todo Add tests for browser `@plugin`
- */
-
- /**
- * Browser Plugin Loader
- */
- const PluginLoader = function(less) {
- this.less = less;
- // Should we shim this.require for browser? Probably not?
- };
-
- PluginLoader.prototype = Object.assign(new AbstractPluginLoader(), {
- loadPlugin(filename, basePath, context, environment, fileManager) {
- return new Promise((fulfill, reject) => {
- fileManager.loadFile(filename, basePath, context, environment)
- .then(fulfill).catch(reject);
- });
- }
- });
-
- var LogListener = (less, options) => {
- const logLevel_debug = 4;
- const logLevel_info = 3;
- const logLevel_warn = 2;
- const logLevel_error = 1;
-
- // The amount of logging in the javascript console.
- // 3 - Debug, information and errors
- // 2 - Information and errors
- // 1 - Errors
- // 0 - None
- // Defaults to 2
- options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);
-
- if (!options.loggers) {
- options.loggers = [{
- debug: function(msg) {
- if (options.logLevel >= logLevel_debug) {
- console.log(msg);
- }
- },
- info: function(msg) {
- if (options.logLevel >= logLevel_info) {
- console.log(msg);
- }
- },
- warn: function(msg) {
- if (options.logLevel >= logLevel_warn) {
- console.warn(msg);
- }
- },
- error: function(msg) {
- if (options.logLevel >= logLevel_error) {
- console.error(msg);
- }
- }
- }];
- }
- for (let i = 0; i < options.loggers.length; i++) {
- less.logger.addListener(options.loggers[i]);
- }
- };
-
- var ErrorReporting = (window, less, options) => {
-
- function errorHTML(e, rootHref) {
- const id = `less-error-message:${extractId(rootHref || '')}`;
- const template = '{content}';
- const elem = window.document.createElement('div');
- let timer;
- let content;
- const errors = [];
- const filename = e.filename || rootHref;
- const filenameNoPath = filename.match(/([^/]+(\?.*)?)$/)[1];
-
- elem.id = id;
- elem.className = 'less-error-message';
-
- content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` +
- `
in ${filenameNoPath} `;
-
- const errorline = (e, i, classname) => {
- if (e.extract[i] !== undefined) {
- errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1))
- .replace(/\{class\}/, classname)
- .replace(/\{content\}/, e.extract[i]));
- }
- };
-
- if (e.line) {
- errorline(e, 0, '');
- errorline(e, 1, 'line');
- errorline(e, 2, '');
- content += `on line ${e.line}, column ${e.column + 1}:
`;
- }
- if (e.stack && (e.extract || options.logLevel >= 4)) {
- content += `
Stack Trace${e.stack.split('\n').slice(1).join('
')}`;
- }
- elem.innerHTML = content;
-
- // CSS for error messages
- browser$1.createCSS(window.document, [
- '.less-error-message ul, .less-error-message li {',
- 'list-style-type: none;',
- 'margin-right: 15px;',
- 'padding: 4px 0;',
- 'margin: 0;',
- '}',
- '.less-error-message label {',
- 'font-size: 12px;',
- 'margin-right: 15px;',
- 'padding: 4px 0;',
- 'color: #cc7777;',
- '}',
- '.less-error-message pre {',
- 'color: #dd6666;',
- 'padding: 4px 0;',
- 'margin: 0;',
- 'display: inline-block;',
- '}',
- '.less-error-message pre.line {',
- 'color: #ff0000;',
- '}',
- '.less-error-message h3 {',
- 'font-size: 20px;',
- 'font-weight: bold;',
- 'padding: 15px 0 5px 0;',
- 'margin: 0;',
- '}',
- '.less-error-message a {',
- 'color: #10a',
- '}',
- '.less-error-message .error {',
- 'color: red;',
- 'font-weight: bold;',
- 'padding-bottom: 2px;',
- 'border-bottom: 1px dashed red;',
- '}'
- ].join('\n'), { title: 'error-message' });
-
- elem.style.cssText = [
- 'font-family: Arial, sans-serif',
- 'border: 1px solid #e00',
- 'background-color: #eee',
- 'border-radius: 5px',
- '-webkit-border-radius: 5px',
- '-moz-border-radius: 5px',
- 'color: #e00',
- 'padding: 15px',
- 'margin-bottom: 15px'
- ].join(';');
-
- if (options.env === 'development') {
- timer = setInterval(() => {
- const document = window.document;
- const body = document.body;
- if (body) {
- if (document.getElementById(id)) {
- body.replaceChild(elem, document.getElementById(id));
- } else {
- body.insertBefore(elem, body.firstChild);
- }
- clearInterval(timer);
- }
- }, 10);
- }
- }
-
- function removeErrorHTML(path) {
- const node = window.document.getElementById(`less-error-message:${extractId(path)}`);
- if (node) {
- node.parentNode.removeChild(node);
- }
- }
-
- function removeError(path) {
- if (!options.errorReporting || options.errorReporting === 'html') {
- removeErrorHTML(path);
- } else if (options.errorReporting === 'console') ; else if (typeof options.errorReporting === 'function') {
- options.errorReporting('remove', path);
- }
- }
-
- function errorConsole(e, rootHref) {
- const template = '{line} {content}';
- const filename = e.filename || rootHref;
- const errors = [];
- let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;
-
- const errorline = (e, i, classname) => {
- if (e.extract[i] !== undefined) {
- errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1))
- .replace(/\{class\}/, classname)
- .replace(/\{content\}/, e.extract[i]));
- }
- };
-
- if (e.line) {
- errorline(e, 0, '');
- errorline(e, 1, 'line');
- errorline(e, 2, '');
- content += ` on line ${e.line}, column ${e.column + 1}:\n${errors.join('\n')}`;
- }
- if (e.stack && (e.extract || options.logLevel >= 4)) {
- content += `\nStack Trace\n${e.stack}`;
- }
- less.logger.error(content);
- }
-
- function error(e, rootHref) {
- if (!options.errorReporting || options.errorReporting === 'html') {
- errorHTML(e, rootHref);
- } else if (options.errorReporting === 'console') {
- errorConsole(e, rootHref);
- } else if (typeof options.errorReporting === 'function') {
- options.errorReporting('add', e, rootHref);
- }
- }
-
- return {
- add: error,
- remove: removeError
- };
- };
-
- // Cache system is a bit outdated and could do with work
-
- var Cache = (window, options, logger) => {
- let cache = null;
- if (options.env !== 'development') {
- try {
- cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;
- } catch (_) {}
- }
- return {
- setCSS: function(path, lastModified, modifyVars, styles) {
- if (cache) {
- logger.info(`saving ${path} to cache.`);
- try {
- cache.setItem(path, styles);
- cache.setItem(`${path}:timestamp`, lastModified);
- if (modifyVars) {
- cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));
- }
- } catch (e) {
- // TODO - could do with adding more robust error handling
- logger.error(`failed to save "${path}" to local storage for caching.`);
- }
- }
- },
- getCSS: function(path, webInfo, modifyVars) {
- const css = cache && cache.getItem(path);
- const timestamp = cache && cache.getItem(`${path}:timestamp`);
- let vars = cache && cache.getItem(`${path}:vars`);
-
- modifyVars = modifyVars || {};
- vars = vars || '{}'; // if not set, treat as the JSON representation of an empty object
-
- if (timestamp && webInfo.lastModified &&
- (new Date(webInfo.lastModified).valueOf() ===
- new Date(timestamp).valueOf()) &&
- JSON.stringify(modifyVars) === vars) {
- // Use local copy
- return css;
- }
- }
- };
- };
-
- var ImageSize = () => {
- function imageSize() {
- throw {
- type: 'Runtime',
- message: 'Image size functions are not supported in browser version of less'
- };
- }
-
- const imageFunctions = {
- 'image-size': function(filePathNode) {
- imageSize();
- return -1;
- },
- 'image-width': function(filePathNode) {
- imageSize();
- return -1;
- },
- 'image-height': function(filePathNode) {
- imageSize();
- return -1;
- }
- };
-
- functionRegistry.addMultiple(imageFunctions);
- };
-
- var name = "less";
- var version = "4.5.0";
- var description = "Leaner CSS";
- var homepage = "http://lesscss.org";
- var author = {
- name: "Alexis Sellier",
- email: "self@cloudhead.net"
- };
- var contributors = [
- "The Core Less Team"
- ];
- var bugs = {
- url: "https://github.com/less/less.js/issues"
- };
- var repository = {
- type: "git",
- url: "https://github.com/less/less.js.git"
- };
- var master = {
- url: "https://github.com/less/less.js/blob/master/",
- raw: "https://raw.githubusercontent.com/less/less.js/master/"
- };
- var license = "Apache-2.0";
- var type = "module";
- var bin = {
- lessc: "./bin/lessc"
- };
- var main = "./lib/less-node/index.js";
- var exports$1 = {
- ".": "./lib/less-node/index.js",
- "./lib/*": "./lib/*"
- };
- var directories = {
- test: "./test"
- };
- var browser = "./dist/less.js";
- var engines = {
- node: ">=18"
- };
- var scripts = {
- quicktest: "grunt quicktest",
- test: "grunt test",
- "test:coverage": "c8 -r lcov -r json-summary -r text-summary -r html --include=\"lib/**/*.js\" --include=\"bin/**/*.js\" --exclude=\"dist/**\" --exclude=\"**/*.test.js\" --exclude=\"**/*.spec.js\" --exclude=\"test/**\" --exclude=\"tmp/**\" --exclude=\"**/abstract-file-manager.js\" --exclude=\"**/abstract-plugin-loader.js\" grunt shell:test && node scripts/coverage-report.js && node scripts/coverage-lines.js",
- grunt: "grunt",
- lint: "eslint '**/*.{ts,js}'",
- "lint:fix": "eslint '**/*.{ts,js}' --fix",
- typecheck: "tsc",
- build: "node build/rollup.js --dist",
- prepublishOnly: "grunt dist",
- postinstall: "node scripts/postinstall.js"
- };
- var optionalDependencies = {
- errno: "^0.1.1",
- "graceful-fs": "^4.1.2",
- "image-size": "~0.5.0",
- "make-dir": "^2.1.0",
- mime: "^1.4.1",
- needle: "^3.1.0",
- "source-map": "~0.6.0"
- };
- var devDependencies = {
- "@less/test-data": "workspace:*",
- "@less/test-import-module": "workspace:*",
- "@rollup/plugin-commonjs": "^17.0.0",
- "@rollup/plugin-json": "^4.1.0",
- "@rollup/plugin-node-resolve": "^11.0.0",
- "@typescript-eslint/eslint-plugin": "^4.28.0",
- "@typescript-eslint/parser": "^4.28.0",
- benny: "^3.6.12",
- "bootstrap-less-port": "0.3.0",
- chai: "^4.2.0",
- c8: "^10.1.3",
- chalk: "^4.1.2",
- cosmiconfig: "~9.0.0",
- "cross-env": "^7.0.3",
- eslint: "^7.29.0",
- "fs-extra": "^8.1.0",
- "git-rev": "^0.2.1",
- glob: "~11.0.3",
- globby: "^10.0.1",
- grunt: "^1.5.0",
- "grunt-cli": "^1.3.2",
- "grunt-contrib-clean": "^1.0.0",
- "grunt-contrib-connect": "^1.0.2",
- "grunt-eslint": "^23.0.0",
- "grunt-saucelabs": "^9.0.1",
- "grunt-shell": "^1.3.0",
- "html-template-tag": "^3.2.0",
- "jest-diff": "~30.1.2",
- "jit-grunt": "^0.10.0",
- "less-plugin-autoprefix": "^1.5.1",
- "less-plugin-clean-css": "^1.6.0",
- minimist: "^1.2.0",
- mocha: "^6.2.1",
- "mocha-teamcity-reporter": "^3.0.0",
- "npm-run-all": "^4.1.5",
- "performance-now": "^0.2.0",
- phin: "^2.2.3",
- playwright: "1.50.1",
- promise: "^7.1.1",
- "read-glob": "^3.0.0",
- resolve: "^1.17.0",
- rollup: "^2.52.2",
- "rollup-plugin-terser": "^5.1.1",
- semver: "^6.3.0",
- shx: "^0.3.2",
- "time-grunt": "^1.3.0",
- typescript: "^5.7.0",
- uikit: "2.27.4"
- };
- var keywords = [
- "compile less",
- "css nesting",
- "css variable",
- "css",
- "gradients css",
- "gradients css3",
- "less compiler",
- "less css",
- "less mixins",
- "less",
- "less.js",
- "lesscss",
- "mixins",
- "nested css",
- "parser",
- "preprocessor",
- "bootstrap css",
- "bootstrap less",
- "style",
- "styles",
- "stylesheet",
- "variables in css",
- "css less"
- ];
- var rawcurrent = "https://raw.github.com/less/less.js/v";
- var sourcearchive = "https://github.com/less/less.js/archive/v";
- var dependencies = {
- "copy-anything": "^2.0.1",
- "parse-node-version": "^1.0.1"
- };
- var gitHead = "1df9072ee9ebdadc791bf35dfb1dbc3ef9f1948f";
- var pkg = {
- name: name,
- version: version,
- description: description,
- homepage: homepage,
- author: author,
- contributors: contributors,
- bugs: bugs,
- repository: repository,
- master: master,
- license: license,
- type: type,
- bin: bin,
- main: main,
- exports: exports$1,
- directories: directories,
- browser: browser,
- engines: engines,
- scripts: scripts,
- optionalDependencies: optionalDependencies,
- devDependencies: devDependencies,
- keywords: keywords,
- rawcurrent: rawcurrent,
- sourcearchive: sourcearchive,
- dependencies: dependencies,
- gitHead: gitHead
- };
-
- //
-
- /**
- * @param {Window} window
- * @param {Object} options
- */
- var root = (window, options) => {
- const document = window.document;
- const less = lessRoot(undefined, undefined, pkg.version);
-
- less.options = options;
- const environment = less.environment;
- const FileManager = FM(options, less.logger);
- const fileManager = new FileManager();
- environment.addFileManager(fileManager);
- less.FileManager = FileManager;
- less.PluginLoader = PluginLoader;
-
- LogListener(less, options);
- const errors = ErrorReporting(window, less, options);
- const cache = less.cache = options.cache || Cache(window, options, less.logger);
- ImageSize(less.environment);
-
- // Setup user functions - Deprecate?
- if (options.functions) {
- less.functions.functionRegistry.addMultiple(options.functions);
- }
-
- const typePattern = /^text\/(x-)?less$/;
-
- function clone(obj) {
- const cloned = {};
- for (const prop in obj) {
- if (Object.prototype.hasOwnProperty.call(obj, prop)) {
- cloned[prop] = obj[prop];
- }
- }
- return cloned;
- }
-
- function loadStyles(modifyVars) {
- const styles = document.getElementsByTagName('style');
-
- for (let style of styles) {
- if (style.type.match(typePattern)) {
- const instanceOptions = {
- ...clone(options),
- modifyVars,
- filename: document.location.href.replace(/#.*$/, '')
- };
-
- const lessText = style.innerHTML || '';
-
- /* jshint loopfunc:true */
- less.render(lessText, instanceOptions, (err, result) => {
- if (err) {
- errors.add(err, 'inline');
- } else {
- style.type = 'text/css';
- if (style.styleSheet) {
- style.styleSheet.cssText = result.css;
- } else {
- style.innerHTML = result.css;
- }
- }
- });
- }
- }
- }
-
- function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {
-
- const instanceOptions = clone(options);
- addDataAttr(instanceOptions, sheet);
- instanceOptions.mime = sheet.type;
-
- if (modifyVars) {
- instanceOptions.modifyVars = modifyVars;
- }
-
- function loadInitialFileCallback(loadedFile) {
- const data = loadedFile.contents;
- const path = loadedFile.filename;
- const webInfo = loadedFile.webInfo;
-
- const newFileInfo = {
- currentDirectory: fileManager.getPath(path),
- filename: path,
- rootFilename: path,
- rewriteUrls: instanceOptions.rewriteUrls
- };
-
- newFileInfo.entryPath = newFileInfo.currentDirectory;
- newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;
-
- if (webInfo) {
- webInfo.remaining = remaining;
-
- const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);
- if (!reload && css) {
- webInfo.local = true;
- callback(null, css, data, sheet, webInfo, path);
- return;
- }
-
- }
-
- // TODO add tests around how this behaves when reloading
- errors.remove(path);
-
- instanceOptions.rootFileInfo = newFileInfo;
- less.render(data, instanceOptions, (e, result) => {
- if (e) {
- e.href = path;
- callback(e);
- } else {
- cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);
- callback(null, result.css, data, sheet, webInfo, path);
- }
- });
- }
-
- fileManager.loadFile(sheet.href, null, instanceOptions, environment)
- .then(loadedFile => {
- loadInitialFileCallback(loadedFile);
- }).catch(err => {
- console.log(err);
- callback(err);
- });
-
- }
-
- function loadStyleSheets(callback, reload, modifyVars) {
- for (let i = 0; i < less.sheets.length; i++) {
- loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);
- }
- }
-
- function initRunningMode() {
- if (less.env === 'development') {
- less.watchTimer = setInterval(() => {
- if (less.watchMode) {
- fileManager.clearFileCache();
- /**
- * @todo remove when this is typed with JSDoc
- */
- // eslint-disable-next-line no-unused-vars
- loadStyleSheets((e, css, _, sheet, webInfo) => {
- if (e) {
- errors.add(e, e.href || sheet.href);
- } else if (css) {
- browser$1.createCSS(window.document, css, sheet);
- }
- });
- }
- }, options.poll);
- }
- }
-
- //
- // Watch mode
- //
- less.watch = function () {
- if (!less.watchMode ) {
- less.env = 'development';
- initRunningMode();
- }
- this.watchMode = true;
- return true;
- };
-
- less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };
-
- //
- // Synchronously get all tags with the 'rel' attribute set to
- // "stylesheet/less".
- //
- less.registerStylesheetsImmediately = () => {
- const links = document.getElementsByTagName('link');
- less.sheets = [];
-
- for (let i = 0; i < links.length; i++) {
- if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&
- (links[i].type.match(typePattern)))) {
- less.sheets.push(links[i]);
- }
- }
- };
-
- //
- // Asynchronously get all tags with the 'rel' attribute set to
- // "stylesheet/less", returning a Promise.
- //
- less.registerStylesheets = () => new Promise((resolve) => {
- less.registerStylesheetsImmediately();
- resolve();
- });
-
- //
- // With this function, it's possible to alter variables and re-render
- // CSS without reloading less-files
- //
- less.modifyVars = record => less.refresh(true, record, false);
-
- less.refresh = (reload, modifyVars, clearFileCache) => {
- if ((reload || clearFileCache) && clearFileCache !== false) {
- fileManager.clearFileCache();
- }
- return new Promise((resolve, reject) => {
- let startTime;
- let endTime;
- let totalMilliseconds;
- let remainingSheets;
- startTime = endTime = new Date();
-
- // Set counter for remaining unprocessed sheets
- remainingSheets = less.sheets.length;
-
- if (remainingSheets === 0) {
-
- endTime = new Date();
- totalMilliseconds = endTime - startTime;
- less.logger.info('Less has finished and no sheets were loaded.');
- resolve({
- startTime,
- endTime,
- totalMilliseconds,
- sheets: less.sheets.length
- });
-
- } else {
- // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array
- loadStyleSheets((e, css, _, sheet, webInfo) => {
- if (e) {
- errors.add(e, e.href || sheet.href);
- reject(e);
- return;
- }
- if (webInfo.local) {
- less.logger.info(`Loading ${sheet.href} from cache.`);
- } else {
- less.logger.info(`Rendered ${sheet.href} successfully.`);
- }
- browser$1.createCSS(window.document, css, sheet);
- less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);
-
- // Count completed sheet
- remainingSheets--;
-
- // Check if the last remaining sheet was processed and then call the promise
- if (remainingSheets === 0) {
- totalMilliseconds = new Date() - startTime;
- less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);
- resolve({
- startTime,
- endTime,
- totalMilliseconds,
- sheets: less.sheets.length
- });
- }
- endTime = new Date();
- }, reload, modifyVars);
- }
-
- loadStyles(modifyVars);
- });
- };
-
- less.refreshStyles = loadStyles;
- return less;
- };
-
- /**
- * Kicks off less and compiles any stylesheets
- * used in the browser distributed version of less
- * to kick-start less using the browser api
- */
-
- const options = defaultOptions();
-
- if (window.less) {
- for (const key in window.less) {
- if (Object.prototype.hasOwnProperty.call(window.less, key)) {
- options[key] = window.less[key];
- }
- }
- }
- addDefaultOptions(window, options);
-
- options.plugins = options.plugins || [];
-
- if (window.LESS_PLUGINS) {
- options.plugins = options.plugins.concat(window.LESS_PLUGINS);
- }
-
- const less = root(window, options);
-
- window.less = less;
-
- let css;
- let head;
- let style;
-
- // Always restore page visibility
- function resolveOrReject(data) {
- if (data.filename) {
- console.warn(data);
- }
- if (!options.async) {
- head.removeChild(style);
- }
- }
-
- if (options.onReady) {
- if (/!watch/.test(window.location.hash)) {
- less.watch();
- }
- // Simulate synchronous stylesheet loading by hiding page rendering
- if (!options.async) {
- css = 'body { display: none !important }';
- head = document.head || document.getElementsByTagName('head')[0];
- style = document.createElement('style');
-
- style.type = 'text/css';
- if (style.styleSheet) {
- style.styleSheet.cssText = css;
- } else {
- style.appendChild(document.createTextNode(css));
- }
-
- head.appendChild(style);
- }
- less.registerStylesheetsImmediately();
- less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);
- }
-
- return less;
-
-}));
diff --git a/packages/less/dist/less.min.js b/packages/less/dist/less.min.js
deleted file mode 100644
index cb0b02074..000000000
--- a/packages/less/dist/less.min.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * Less - Leaner CSS v4.5.0
- * http://lesscss.org
- *
- * Copyright (c) 2009-2026, Alexis Sellier
- * Licensed under the Apache-2.0 License.
- *
- * @license Apache-2.0
- */
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).less=t()}(this,(function(){"use strict";function e(e){return e.replace(/^[a-z-]+:\/+?[^/]+/,"").replace(/[?&]livereload=\w+/,"").replace(/^\//,"").replace(/\.[a-zA-Z]+$/,"").replace(/[^.\w-]+/g,"-").replace(/\./g,":")}function t(e,t){if(t)for(const i in t.dataset)if(Object.prototype.hasOwnProperty.call(t.dataset,i))if("env"===i||"dumpLineNumbers"===i||"rootpath"===i||"errorReporting"===i)e[i]=t.dataset[i];else try{e[i]=JSON.parse(t.dataset[i])}catch(e){}}var i=function(t,i,n){const s=n.href||"",r="less:"+(n.title||e(s)),o=t.getElementById(r);let a=!1;const l=t.createElement("style");l.setAttribute("type","text/css"),n.media&&l.setAttribute("media",n.media),l.id=r,l.styleSheet||(l.appendChild(t.createTextNode(i)),a=null!==o&&o.childNodes.length>0&&l.childNodes.length>0&&o.firstChild.nodeValue===l.firstChild.nodeValue);const c=t.getElementsByTagName("head")[0];if(null===o||!1===a){const e=n&&n.nextSibling||null;e?e.parentNode.insertBefore(l,e):c.appendChild(l)}if(o&&!1===a&&o.parentNode.removeChild(o),l.styleSheet)try{l.styleSheet.cssText=i}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},n=function(e){const t=e.document;return t.currentScript||(()=>{const e=t.getElementsByTagName("script");return e[e.length-1]})()},s={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(let t=0;t=0;s--){const a=o[s];if(a[r?"supportsSync":"supports"](e,t,i,n))return a}return null}addFileManager(e){this.fileManagers.push(e)}clearFileManagers(){this.fileManagers=[]}}var o={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},a={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:o,unitConversions:a};class c{constructor(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null}get currentFileInfo(){return this.fileInfo()}get index(){return this.getIndex()}setParent(e,t){function i(e){e&&e instanceof c&&(e.parent=t)}Array.isArray(e)?e.forEach(i):i(e)}getIndex(){return this._index||this.parent&&this.parent.getIndex()||0}fileInfo(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}}isRulesetLike(){return!1}toCSS(e){const t=[];return this.genCSS(e,{add:function(e,i,n){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")}genCSS(e,t){t.add(this.value)}accept(e){this.value=e.visit(this.value)}eval(){return this}_operate(e,t,i,n){switch(t){case"+":return i+n;case"-":return i-n;case"*":return i*n;case"/":return i/n}}fround(e,t){const i=e&&e.numPrecision;return i?Number((t+2e-16).toFixed(i)):t}static compare(e,t){if(e.compare&&"Quoted"!==t.type&&"Anonymous"!==t.type)return e.compare(t);if(t.compare)return-t.compare(e);if(e.type===t.type){if(e=e.value,t=t.value,!Array.isArray(e))return e===t?0:void 0;if(e.length===t.length){for(let i=0;it?1:void 0}blocksVisibility(){return void 0===this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks}addVisibilityBlock(){void 0===this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1}removeVisibilityBlock(){void 0===this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1}ensureVisibility(){this.nodeVisible=!0}ensureInvisibility(){this.nodeVisible=!1}isVisible(){return this.nodeVisible}visibilityInfo(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}}copyVisibilityInfo(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)}}const u=function(e,t,i){const n=this;Array.isArray(e)?this.rgb=e:e.length>=6?(this.rgb=[],e.match(/.{2}/g).map((function(e,t){t<3?n.rgb.push(parseInt(e,16)):n.alpha=parseInt(e,16)/255}))):(this.rgb=[],e.split("").map((function(e,t){t<3?n.rgb.push(parseInt(e+e,16)):n.alpha=parseInt(e+e,16)/255}))),this.alpha=this.alpha||("number"==typeof t?t:1),void 0!==i&&(this.value=i)};function h(e,t){return Math.min(Math.max(e,0),t)}function f(e){return"#"+e.map((function(e){return((e=h(Math.round(e),255))<16?"0":"")+e.toString(16)})).join("")}u.prototype=Object.assign(new c,{type:"Color",luma(){let e=this.rgb[0]/255,t=this.rgb[1]/255,i=this.rgb[2]/255;return e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4),t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4),i=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4),.2126*e+.7152*t+.0722*i},genCSS(e,t){t.add(this.toCSS(e))},toCSS(e,t){const i=e&&e.compress&&!t;let n,s,r,o=[];if(s=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))s<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=s<1?"hsla":"hsl"}else s<1&&(r="rgba");switch(r){case"rgba":o=this.rgb.map((function(e){return h(Math.round(e),255)})).concat(h(s,1));break;case"hsla":o.push(h(s,1));case"hsl":n=this.toHSL(),o=[this.fround(e,n.h),this.fround(e,100*n.s)+"%",this.fround(e,100*n.l)+"%"].concat(o)}if(r)return`${r}(${o.join(","+(i?"":" "))})`;if(n=this.toRGB(),i){const e=n.split("");e[1]===e[2]&&e[3]===e[4]&&e[5]===e[6]&&(n=`#${e[1]}${e[3]}${e[5]}`)}return n},operate(e,t,i){const n=new Array(3),s=this.alpha*(1-i.alpha)+i.alpha;for(let s=0;s<3;s++)n[s]=this._operate(e,t,this.rgb[s],i.rgb[s]);return new u(n,s)},toRGB(){return f(this.rgb)},toHSL(){const e=this.rgb[0]/255,t=this.rgb[1]/255,i=this.rgb[2]/255,n=this.alpha,s=Math.max(e,t,i),r=Math.min(e,t,i);let o,a;const l=(s+r)/2,c=s-r;if(s===r)o=a=0;else{switch(a=l>.5?c/(2-s-r):c/(s+r),s){case e:o=(t-i)/c+(tI(e,t));if("Object"!==x(i=e)||i.constructor!==Object||Object.getPrototypeOf(i)!==Object.prototype)return e;var i;return[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)].reduce((i,n)=>{if(S(t.props)&&!t.props.includes(n))return i;return function(e,t,i,n,s){const r={}.propertyIsEnumerable.call(n,t)?"enumerable":"nonenumerable";"enumerable"===r&&(e[t]=i),s&&"nonenumerable"===r&&Object.defineProperty(e,t,{value:i,enumerable:!1,writable:!0,configurable:!0})}(i,n,I(e[n],t),e,t.nonenumerable),i},{})}function C(e,t){let i=e+1,n=null,s=-1;for(;--i>=0&&"\n"!==t.charAt(i);)s++;return"number"==typeof e&&(n=(t.slice(0,e).match(/\n/g)||"").length),{line:n,column:s}}function k(e){let t;const i=e.length,n=new Array(i);for(t=0;t|Function):(\d+):(\d+)/,O=function(e,t,i){Error.call(this);const n=e.filename||i;if(this.message=e.message,this.stack=e.stack,this.type=e.type||"Syntax",t&&n){const i=t.contents[n],r=C(e.index,i);var s=r.line;const o=r.column,a=e.call&&C(e.call,i).line,l=i?i.split("\n"):"";if(this.filename=n,this.index=e.index,this.line="number"==typeof s?s+1:null,this.column=o,!this.line&&this.stack){const t=this.stack.match(R),i=new Function("a","throw new Error()");let n=0;try{i()}catch(e){const t=e.stack.match(R);n=1-parseInt(t[2])}t&&(t[2]&&(this.line=parseInt(t[2])+n),t[3]&&(this.column=parseInt(t[3])))}this.callLine=a+1,this.callExtract=l[a],this.extract=[l[this.line-2],l[this.line-1],l[this.line]]}};if(void 0===Object.create){const e=function(){};e.prototype=Error.prototype,O.prototype=new e}else O.prototype=Object.create(Error.prototype);O.prototype.constructor=O,O.prototype.toString=function(e){e=e||{};const t=(this.type??"").toLowerCase().includes("warning"),i=t?this.type:this.type+"Error",n=t?"yellow":"red";let s="";const r=this.extract||[];let o=[],a=function(e){return e};if(e.stylize){const t=typeof e.stylize;if("function"!==t)throw Error(`options.stylize should be a function, got a ${t}!`);a=e.stylize}if(null!==this.line){if(t||"string"!=typeof r[0]||o.push(a(`${this.line-1} ${r[0]}`,"grey")),"string"==typeof r[1]){let e=this.line+" ";r[1]&&(e+=r[1].slice(0,this.column)+a(a(a(r[1].slice(this.column,this.column+1),"bold")+r[1].slice(this.column+1),"red"),"inverse")),o.push(e)}t||"string"!=typeof r[2]||o.push(a(`${this.line+1} ${r[2]}`,"grey")),o=o.join("\n")+a("","reset")+"\n"}return s+=a(`${i}: ${this.message}`,n),this.filename&&(s+=a(" in ",n)+this.filename),this.line&&(s+=a(` on line ${this.line}, column ${this.column+1}:`,"grey")),s+="\n"+o,this.callLine&&(s+=a("from ",n)+(this.filename||"")+"/n",s+=`${a(this.callLine,"grey")} ${this.callExtract}/n`),s};const F={visitDeeper:!0};let V=!1;function L(e){return e}class D{constructor(e){this._implementation=e,this._visitInCache={},this._visitOutCache={},V||(!function e(t,i){let n,s;for(n in t)switch(s=t[n],typeof s){case"function":s.prototype&&s.prototype.type&&(s.prototype.typeIndex=i++);break;case"object":i=e(s,i)}return i}(ze,1),V=!0)}visit(e){if(!e)return e;const t=e.typeIndex;if(!t)return e.value&&e.value.typeIndex&&this.visit(e.value),e;const i=this._implementation;let n=this._visitInCache[t],s=this._visitOutCache[t];const r=F;let o;if(r.visitDeeper=!0,n||(o="visit"+e.type,n=i[o]||L,s=i[o+"Out"]||L,this._visitInCache[t]=n,this._visitOutCache[t]=s),n!==L){const t=n.call(i,e,r);e&&i.isReplacing&&(e=t)}if(r.visitDeeper&&e)if(e.length)for(let t=0,i=e.length;tv.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},j.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===b?T:q)(e)},j.Eval.prototype.rewritePath=function(e,t){let i;return t=t||"",i=this.normalizePath(t+e),T(e)&&q(t)&&!1===T(i)&&(i="./"+i),i},j.Eval.prototype.normalizePath=function(e){const t=e.split("/").reverse();let i;for(e=[];0!==t.length;)switch(i=t.pop(),i){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(i):e.pop();break;default:e.push(i)}return e.join("/")};class z{constructor(e){this.imports=[],this.variableImports=[],this._onSequencerEmpty=e,this._currentDepth=0}addImport(e){const t=this,i={callback:e,args:null,isReady:!1};return this.imports.push(i),function(){i.args=Array.prototype.slice.call(arguments,0),i.isReady=!0,t.tryRun()}}addVariableImport(e){this.variableImports.push(e)}tryRun(){this._currentDepth++;try{for(;;){for(;this.imports.length>0;){const e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;const e=this.variableImports[0];this.variableImports=this.variableImports.slice(1),e()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()}}const G=function(e,t){this._visitor=new D(this),this._importer=e,this._finish=t,this.context=new j.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new z(this._onSequencerEmpty.bind(this))};G.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){const i=e.options.inline;if(!e.css||i){const t=new j.Eval(this.context,k(this.context.frames)),i=t.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,t,i)):this.processImportNode(e,t,i)}t.visitDeeper=!1},processImportNode:function(e,t,i){let n;const s=e.options.inline;try{n=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!n||n.css&&!s)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{n.options.multiple&&(t.importMultiple=!0);const s=void 0===n.css;for(let t=0;t0)for(i=0;i-1e-6&&(n=i.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===i&&this.unit.isLength())return void t.add(n);i>0&&i<1&&(n=n.slice(1))}t.add(n),this.unit.genCSS(e,t)},operate(e,t,i){let n=this._operate(e,t,this.value,i.value),s=this.unit.clone();if("+"===t||"-"===t)if(0===s.numerator.length&&0===s.denominator.length)s=i.unit.clone(),this.unit.backupUnit&&(s.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===s.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==s.toString())throw new Error(`Incompatible units. Change the units or use the unit function. Bad units: '${s.toString()}' and '${i.unit.toString()}'.`);n=this._operate(e,t,this.value,i.value)}else"*"===t?(s.numerator=s.numerator.concat(i.unit.numerator).sort(),s.denominator=s.denominator.concat(i.unit.denominator).sort(),s.cancel()):"/"===t&&(s.numerator=s.numerator.concat(i.unit.denominator).sort(),s.denominator=s.denominator.concat(i.unit.numerator).sort(),s.cancel());return new X(n,s)},compare(e){let t,i;if(e instanceof X){if(this.unit.isEmpty()||e.unit.isEmpty())t=this,i=e;else if(t=this.unify(),i=e.unify(),0!==t.unit.compare(i.unit))return;return c.numericCompare(t.value,i.value)}},unify(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},convertTo(e){let t=this.value;const i=this.unit.clone();let n,s,r,o,l,c={};if("string"==typeof e){for(n in a)a[n].hasOwnProperty(e)&&(c={},c[n]=e);e=c}for(s in l=function(e,i){return r.hasOwnProperty(e)?(i?t/=r[e]/r[o]:t*=r[e]/r[o],o):e},e)e.hasOwnProperty(s)&&(o=e[s],r=a[s],i.map(l));return i.cancel(),new X(t,i)}});const Y=function(e,t,i,n,s,r){this.value=e,this._index=t,this._fileInfo=i,this.mapLines=n,this.rulesetLike=void 0!==s&&s,this.allowRoot=!0,this.copyVisibilityInfo(r)};Y.prototype=Object.assign(new c,{type:"Anonymous",eval(){return new Y(this.value,this._index,this._fileInfo,this.mapLines,this.rulesetLike,this.visibilityInfo())},compare(e){return e.toCSS&&this.toCSS()===e.toCSS()?0:void 0},isRulesetLike(){return this.rulesetLike},genCSS(e,t){this.nodeVisible=Boolean(this.value),this.nodeVisible&&t.add(this.value,this._fileInfo,this._index,this.mapLines)}});const ee=function(e,t){if(this.value=e,this.noSpacing=t,!e)throw new Error("Expression requires an array parameter")};ee.prototype=Object.assign(new c,{type:"Expression",accept(e){this.value=e.visitArray(this.value)},eval(e){const t=this.noSpacing;let i;const n=e.isMathOn(),s=this.parens;let r=!1;return s&&e.inParenthesis(),this.value.length>1?i=new ee(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(r=!0),i=this.value[0].eval(e)):i=this,s&&e.outOfParenthesis(),!this.parens||!this.parensInOp||n||r||i instanceof X||(i=new p(i)),i.noSpacing=i.noSpacing||t,i},genCSS(e,t){for(let i=0;i{if(e.length>0){const t=e[0];let i=[];const n=[new ee(i)];e.forEach(e=>{"+"===e.merge&&i.length>0&&n.push(new ee(i=[])),i.push(e.value),t.important=t.important||e.important}),t.value=new te(n)}})}te.prototype=Object.assign(new c,{type:"Value",accept(e){this.value&&(this.value=e.visitArray(this.value))},eval(e){return 1===this.value.length?this.value[0].eval(e):new te(this.value.map((function(t){return t.eval(e)})))},genCSS(e,t){let i;for(i=0;ie.isVisible()))}isEmpty(e){return!e||!e.rules||0===e.rules.length}hasVisibleSelector(e){return!(!e||!e.paths)&&e.paths.length>0}resolveVisibility(e){if(!e.blocksVisibility()){if(this.isEmpty(e))return;return e}const t=e.rules[0];if(this.keepOnlyVisibleChilds(t),!this.isEmpty(t))return e.ensureVisibility(),e.removeVisibilityBlock(),e}isVisibleRuleset(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))}}const se=function(e){this._visitor=new D(this),this._context=e,this.utils=new ne(e)};se.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){const i=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,i)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){const i=function(e){const t=e.rules;return function(e){const t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,i)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){const t=new ze.Comment(`/* ${e.toCSS(this._context).replace(/\n/g,"")} */\n`);return t.debugInfo=e.debugInfo,this._visitor.visit(t)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(let i=0;i0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),n.splice(0,0,e)),1===n.length?n[0]:n},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter(e=>{let t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new ze.Combinator("")),t=0;t=0;i--){let n=e[i];if(n instanceof ze.Declaration)if(Object.prototype.hasOwnProperty.call(t,n.name)){let s=t[n.name];if(!Array.isArray(s)){const e=s.toCSS(this._context);s=t[n.name]=[e]}const r=n.toCSS(this._context);-1!==s.indexOf(r)?e.splice(i,1):s.push(r)}else t[n.name]=n}},_mergeRules:ie};var re={Visitor:D,ImportVisitor:G,MarkVisibleSelectorsVisitor:class{constructor(e){this.visible=e}run(e){this.visit(e)}visitArray(e){if(!e)return e;const t=e.length;let i;for(i=0;i=0||(c=[h.selfSelectors[0]],r=l.findMatch(u,c),r.length&&(u.hasFoundMatches=!0,u.selfSelectors.forEach((function(e){const t=h.visibilityInfo();a=l.extendSelector(r,c,e,u.isVisible()),f=new ze.Extend(h.selector,h.option,0,h.fileInfo(),t),f.selfSelectors=a,a[a.length-1].extendList=[f],o.push(f),f.ruleset=h.ruleset,f.parent_ids=f.parent_ids.concat(h.parent_ids,u.parent_ids),h.firstExtendOnThisSelectorPath&&(f.firstExtendOnThisSelectorPath=!0,h.ruleset.paths.push(a))}))));if(o.length){if(this.extendChainCount++,i>100){let e="{unable to calculate}",t="{unable to calculate}";try{e=o[0].selfSelectors[0].toCSS(),t=o[0].selector.toCSS()}catch(e){}throw{message:`extend circular reference detected. One of the circular extends is currently:${e}:extend(${t})`}}return o.concat(l.doExtendChaining(o,t,i+1))}return o}visitDeclaration(e,t){t.visitDeeper=!1}visitMixinDefinition(e,t){t.visitDeeper=!1}visitSelector(e,t){t.visitDeeper=!1}visitRuleset(e,t){if(e.root)return;let i;const n=this.allExtendsStack[this.allExtendsStack.length-1],s=[],r=e.paths,o=r.length;for(let t=0;t0&&l[u.matched].combinator.value!==o?u=null:u.matched++,u&&(u.finished=u.matched===l.length,u.finished&&!e.allowAfter&&(s+1c&&u>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[c].elements.slice(u)),u=0,c++),l=r.elements.slice(u,a.index).concat([o]).concat(i.elements.slice(1)),c===a.pathIndex&&s>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(c,a.pathIndex)),h.push(new ze.Selector(l))),c=a.endPathIndex,u=a.endPathElementIndex,u>=t[c].elements.length&&(u=0,c++);return c0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[c].elements.slice(u)),c++),h=h.concat(t.slice(c,t.length)),h=h.map((function(e){const t=e.createDerived(e.elements);return n?t.ensureVisibility():t.ensureInvisibility(),t})),h}visitMedia(e,t){let i=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);i=i.concat(this.doExtendChaining(i,e.allExtends)),this.allExtendsStack.push(i)}visitMediaOut(e){const t=this.allExtendsStack.length-1;this.allExtendsStack.length=t}visitAtRule(e,t){let i=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);i=i.concat(this.doExtendChaining(i,e.allExtends)),this.allExtendsStack.push(i)}visitAtRuleOut(e){const t=this.allExtendsStack.length-1;this.allExtendsStack.length=t}},JoinSelectorVisitor:class{constructor(){this.contexts=[[]],this._visitor=new D(this)}run(e){return this._visitor.visit(e)}visitDeclaration(e,t){t.visitDeeper=!1}visitMixinDefinition(e,t){t.visitDeeper=!1}visitRuleset(e,t){const i=this.contexts[this.contexts.length-1],n=[];let s;this.contexts.push(n),e.root||(s=e.selectors,s&&(s=s.filter((function(e){return e.getIsOutput()})),e.selectors=s.length?s:s=null,s&&e.joinSelectors(n,i,s)),s||(e.rules=null),e.paths=n)}visitRulesetOut(e){this.contexts.length=this.contexts.length-1}visitMedia(e,t){const i=this.contexts[this.contexts.length-1];e.rules[0].root=0===i.length||i[0].multiMedia}visitAtRule(e,t){const i=this.contexts[this.contexts.length-1];e.declarations&&e.declarations.length?e.declarations[0].root=0===i.length||i[0].multiMedia:e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===i.length||null)}},ToCSSVisitor:se};var oe=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){Object.keys(e).forEach(t=>{this.add(t,e[t])})},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null);const ae={queryInParens:!0},le={queryInParens:!0};class ce{constructor(){this._counts={}}shouldWarn(e){if(!e)return!0;const t=(this._counts[e]||0)+1;return this._counts[e]=t,t<=5}summarize(e){for(const t of Object.keys(this._counts)){const i=this._counts[t]-5;i>0&&e.warn(`${i} repetitive "${t}" deprecation warning(s) omitted.`)}}}const ue=function e(t,i,n,r){let o;r=r||0;const a=(()=>{let e,t;const i=[];let n,s,r,o,a;const l={};function c(i){const n=l.i,s=t,u=l.i-a,h=l.i+o.length-u,f=l.i+=i,p=e;let d,m,g;for(;l.i=0){g={index:l.i,text:p.slice(l.i,e+2),isLineComment:!1},l.i+=g.text.length-1,l.commentStore.push(g);continue}}break}if(32!==d&&10!==d&&9!==d&&13!==d)break}if(o=o.slice(i+l.i-f+u),a=l.i,!o.length){if(t{a=l.i,i.push({current:o,i:l.i,j:t})},l.restore=e=>{(l.i>n||l.i===n&&e&&!s)&&(n=l.i,s=e);const r=i.pop();o=r.current,a=l.i=r.i,t=r.j},l.forget=()=>{i.pop()},l.isWhitespace=t=>{const i=l.i+(t||0),n=e.charCodeAt(i);return 32===n||13===n||9===n||10===n},l.$re=e=>{l.i>a&&(o=o.slice(l.i-a),a=l.i);const t=e.exec(o);return t?(c(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=t=>e.charAt(l.i)!==t?null:(c(1),t),l.$peekChar=t=>e.charAt(l.i)!==t?null:t,l.$str=t=>{const i=t.length;for(let n=0;n{const i=t||l.i,n=e.charAt(i);if("'"!==n&&'"'!==n)return;const s=e.length,r=i;for(let i=1;i+r{let i="",n=null,s=!1,r=0;const o=[],a=[],u=e.length,h=l.i;let f,p=l.i,d=l.i,m=!0;f="string"==typeof t?e=>e===t:e=>t.test(e);do{let t=e.charAt(d);if(0===r&&f(t))n=e.slice(p,d),n?a.push(n):a.push(" "),n=a,c(d-h),m=!1;else{if(s){"*"===t&&"/"===e.charAt(d+1)&&(d++,r--,s=!1),d++;continue}switch(t){case"\\":d++,t=e.charAt(d),a.push(e.slice(p,d+1)),p=d+1;break;case"/":"*"===e.charAt(d+1)&&(d++,s=!0,r++);break;case"'":case'"':i=l.$quoted(d),i?(a.push(e.slice(p,d),i),d+=i[1].length-1,p=d+1):(c(d-h),n=t,m=!1);break;case"{":o.push("}"),r++;break;case"(":o.push(")"),r++;break;case"[":o.push("]"),r++;break;case"}":case")":case"]":{const e=o.pop();t===e?r--:(c(d-h),n=e,m=!1)}}d++,d>u&&(m=!1)}}while(m);return n||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=t=>{if("string"==typeof t){for(let i=0;ie.charAt(l.i)===t,l.currentChar=()=>e.charAt(l.i),l.prevChar=()=>e.charAt(l.i-1),l.getInput=()=>e,l.peekNotNumeric=()=>{const t=e.charCodeAt(l.i);return t>57||t<43||47===t||44===t},l.start=i=>{e=i,l.i=t=a=n=0,r=[i],o=r[0],c(0)},l.end=()=>{let t;const i=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l})();function l(e,t){throw new O({index:a.i,filename:n.filename,type:t||"Syntax",message:e},i)}const c=new ce;function u(e,r,o,l){t.quiet||l&&t.quietDeprecations||l&&!c.shouldWarn(l)||s.warn(new O({index:r??a.i,filename:n.filename,type:o?o.toUpperCase()+" WARNING":"WARNING",message:e},i).toString())}function h(e,t){const i=e instanceof Function?e.call(o):a.$re(e);if(i)return i;l(t||("string"==typeof e?`expected '${e}' got '${a.currentChar()}'`:"unexpected token"))}function f(e,t){if(a.$char(e))return e;l(t||`expected '${e}' got '${a.currentChar()}'`)}function p(e){const t=n.filename;return{lineNumber:C(e,a.getInput()).line+1,fileName:t}}return{parserInput:a,imports:i,fileInfo:n,parseNode:function(e,t,s){let l;const c=[],u=a;try{u.start(e);for(let e,i=0;e=t[i];i++)l=o[e](),c.push(l||null);u.end().isFinished?s(null,c):s(!0,null)}catch(e){throw new O({index:e.index+r,message:e.message},i,n.filename)}},parse:function(s,r,c){let u,h,f,p,d=null,m="";if(c&&c.disablePluginRule&&(o.plugin=function(){a.$re(/^@plugin?\s+/)&&l("@plugin statements are not allowed when disablePluginRule is set to true")}),h=c&&c.globalVars?e.serializeVars(c.globalVars)+"\n":"",f=c&&c.modifyVars?"\n"+e.serializeVars(c.modifyVars):"",t.pluginManager){const e=t.pluginManager.getPreProcessors();for(let r=0;r(e=d||e||i.error)?(e instanceof O||(e=new O(e,i,n.filename)),r(e)):r(null,u);if(!1===t.processImports)return v();new re.ImportVisitor(i,v).run(u)},parsers:o={primary:function(){const e=this.mixin;let t,i=[];for(;;){for(;t=this.comment(),t;)i.push(t);if(a.finished)break;if(a.peek("}"))break;if(t=this.extendRule(),t)i=i.concat(t);else if(t=e.definition()||this.declaration()||e.call(!1,!1)||this.ruleset()||this.variableCall()||this.entities.call()||this.atrule(),t)i.push(t);else{let e=!1;for(;a.$char(";");)e=!0;if(!e)break}}return i},comment:function(){if(a.commentStore.length){const e=a.commentStore.shift();return new ze.Comment(e.text,e.isLineComment,e.index+r,n)}},entities:{mixinLookup:function(){return o.mixin.call(!0,!0)},quoted:function(e){let t;const i=a.i;let s=!1;if(a.save(),a.$char("~"))s=!0;else if(e)return void a.restore();if(t=a.$quoted(),t)return a.forget(),new ze.Quoted(t.charAt(0),t.slice(1,-1),s,i+r,n);a.restore()},keyword:function(){const e=a.$char("%")||a.$re(/^\[?(?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\]?/);if(e)return ze.Color.fromKeyword(e)||new ze.Keyword(e)},call:function(){let e,t,i;const s=a.i;if(!a.peek(/^url\(/i))if(a.save(),e=a.$re(/^([\w-]+|%|~|progid:[\w.]+)\(/),e){if(e=e[1],i=this.customFuncCall(e),i&&(t=i.parse(),t&&i.stop))return a.forget(),t;if(t=this.arguments(t),a.$char(")"))return a.forget(),new ze.Call(e,t,s+r,n);a.restore("Could not parse call arguments or missing ')'")}else a.forget()},declarationCall:function(){let e,t;const i=a.i;if(a.save(),e=a.$re(/^[\w]+\(/),!e)return void a.forget();if(e=e.substring(0,e.length-1),/^(and|or|not|only|layer)$/i.test(e))return void a.restore();let s,o=this.ruleProperty();if(o&&(s=this.value()),o&&s&&(t=[new ze.Declaration(o,s,null,null,a.i+r,n,!0)]),a.$char(")"))return a.forget(),new ze.Call(e,t,i+r,n);a.restore("Could not parse call arguments or missing ')'")},customFuncCall:function(e){return{alpha:t(o.ieAlpha,!0),boolean:t(i),if:t(i)}[e.toLowerCase()];function t(e,t){return{parse:e,stop:t}}function i(){return[h(o.condition,"expected condition")]}},arguments:function(e){let t=e||[];const i=[];let n,s;for(a.save();;){if(e)e=!1;else{if(s=o.detachedRuleset()||this.assignment()||o.expression(),!s)break;s.value&&1==s.value.length&&(s=s.value[0]),t.push(s)}a.$char(",")||(a.$char(";")||n)&&(n=!0,s=t.length<1?t[0]:new ze.Value(t),i.push(s),t=[])}return a.forget(),n?i:t},literal:function(){return this.dimension()||this.color()||this.quoted()||this.unicodeDescriptor()},assignment:function(){let e,t;if(a.save(),e=a.$re(/^\w+(?=\s?=)/i),e)if(a.$char("=")){if(t=o.entity(),t)return a.forget(),new ze.Assignment(e,t);a.restore()}else a.restore();else a.restore()},url:function(){let e;const t=a.i;if(a.autoCommentAbsorb=!1,a.$str("url("))return e=this.quoted()||this.variable()||this.property()||a.$re(/^(?:(?:\\[()'"])|[^()'"])+/)||"",a.autoCommentAbsorb=!0,f(")"),new ze.URL(void 0!==e.value||e instanceof ze.Variable||e instanceof ze.Property?e:new ze.Anonymous(e,t),t+r,n);a.autoCommentAbsorb=!0},variable:function(){let e,t;const i=a.i;if(a.save(),"@"===a.currentChar()&&(t=a.$re(/^@@?[\w-]+/))){if(e=a.currentChar(),"("===e&&!a.prevChar().match(/^\s/)||"["===e&&!a.prevChar().match(/^\s/)){const e=o.variableCall(t);if(e)return a.forget(),e}return a.forget(),new ze.Variable(t,i+r,n)}a.restore()},variableCurly:function(){let e;const t=a.i;if("@"===a.currentChar()&&(e=a.$re(/^@\{([\w-]+)\}/)))return new ze.Variable("@"+e[1],t+r,n)},property:function(){let e;const t=a.i;if("$"===a.currentChar()&&(e=a.$re(/^\$[\w-]+/)))return new ze.Property(e,t+r,n)},color:function(){let e;if(a.save(),"#"===a.currentChar()&&(e=a.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\w.#[])?/))&&!e[2])return a.forget(),new ze.Color(e[1],void 0,e[0]);a.restore()},colorKeyword:function(){a.save();const e=a.autoCommentAbsorb;a.autoCommentAbsorb=!1;const t=a.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);if(a.autoCommentAbsorb=e,!t)return void a.forget();a.restore();const i=ze.Color.fromKeyword(t);return i?(a.$str(t),i):void 0},dimension:function(){if(a.peekNotNumeric())return;const e=a.$re(/^([+-]?\d*\.?\d+)(%|[a-z_]+)?/i);return e?new ze.Dimension(e[1],e[2]):void 0},unicodeDescriptor:function(){let e;if(e=a.$re(/^U\+[0-9a-fA-F?]+(-[0-9a-fA-F?]+)?/),e)return new ze.UnicodeDescriptor(e[0])},javascript:function(){let e;const t=a.i;a.save();const i=a.$char("~");if(a.$char("`")){if(e=a.$re(/^[^`]*`/),e)return u("Inline JavaScript evaluation (backtick expressions) is deprecated and will be removed in Less 5.x. Use Less functions or custom plugins instead.",t,"DEPRECATED","js-eval"),a.forget(),new ze.JavaScript(e.slice(0,-1),Boolean(i),t+r,n);a.restore("invalid javascript definition")}else a.restore()}},variable:function(){let e;if("@"===a.currentChar()&&(e=a.$re(/^(@[\w-]+)\s*:/)))return e[1]},variableCall:function(e){let t;const i=a.i,s=!!e;let r=e;if(a.save(),r||"@"===a.currentChar()&&(r=a.$re(/^(@[\w-]+)(\(\s*\))?/))){if(t=this.mixin.ruleLookups(),!t&&(s&&"()"!==a.$str("()")||"()"!==r[2]))return void a.restore("Missing '[...]' lookup in variable call");s||(r=r[1]);const e=new ze.VariableCall(r,i,n);return!s&&o.end()?(a.forget(),e):(a.forget(),new ze.NamespaceValue(e,t,i,n))}a.restore()},extend:function(e){let t,i;const s=a.i;let o,c,f;if(a.$str(e?"&:extend(":":extend(")){do{o=null,t=null;let e=!0;for(;!(o=a.$re(/^(!?all)(?=\s*(\)|,))/))&&(i=this.element(),i);)!e&&i.combinator.value&&u("Targeting complex selectors can have unexpected behavior, and this behavior may change in the future.",s),e=!1,t?t.push(i):t=[i];o=o&&o[1],t||l("Missing target selector for :extend()."),f=new ze.Extend(new ze.Selector(t),o,s+r,n),c?c.push(f):c=[f]}while(a.$char(","));return h(/^\)/),e&&h(/^;/),c}},extendRule:function(){return this.extend(!0)},mixin:{call:function(e,t){const i=a.currentChar();let s,l=!1;const c=a.i;let h,p,d,m,g=!1;if("."===i||"#"===i){if(a.save(),h=this.elements(),h){if(m=a.i,g=a.isWhitespace(-1),a.$char("(")&&(p=this.args(!0).args,f(")"),d=!0,g&&u("Whitespace between a mixin name and parentheses for a mixin call is deprecated",m,"DEPRECATED","mixin-call-whitespace")),!1!==t&&(s=this.ruleLookups()),!0===t&&!s)return void a.restore();if(e&&!s&&!d)return void a.restore();if(!e&&o.important()&&(l=!0),e||o.end()){a.forget();const e=new ze.mixin.Call(h,p,c+r,n,!s&&l);return s?new ze.NamespaceValue(e,s):(d||u("Calling a mixin without parentheses is deprecated",m,"DEPRECATED","mixin-call-no-parens"),e)}}a.restore()}},elements:function(){let e,t,i,s,o;const l=/^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;for(;o=a.i,t=a.$re(l),t;)s=new ze.Element(i,t,!1,o+r,n),e?e.push(s):e=[s],i=a.$char(">");return e},args:function(e){const t=o.entities,i={args:null,variadic:!1};let n=[];const s=[],r=[];let c,u,h,f,p,d,m,g=!0;for(a.save();;){if(e)d=o.detachedRuleset()||o.expression();else{if(a.commentStore.length=0,a.$str("...")){i.variadic=!0,a.$char(";")&&!c&&(c=!0),(c?s:r).push({variadic:!0});break}d=t.variable()||t.property()||t.literal()||t.keyword()||this.call(!0)}if(!d||!g)break;f=null,d.throwAwayComments&&d.throwAwayComments(),p=d;let v=null;if(e?d.value&&1==d.value.length&&(v=d.value[0]):v=d,v&&(v instanceof ze.Variable||v instanceof ze.Property))if(a.$char(":")){if(n.length>0&&(c&&l("Cannot mix ; and , as delimiter types"),u=!0),p=o.detachedRuleset()||o.expression(),!p){if(!e)return a.restore(),i.args=[],i;l("could not understand value for named argument")}f=h=v.name}else if(a.$str("...")){if(!e){i.variadic=!0,a.$char(";")&&!c&&(c=!0),(c?s:r).push({name:d.name,variadic:!0});break}m=!0}else e||(h=f=v.name,p=null);p&&n.push(p),r.push({name:f,value:p,expand:m}),a.$char(",")?g=!0:(g=";"===a.$char(";"),(g||c)&&(u&&l("Cannot mix ; and , as delimiter types"),c=!0,n.length>1&&(p=new ze.Value(n)),s.push({name:h,value:p,expand:m}),h=null,n=[],u=!1))}return a.forget(),i.args=c?s:r,i},definition:function(){let e,t,i,n,s=[],r=!1;if(!("."!==a.currentChar()&&"#"!==a.currentChar()||a.peek(/^[^{]*\}/)))if(a.save(),t=a.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/),t){e=t[1];const l=this.args(!1);if(s=l.args,r=l.variadic,!a.$char(")"))return void a.restore("Missing closing ')'");if(a.commentStore.length=0,a.$str("when")&&(n=h(o.conditions,"expected condition")),i=o.block(),i)return a.forget(),new ze.mixin.Definition(e,s,i,n,r);a.restore()}else a.restore()},ruleLookups:function(){let e;const t=[];if("["===a.currentChar()){for(;;){if(a.save(),e=this.lookupValue(),!e&&""!==e){a.restore();break}t.push(e),a.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(a.save(),!a.$char("["))return void a.restore();const e=a.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(a.$char("]"))return e||""===e?(a.forget(),e):void a.restore();a.restore()}},entity:function(){const e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return a.$char(";")||a.peek("}")},ieAlpha:function(){let e;if(a.$re(/^opacity=/i))return e=a.$re(/^\d+/),e||(e=h(o.entities.variable,"Could not parse alpha"),e=`@{${e.name.slice(1)}}`),f(")"),new ze.Quoted("",`alpha(opacity=${e})`)},element:function(){let e,t,i;const s=a.i;if(t=this.combinator(),e=a.$re(/^(?:\d+\.\d+|\d+)%/)||a.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||a.$char("*")||a.$char("&")||this.attribute()||a.$re(/^\([^&()@]+\)/)||a.$re(/^[.#:](?=@)/)||this.entities.variableCurly(),!e)if(a.save(),a.$char("("))if(i=this.selector(!1)){let t=[];for(;a.$char(",");)t.push(i),t.push(new Y(",")),i=this.selector(!1);t.push(i),a.$char(")")?(e=t.length>1?new ze.Paren(new he(t)):new ze.Paren(i),a.forget()):a.restore("Missing closing ')'")}else a.restore("Missing closing ')'");else a.forget();if(e)return new ze.Element(t,e,e instanceof ze.Variable,s+r,n)},combinator:function(){let e=a.currentChar();if("/"===e){a.save();const e=a.$re(/^\/[a-z]+\//i);if(e)return a.forget(),new ze.Combinator(e);a.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(a.i++,"^"===e&&"^"===a.currentChar()&&(e="^^",a.i++);a.isWhitespace();)a.i++;return new ze.Combinator(e)}return a.isWhitespace(-1)?new ze.Combinator(" "):new ze.Combinator(null)},selector:function(e){const t=a.i;let i,s,o,c,u,f,p;for(e=!1!==e;(e&&(s=this.extend())||e&&(f=a.$str("when"))||(c=this.element()))&&(f?p=h(this.conditions,"expected condition"):p?l("CSS guard can only be used at the end of selector"):s?u=u?u.concat(s):s:(u&&l("Extend can only be used at the end of selector"),o=a.currentChar(),Array.isArray(c)&&c.forEach(e=>i.push(e)),i?i.push(c):i=[c],c=null),"{"!==o&&"}"!==o&&";"!==o&&","!==o&&")"!==o););if(i)return new ze.Selector(i,u,p,t+r,n);u&&l("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){let e,t;for(;e=this.selector(),e&&(t?t.push(e):t=[e],a.commentStore.length=0,e.condition&&t.length>1&&l("Guards are only currently allowed on a single selector."),a.$char(","));)e.condition&&l("Guards are only currently allowed on a single selector."),a.commentStore.length=0;return t},attribute:function(){if(!a.$char("["))return;const e=this.entities;let t,i,n,s;return(t=e.variableCurly())||(t=h(/^(?:[_A-Za-z0-9-*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),n=a.$re(/^[|~*$^]?=/),n&&(i=e.quoted()||a.$re(/^[0-9]+%/)||a.$re(/^[\w-]+/)||e.variableCurly(),i&&(s=a.$re(/^[iIsS]/))),f("]"),new ze.Attribute(t,n,i,s)},block:function(){let e;if(a.$char("{")&&(e=this.primary())&&a.$char("}"))return e},blockRuleset:function(){let e=this.block();if(e)return new ze.Ruleset(null,e)},detachedRuleset:function(){let e,t,i;if(a.save(),a.$re(/^[.#]\(/)&&(e=this.mixin.args(!1),t=e.args,i=e.variadic,!a.$char(")")))return void a.restore();const n=this.blockRuleset();if(n)return a.forget(),t?new ze.mixin.Definition(null,t,n,null,i):new ze.DetachedRuleset(n);a.restore()},ruleset:function(){let e,i,n;if(a.save(),t.dumpLineNumbers&&(n=p(a.i)),e=this.selectors(),e&&(i=this.block())){a.forget();const s=new ze.Ruleset(e,i,t.strictImports);return t.dumpLineNumbers&&(s.debugInfo=n),s}a.restore()},declaration:function(){let e,t;const i=a.i;let s;const o=a.currentChar();let l,c,u;if("."!==o&&"#"!==o&&"&"!==o&&":"!==o)if(a.save(),e=this.variable()||this.ruleProperty(),e){if(u="string"==typeof e,u&&(t=this.detachedRuleset(),t&&(s=!0)),a.commentStore.length=0,!t){if(c=!u&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?a.$char(";")?new Y(""):this.permissiveValue(/[;}]/,!0):this.anonymousValue(),t)return a.forget(),new ze.Declaration(e,t,!1,c,i+r,n);t||(t=this.value()),t?l=this.important():u&&(t=this.permissiveValue())}if(t&&(this.end()||s))return a.forget(),new ze.Declaration(e,t,l,c,i+r,n);a.restore()}else a.restore()},anonymousValue:function(){const e=a.i,t=a.$re(/^([^.#@$+/'"*`(;{}-]*);/);if(t)return new ze.Anonymous(t[1],e+r)},permissiveValue:function(e){let t,i,s,r;const o=e||";",c=a.i,h=[];function f(){const e=a.currentChar();return"string"==typeof o?e===o:o.test(e)}if(!f()){r=[];do{i=this.comment(),i?r.push(i):(i=this.entity(),i&&r.push(i),a.peek(",")&&(r.push(new ze.Anonymous(",",a.i)),a.$char(",")))}while(i);if(s=f(),r.length>0){if(r=new ze.Expression(r),s)return r;h.push(r)," "===a.prevChar()&&h.push(new ze.Anonymous(" ",c))}if(a.save(),r=a.$parseUntil(o),r){if("string"==typeof r&&l(`Expected '${r}'`,"Parse"),1===r.length&&" "===r[0])return a.forget(),new ze.Anonymous("",c);let e;for(t=0;t]=|<=|>=|[<>]|=)/)?(a.restore(),o=this.condition(),a.save(),c=this.atomicCondition(null,o.rvalue),c||a.restore()):(a.restore(),s=this.value()),a.$char(")")?o&&!s?(i.push(new ze.Paren(new ze.QueryInParens(o.op,o.lvalue,o.rvalue,c?c.op:null,c?c.rvalue:null,o._index))),s=o):o&&s?(i.push(new ze.Paren(new ze.Declaration(o,s,null,null,a.i+r,n,!0))),u||(i[i.length-1].noSpacing=!0),u=!1):s?(i.push(new ze.Paren(s)),u=!1):l("badly formed media feature definition"):l("Missing closing ')'","Parse"))}while(s);if(a.forget(),i.length>0)return new ze.Expression(i)},mediaFeatures:function(e){const t=this.entities,i=[];let n;do{if(n=this.mediaFeature(e),n){if(i.push(n),!a.$char(","))break;i[i.length-1].noSpacing||(i[i.length-1].noSpacing=!1)}else if(n=t.variable()||t.mixinLookup(),n){if(i.push(n),!a.$char(","))break;i[i.length-1].noSpacing||(i[i.length-1].noSpacing=!1)}}while(n);return i.length>0?i:null},prepareAndGetNestableAtRule:function(e,i,s,o){const c=this.mediaFeatures(o),u=this.block();u||l("media definitions require block statements after any features"),a.forget();const h=new e(u,c,i+r,n);return t.dumpLineNumbers&&(h.debugInfo=s),h},nestableAtRule:function(){let e;const i=a.i;if(t.dumpLineNumbers&&(e=p(i)),a.save(),a.$peekChar("@")){if(a.$str("@media"))return this.prepareAndGetNestableAtRule(ze.Media,i,e,ae);if(a.$str("@container"))return this.prepareAndGetNestableAtRule(ze.Container,i,e,le)}a.restore()},plugin:function(){let e,t,i;const s=a.i;if(a.$re(/^@plugin\s+/)){if(u("The @plugin directive is deprecated and will be removed in Less 5.x. Use --plugin CLI option or the programmatic plugin API instead.",s,"DEPRECATED","at-plugin"),t=this.pluginArgs(),i=t?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return a.$char(";")||(a.i=s,l("missing semi-colon on @plugin")),new ze.Import(e,null,i,s+r,n);a.i=s,l("malformed @plugin statement")}},pluginArgs:function(){if(a.save(),!a.$char("("))return a.restore(),null;const e=a.$re(/^\s*([^);]+)\)\s*/);return e[1]?(a.forget(),e[1].trim()):(a.restore(),null)},atruleUnknown:function(e,t,i){return e=this.permissiveValue(/^[{;]/),i="{"===a.currentChar(),e?e.value||(e=null):i||";"===a.currentChar()||l("".concat(t," rule is missing block or ending semi-colon")),[e,i]},atruleBlock:function(e,t,i,n){if(e=this.blockRuleset(),a.save(),e||i||(t=this.entity(),e=this.blockRuleset()),e||i)a.forget();else{a.restore();var s=[];for(t=this.entity();a.$char(",");)s.push(t),t=this.entity();t&&s.length>0?(s.push(t),t=s,n=!0):e=this.blockRuleset()}return[e,t,n]},atrule:function(){const e=a.i;let i,s,o,c,u,h,f,d=!0,m=!0,g=!1;if("@"===a.currentChar()){if(s=this.import()||this.plugin()||this.nestableAtRule(),s)return s;if(a.save(),i=a.$re(/^@[a-z-]+/),i){switch(c=i,"-"==i.charAt(1)&&i.indexOf("-",2)>0&&(c="@"+i.slice(i.indexOf("-",2)+1)),c){case"@charset":u=!0,d=!1;break;case"@namespace":h=!0,d=!1;break;case"@keyframes":case"@counter-style":u=!0;break;case"@document":case"@supports":f=!0,m=!1;break;case"@starting-style":case"@layer":m=!1;break;default:f=!0}if(a.commentStore.length=0,u)s=this.entity(),s||l(`expected ${i} identifier`);else if(h)s=this.expression(),s||l(`expected ${i} expression`);else if(f){const e=this.atruleUnknown(s,i,d);s=e[0],d=e[1]}if(d){let e=this.atruleBlock(o,s,m,g);if(o=e[0],s=e[1],g=e[2],!o&&!f){a.restore(),i=a.$re(/^@[a-z-]+/);const t=this.atruleUnknown(s,i,d);s=t[0],d=t[1],d&&(e=this.atruleBlock(o,s,m,g),o=e[0],s=e[1],g=e[2])}}if(o||g||!d&&s&&a.$char(";"))return a.forget(),new ze.AtRule(i,s,o,e+r,n,t.dumpLineNumbers?p(e):null,m);a.restore("at-rule options not recognised")}}},value:function(){let e;const t=[],i=a.i;do{if(e=this.expression(),e&&(t.push(e),!a.$char(",")))break}while(e);if(t.length>0)return new ze.Value(t,i+r)},important:function(){if("!"===a.currentChar())return a.$re(/^! *important/)},sub:function(){let e,t;if(a.save(),a.$char("("))return e=this.addition(),e&&a.$char(")")?(a.forget(),t=new ze.Expression([e]),t.parens=!0,t):void a.restore("Expected ')'");a.restore()},colorOperand:function(){a.save();const e=a.$re(/^[lchrgbs]\s+/);if(e)return a.forget(),new ze.Keyword(e[0]);a.restore()},multiplication:function(){let e,t,i,n,s;if(e=this.operand(),e){for(s=a.isWhitespace(-1);!a.peek(/^\/[*/]/);){if(a.save(),i=a.$char("/")||a.$char("*"),!i){let e=a.i;i=a.$str("./"),i&&u("./ operator is deprecated",e,"DEPRECATED","dot-slash-operator")}if(!i){a.forget();break}if(t=this.operand(),!t){a.restore();break}a.forget(),e.parensInOp=!0,t.parensInOp=!0,n=new ze.Operation(i,[n||e,t],s),s=a.isWhitespace(-1)}return n||e}},addition:function(){let e,t,i,n,s;if(e=this.multiplication(),e){for(s=a.isWhitespace(-1);i=a.$re(/^[-+]\s+/)||!s&&(a.$char("+")||a.$char("-")),i&&(t=this.multiplication(),t);)e.parensInOp=!0,t.parensInOp=!0,n=new ze.Operation(i,[n||e,t],s),s=a.isWhitespace(-1);return n||e}},conditions:function(){let e,t;const i=a.i;let n;if(e=this.condition(!0),e){for(;a.peek(/^,\s*(not\s*)?\(/)&&a.$char(",")&&(t=this.condition(!0),t);)n=new ze.Condition("or",n||e,t,i+r);return n||e}},condition:function(e){let t,i,n;if(t=this.conditionAnd(e),t){if(i=a.$str("or"),i){if(n=this.condition(e),!n)return;t=new ze.Condition(i,t,n)}return t}},conditionAnd:function(e){let t,i,n;const s=this;if(t=function(){const t=s.negatedCondition(e)||s.parenthesisCondition(e);return t||e?t:s.atomicCondition(e)}(),t){if(i=a.$str("and"),i){if(n=this.conditionAnd(e),!n)return;t=new ze.Condition(i,t,n)}return t}},negatedCondition:function(e){if(a.$str("not")){const t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){let t;if(a.save(),a.$str("(")){if(t=function(t){let i;if(a.save(),i=t.condition(e),i){if(a.$char(")"))return a.forget(),i;a.restore()}else a.restore()}(this),t)return a.forget(),t;if(t=this.atomicCondition(e),t){if(a.$char(")"))return a.forget(),t;a.restore(`expected ')' got '${a.currentChar()}'`)}else a.restore()}else a.restore()},atomicCondition:function(e,t){const i=this.entities,n=a.i;let s,o,c,u;const h=function(){return this.addition()||i.keyword()||i.quoted()||i.mixinLookup()}.bind(this);if(s=t||h(),s)return a.$char(">")?u=a.$char("=")?">=":">":a.$char("<")?u=a.$char("=")?"<=":"<":a.$char("=")&&(u=a.$char(">")?"=>":a.$char("<")?"=<":"="),u?(o=h(),o?c=new ze.Condition(u,s,o,n+r,!1):l("expected expression")):t||(c=new ze.Condition("=",s,new ze.Keyword("true"),n+r,!1)),c},operand:function(){const e=this.entities;let t;a.peek(/^-[@$(]/)&&(t=a.$char("-"));let i=this.sub()||e.dimension()||e.color()||e.variable()||e.property()||e.call()||e.quoted(!0)||e.colorKeyword()||this.colorOperand()||e.mixinLookup();return t&&(i.parensInOp=!0,i=new ze.Negative(i)),i},expression:function(){const e=[];let t,i;const n=a.i;do{t=this.comment(),!t||t.isLineComment?(t=this.addition()||this.entity(),t instanceof ze.Comment&&(t=null),t&&(e.push(t),a.peek(/^\/[/*]/)||(i=a.$char("/"),i&&e.push(new ze.Anonymous(i,n+r))))):e.push(t)}while(t);if(e.length>0)return new ze.Expression(e)},property:function(){const e=a.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){let e=[];const t=[];let i,s;a.save();const o=a.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(o)return e=[new ze.Keyword(o[1])],a.forget(),e;function l(i){const n=a.i,s=a.$re(i);if(s)return t.push(n),e.push(s[1])}for(l(/^(\*?)/);l(/^((?:[\w-]+)|(?:[@$]\{[\w-]+\}))/););if(e.length>1&&l(/^((?:\+_|\+)?)\s*:/)){for(a.forget(),""===e[0]&&(e.shift(),t.shift()),s=0;s{let t="";for(const i in e)if(Object.hasOwnProperty.call(e,i)){const n=e[i];t+=`${("@"===i[0]?"":"@")+i}: ${n}${";"===String(n).slice(-1)?"":";"}`}return t};const he=function(e,t,i,n,s,r){this.extendList=t,this.condition=i,this.evaldCondition=!i,this._index=n,this._fileInfo=s,this.elements=this.getElements(e),this.mixinElements_=void 0,this.copyVisibilityInfo(r),this.setParent(this.elements,this)};he.prototype=Object.assign(new c,{type:"Selector",accept(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},createDerived(e,t,i){e=this.getElements(e);const n=new he(e,t||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return n.evaldCondition=P(i)?this.evaldCondition:i,n.mediaEmpty=this.mediaEmpty,n},getElements(e){return e?("string"==typeof e&&new ue(this.parse.context,this.parse.importManager,this._fileInfo,this._index).parseNode(e,["selector"],(function(t,i){if(t)throw new O({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=i[0].elements})),e):[new g("","&",!1,this._index,this._fileInfo)]},createEmptySelectors(){const e=new g("","&",!1,this._index,this._fileInfo),t=[new he([e],null,null,this._index,this._fileInfo)];return t[0].mediaEmpty=!0,t},match(e){const t=this.elements,i=t.length;let n,s;if(n=(e=e.mixinElements()).length,0===n||i!0,accept(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},eval(e){let t,i,n,s,r,o=!1;if(this.selectors&&(i=this.selectors.length)){for(t=new Array(i),me.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),s=0;s!e||0===e.length,matchCondition(e,t){const i=this.selectors[this.selectors.length-1];return!!i.evaldCondition&&!(i.condition&&!i.condition.eval(new j.Eval(t,t.frames)))},resetCache(){this._rulesets=null,this._variables=null,this._properties=null,this._lookups={}},variables(){return this._variables||(this._variables=this.rules?this.rules.reduce((function(e,t){if(t instanceof de&&!0===t.variable&&(e[t.name]=t),"Import"===t.type&&t.root&&t.root.variables){const i=t.root.variables();for(const n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=t.root.variable(n))}return e}),{}):{}),this._variables},properties(){return this._properties||(this._properties=this.rules?this.rules.reduce((function(e,t){if(t instanceof de&&!0!==t.variable){const i=1===t.name.length&&t.name[0]instanceof fe?t.name[0].value:t.name;e["$"+i]?e["$"+i].push(t):e["$"+i]=[t]}return e}),{}):{}),this._properties},variable(e){const t=this.variables()[e];if(t)return this.parseValue(t)},property(e){const t=this.properties()[e];if(t)return this.parseValue(t)},lastDeclaration(){for(let e=this.rules.length;e>0;e--){const t=this.rules[e-1];if(t instanceof de)return this.parseValue(t)}},parseValue(e){const t=this;function i(e){return e.value instanceof Y&&!e.parsed?("string"==typeof e.value.value?new ue(this.parse.context,this.parse.importManager,e.fileInfo(),e.value.getIndex()).parseNode(e.value.value,["value","important"],(function(t,i){t&&(e.parsed=!0),i&&(e.value=i[0],e.important=i[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){const n=[];for(let s=0;ss){if(!i||i(o)){r=o.find(new he(e.elements.slice(s)),t,i);for(let e=0;e0&&t.add(u),e.firstSelector=!0,o[0].genCSS(e,t),e.firstSelector=!1,n=1;n0?(s=k(e),r=s.pop(),o=n.createDerived(k(r.elements))):o=n.createDerived([]),t.length>0){let e=i.combinator;const n=t[0].elements[0];e.emptyOrWhitespace&&!n.combinator.emptyOrWhitespace&&(e=n.combinator),o.elements.push(new g(e,n.value,i.isVariable,i._index,i._fileInfo)),o.elements=o.elements.concat(t[0].elements.slice(1))}if(0!==o.elements.length&&s.push(o),t.length>1){let e=t.slice(1);e=e.map((function(e){return e.createDerived(e.elements,[])})),s=s.concat(e)}return s}function o(e,t,i,n,s){let o;for(o=0;o0?n[n.length-1]=n[n.length-1].createDerived(n[n.length-1].elements.concat(e)):n.push(new he(e));else t.push([new he(e)])}function l(e,t){const i=t.createDerived(t.elements,t.extendList,t.evaldCondition);return i.copyVisibilityInfo(e),i}let c,u,h;if(u=[],h=function e(t,i,l){let c,u,h,f,d,m,v,y,b,w,x=!1;function S(e){let t;return e.value instanceof p?(t=e.value.value,t instanceof he?t:null):null}for(f=[],d=[[]],c=0;y=l.elements[c];c++)if("&"!==y.value){const t=S(y);if(null!==t){a(f,d);const r=[];let c;const u=[];if(t.elements.some(e=>e instanceof he)){const r=[];for(const n of t.elements)if(n instanceof he){const t=[],s=e(t,i,n);c=c||s,t.length>0&&t[0].length>0?r.push(t[0][0]):r.push(n)}else r.push(n);x=x||c;o(d,[s(n([new he(r)],y),y)],y,l,u)}else for(c=e(r,i,t),x=x||c,h=0;h0&&v[0].elements.push(new g(y.combinator,"",y.isVariable,y._index,y._fileInfo)),m.push(v);else for(h=0;h0&&(t.push(d[c]),w=d[c][b-1],d[c][b-1]=w.createDerived(w.elements,l.extendList));return x}(u,t,i),!h)if(t.length>0)for(u=[],c=0;c!0,accept(e){this.features&&(this.features=e.visit(this.features)),this.rules&&(this.rules=e.visitArray(this.rules))},evalFunction:function(){if(!this.features||!Array.isArray(this.features.value)||this.features.value.length<1)return;const e=this.features.value;let t,i;for(let n=0;n1){const i=new he([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();t=new ge(i,e.mediaBlocks),t.multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},evalNested(e){let t,i;this.evalFunction();const n=e.mediaPath.concat([this]);for(t=0;t-1&&e.mediaBlocks.splice(t,1),this}i=n[t].features instanceof te?n[t].features.value:n[t].features,n[t]=Array.isArray(i)?i:[i]}return this.features=new te(this.permute(n).map(e=>{for(e=e.map(e=>e.toCSS?e:new Y(e)),t=e.length-1;t>0;t--)e.splice(t,0,new Y("and"));return new ee(e)})),this.setParent(this.features,this),new ge([],[])},permute(e){if(0===e.length)return[];if(1===e.length)return e[0];{const t=[],i=this.permute(e.slice(1));for(let n=0;n{"Ruleset"===e.type&&e.rules&&(n=n&&this.declarationsBlock(e.rules,!0))}),e&&!o?(this.simpleBlock=!0,this.declarations=i):!n||1!==i.length||o||t?this.rules=i:(this.simpleBlock=!0,this.declarations=i[0].rules?i[0].rules:i)}else{!this.declarationsBlock(i.rules)||o||t?(this.rules=[i],this.rules[0].selectors=new he([],null,null,n,s).createEmptySelectors()):(this.simpleBlock=!0,this.declarations=i.rules)}if(!this.simpleBlock)for(l=0;lt?e.filter((function(e){return"Declaration"===e.type||"Comment"===e.type})).length===e.length:e.filter((function(e){return("Declaration"===e.type||"Comment"===e.type)&&!e.merge})).length===e.length,keywordList:e=>!!Array.isArray(e)&&e.filter((function(e){return"Keyword"===e.type||"Comment"===e.type})).length===e.length,accept(e){const t=this.value,i=this.rules,n=this.declarations;i?this.rules=e.visitArray(i):n&&(this.declarations=e.visitArray(n)),t&&(this.value=e.visit(t))},isRulesetLike(){return this.rules||!this.isCharset()},isCharset(){return"@charset"===this.name},genCSS(e,t){const i=this.value,n=this.rules||this.declarations;t.add(this.name,this.fileInfo(),this.getIndex()),i&&(t.add(" "),i.genCSS(e,t)),this.simpleBlock?this.outputRuleset(e,t,this.declarations):n?this.outputRuleset(e,t,n):t.add(";")},eval(e){let t,i,n=this.value,s=this.rules||this.declarations;if(t=e.mediaPath,i=e.mediaBlocks,e.mediaPath=[],e.mediaBlocks=[],n&&(n=n.eval(e)),s&&(s=this.evalRoot(e,s)),Array.isArray(s)&&s[0].rules&&Array.isArray(s[0].rules)&&s[0].rules.length){!this.declarationsBlock(s[0].rules,!0)||this.isRooted||n||(ie(s[0].rules),s=s[0].rules,s.forEach(e=>e.merge=!1))}return this.simpleBlock&&s&&(s[0].functionRegistry=e.frames[0].functionRegistry.inherit(),s=s.map((function(t){return t.eval(e)}))),e.mediaPath=t,e.mediaBlocks=i,new ye(this.name,n,s,this.getIndex(),this.fileInfo(),this.debugInfo,this.isRooted,this.visibilityInfo())},evalRoot(e,t){let i=0,n=0,s=!0;this.simpleBlock||(t=[t[0].eval(e)]);let r=[];if(e.frames.length>0)for(let t=0;t0&&o&&!o.root&&o.selectors&&o.selectors.length>0&&(r=r.concat(o.selectors)),r.length>0){r.every(e=>e.elements&&e.elements.length>0&&e.elements.every(e=>"&"===e.value))?(s=!1,n++):i++}}const o=i>0&&n>0&&!s;return(this.isRooted&&i>0&&0===n&&s||!o)&&(t[0].root=!0),t},variable(e){if(this.rules)return ge.prototype.variable.call(this.rules[0],e)},find(){if(this.rules)return ge.prototype.find.apply(this.rules[0],arguments)},rulesets(){if(this.rules)return ge.prototype.rulesets.apply(this.rules[0])},outputRuleset(e,t,i){const n=i.length;let s;if(e.tabLevel=1+(0|e.tabLevel),e.compress){for(t.add("{"),s=0;se.eval(this.context)));const i=e=>!("Comment"===e.type);return e=e.filter(i).map(e=>{if("Expression"===e.type){const t=e.value.filter(i);return 1===t.length?e.parens&&"/"===t[0].op?e:t[0]:new ee(t)}return e}),!1===t?this.func(this.context,...e):this.func(...e)}}const Ie=function(e,t,i,n){this.name=e,this.args=t,this.calc="calc"===e,this._index=i,this._fileInfo=n};Ie.prototype=Object.assign(new c,{type:"Call",accept(e){this.args&&(this.args=e.visitArray(this.args))},eval(e){const t=e.mathOn;e.mathOn=!this.calc,(this.calc||e.inCalc)&&e.enterCalc();const i=()=>{(this.calc||e.inCalc)&&e.exitCalc(),e.mathOn=t};let n;const s=new Se(this.name,e,this.getIndex(),this.fileInfo());if(s.isValid())try{n=s.call(this.args),i()}catch(e){if(e.hasOwnProperty("line")&&e.hasOwnProperty("column"))throw e;throw{type:e.type||"Runtime",message:`Error evaluating function \`${this.name}\`${e.message?": "+e.message:""}`,index:this.getIndex(),filename:this.fileInfo().filename,line:e.lineNumber,column:e.columnNumber}}if(null!=n)return n instanceof c||(n=new Y(n&&!0!==n?n.toString():null)),n._index=this._index,n._fileInfo=this._fileInfo,n;const r=this.args.map(t=>t.eval(e));return i(),new Ie(this.name,r,this.getIndex(),this.fileInfo())},genCSS(e,t){t.add(this.name+"(",this.fileInfo(),this.getIndex());for(let i=0;i=1){const t=e[0];if("Expression"===t.type&&Array.isArray(t.value)&&t.value.length>=2){e=t.value;"Keyword"===e[0].type&&"layer"===e[0].value&&"Paren"===e[1].type&&(this.css=!1)}}}if(this.options.inline){const e=new Y(this.root,0,{filename:this.importedFilename,reference:this.path._fileInfo&&this.path._fileInfo.reference},!0,!0);return this.features?new Me([e],this.features.value):[e]}if(this.css||this.layerCss){const t=new Pe(this.evalPath(e),n,this.options,this._index);if(this.layerCss&&(t.css=this.layerCss,t.path._fileInfo=this._fileInfo),!t.css&&this.error)throw this.error;return t}if(this.root){if(this.features){let e=this.features.value;if(Array.isArray(e)&&1===e.length){const t=e[0];if("Expression"===t.type&&Array.isArray(t.value)&&t.value.length>=2){e=t.value;if("Keyword"===e[0].type&&"layer"===e[0].value&&"Paren"===e[1].type)return this.layerCss=!0,e[0]=new ee(e.slice(0,2)),e.splice(1,1),e[0].noSpacing=!0,this}}}return t=new ge(null,k(this.root.rules)),t.evalImports(e),this.features?new Me(t.rules,this.features.value):t.rules}if(this.features){let e=this.features.value;if(Array.isArray(e)&&e.length>=1&&(e=e[0].value,Array.isArray(e)&&e.length>=2)){if("Keyword"===e[0].type&&"layer"===e[0].value&&"Paren"===e[1].type)return this.css=!0,e[0]=new ee(e.slice(0,2)),e.splice(1,1),e[0].noSpacing=!0,this}}return[]}});const Ee=function(){};Ee.prototype=Object.assign(new c,{evaluateJavaScript(e,t){let i;const n=this,s={};if(!t.javascriptEnabled)throw{message:"Inline JavaScript is not enabled. Is it set in your options?",filename:this.fileInfo().filename,index:this.getIndex()};e=e.replace(/@\{([\w-]+)\}/g,(function(e,i){return n.jsify(new Ce("@"+i,n.getIndex(),n.fileInfo()).eval(t))}));try{e=new Function(`return (${e})`)}catch(t){throw{message:`JavaScript evaluation error: ${t.message} from \`${e}\``,filename:this.fileInfo().filename,index:this.getIndex()}}const r=t.frames[0].variables();for(const e in r)r.hasOwnProperty(e)&&(s[e.slice(1)]={value:r[e].value,toJS:function(){return this.value.eval(t).toCSS()}});try{i=e.call(s)}catch(e){throw{message:`JavaScript evaluation error: '${e.name}: ${e.message.replace(/["]/g,"'")}'`,filename:this.fileInfo().filename,index:this.getIndex()}}return i},jsify:e=>Array.isArray(e.value)&&e.value.length>1?`[${e.value.map((function(e){return e.toCSS()})).join(", ")}]`:e.toCSS()});const Re=function(e,t,i,n){this.escaped=t,this.expression=e,this._index=i,this._fileInfo=n};Re.prototype=Object.assign(new Ee,{type:"JavaScript",eval(e){const t=this.evaluateJavaScript(this.expression,e),i=typeof t;return"number"!==i||isNaN(t)?"string"===i?new _e(`"${t}"`,t,this.escaped,this._index):Array.isArray(t)?new Y(t.join(", ")):new Y(t):new X(t)}});const Oe=function(e,t){this.key=e,this.value=t};Oe.prototype=Object.assign(new c,{type:"Assignment",accept(e){this.value=e.visit(this.value)},eval(e){return this.value.eval?new Oe(this.key,this.value.eval(e)):this},genCSS(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)}});const Fe=function(e,t,i,n,s){this.op=e.trim(),this.lvalue=t,this.rvalue=i,this._index=n,this.negate=s};Fe.prototype=Object.assign(new c,{type:"Condition",accept(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},eval(e){const t=function(e,t,i){switch(e){case"and":return t&&i;case"or":return t||i;default:switch(c.compare(t,i)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t}});const Ve=function(e,t,i,n,s,r){this.op=e.trim(),this.lvalue=t,this.mvalue=i,this.op2=n?n.trim():null,this.rvalue=s,this._index=r};Ve.prototype=Object.assign(new c,{type:"QueryInParens",accept(e){this.lvalue=e.visit(this.lvalue),this.mvalue=e.visit(this.mvalue),this.rvalue&&(this.rvalue=e.visit(this.rvalue))},eval(e){return new Ve(this.op,this.lvalue.eval(e),this.mvalue.eval(e),this.op2,this.rvalue?this.rvalue.eval(e):null,this._index)},genCSS(e,t){this.lvalue.genCSS(e,t),t.add(" "+this.op+" "),this.mvalue.genCSS(e,t),this.rvalue&&(t.add(" "+this.op2+" "),this.rvalue.genCSS(e,t))}});const Le=function(e,t,i,n,s){this._index=i,this._fileInfo=n;const r=new he([],null,null,this._index,this._fileInfo).createEmptySelectors();this.features=new te(t),this.rules=[new ge(r,e)],this.rules[0].allowImports=!0,this.copyVisibilityInfo(s),this.allowRoot=!0,this.setParent(r,this),this.setParent(this.features,this),this.setParent(this.rules,this)};Le.prototype=Object.assign(new ye,{type:"Container",...ve,genCSS(e,t){t.add("@container ",this._fileInfo,this._index),this.features.genCSS(e,t),this.outputRuleset(e,t,this.rules)},eval(e){if(this._evaluated)return this;e.mediaBlocks||(e.mediaBlocks=[],e.mediaPath=[]);const t=new Le(null,[],this._index,this._fileInfo,this.visibilityInfo());return t._evaluated=!0,this.debugInfo&&(this.rules[0].debugInfo=this.debugInfo,t.debugInfo=this.debugInfo),t.features=this.features.eval(e),e.mediaPath.push(t),e.mediaBlocks.push(t),this.rules[0].functionRegistry=e.frames[0].functionRegistry.inherit(),e.frames.unshift(this.rules[0]),t.rules=[this.rules[0].eval(e)],e.frames.shift(),e.mediaPath.pop(),0===e.mediaPath.length?t.evalTop(e):t.evalNested(e)}});const De=function(e){this.value=e};De.prototype=Object.assign(new c,{type:"UnicodeDescriptor"});const je=function(e){this.value=e};je.prototype=Object.assign(new c,{type:"Negative",genCSS(e,t){t.add("-"),this.value.genCSS(e,t)},eval(e){return e.isMathOn()?new xe("*",[new X(-1),this.value]).eval(e):new je(this.value.eval(e))}});const Ne=function(e,t,i,n,s){switch(this.selector=e,this.option=t,this.object_id=Ne.next_id++,this.parent_ids=[this.object_id],this._index=i,this._fileInfo=n,this.copyVisibilityInfo(s),this.allowRoot=!0,t){case"!all":case"all":this.allowBefore=!0,this.allowAfter=!0;break;default:this.allowBefore=!1,this.allowAfter=!1}this.setParent(this.selector,this)};Ne.prototype=Object.assign(new c,{type:"Extend",accept(e){this.selector=e.visit(this.selector)},eval(e){return new Ne(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},clone(e){return new Ne(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},findSelfSelectors(e){let t,i,n=[];for(t=0;t0&&i.length&&""===i[0].combinator.value&&(i[0].combinator.value=" "),n=n.concat(e[t].elements);this.selfSelectors=[new he(n)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())}}),Ne.next_id=0;const Be=function(e,t,i){this.variable=e,this._index=t,this._fileInfo=i,this.allowRoot=!0};Be.prototype=Object.assign(new c,{type:"VariableCall",eval(e){let t,i=new Ce(this.variable,this.getIndex(),this.fileInfo()).eval(e);const n=new O({message:"Could not evaluate variable call "+this.variable});if(!i.ruleset){if(i.rules)t=i;else if(Array.isArray(i))t=new ge("",i);else{if(!Array.isArray(i.value))throw n;t=new ge("",i.value)}i=new be(t)}if(i.ruleset)return i.callEval(e);throw n}});const Ue=function(e,t,i,n){this.value=e,this.lookups=t,this._index=i,this._fileInfo=n};Ue.prototype=Object.assign(new c,{type:"NamespaceValue",eval(e){let t,i,n=this.value.eval(e);for(t=0;tthis.params.length)return!1}n=Math.min(r,this.arity);for(let i=0;i0){for(f=!0,c=0;c0)v=2;else if(v=1,y[1]+y[2]>1)throw{type:"Runtime",message:`Ambiguous use of \`default()\` found when matching for \`${this.format(s)}\``,index:this.getIndex(),filename:this.fileInfo().filename};for(c=0;c0&&(e=e.slice(0,t)),t=e.lastIndexOf("/"),t<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)}tryAppendExtension(e,t){return/(\.[a-z]*$)|([?;].*)$/.test(e)?e:e+t}tryAppendLessExtension(e){return this.tryAppendExtension(e,".less")}supportsSync(){return!1}alwaysMakePathsAbsolute(){return!1}isPathAbsolute(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)}join(e,t){return e?e+t:t}pathDiff(e,t){const i=this.extractUrlParts(e),n=this.extractUrlParts(t);let s,r,o,a,l="";if(i.hostPart!==n.hostPart)return"";for(r=Math.max(n.directories.length,i.directories.length),s=0;sparseInt(t[i])?-1:1;return 0}versionToString(e){let t="";for(let i=0;i{return i=255,(t=e)instanceof X&&t.unit.is("%")?parseFloat(t.value*i/100):tt(t);var t,i});return n=tt(n),new u(s,n,"rgba")}catch(e){}},hsl:function(e,t,i){let n=1;if(e instanceof ee){const s=e.value;if(e=s[0],t=s[1],(i=s[2])instanceof xe){const e=i;i=e.operands[0],n=e.operands[1]}}const s=Qe.hsla(e,t,i,n);if(s)return s.value="hsl",s},hsla:function(e,t,i,n){let s,r;function o(e){return 6*(e=e<0?e+1:e>1?e-1:e)<1?s+(r-s)*e*6:2*e<1?r:3*e<2?s+(r-s)*(2/3-e)*6:s}try{if(e instanceof u)return n=t?tt(t):e.alpha,new u(e.rgb,n,"hsla");e=tt(e)%360/360,t=Ze(tt(t)),i=Ze(tt(i)),n=Ze(tt(n)),r=i<=.5?i*(t+1):i+t-i*t,s=2*i-r;const a=[255*o(e+1/3),255*o(e),255*o(e-1/3)];return n=tt(n),new u(a,n,"hsla")}catch(e){}},hsv:function(e,t,i){return Qe.hsva(e,t,i,1)},hsva:function(e,t,i,n){let s,r;e=tt(e)%360/360*360,t=tt(t),i=tt(i),n=tt(n),s=Math.floor(e/60%6),r=e/60-s;const o=[i,i*(1-t),i*(1-r*t),i*(1-(1-r)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return Qe.rgba(255*o[a[s][0]],255*o[a[s][1]],255*o[a[s][2]],n)},hue:function(e){return new X(Ye(e).h)},saturation:function(e){return new X(100*Ye(e).s,"%")},lightness:function(e){return new X(100*Ye(e).l,"%")},hsvhue:function(e){return new X(et(e).h)},hsvsaturation:function(e){return new X(100*et(e).s,"%")},hsvvalue:function(e){return new X(100*et(e).v,"%")},red:function(e){return new X(e.rgb[0])},green:function(e){return new X(e.rgb[1])},blue:function(e){return new X(e.rgb[2])},alpha:function(e){return new X(Ye(e).a)},luma:function(e){return new X(e.luma()*e.alpha*100,"%")},luminance:function(e){const t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new X(t*e.alpha*100,"%")},saturate:function(e,t,i){if(!e.rgb)return null;const n=Ye(e);return void 0!==i&&"relative"===i.value?n.s+=n.s*t.value/100:n.s+=t.value/100,n.s=Ze(n.s),Xe(e,n)},desaturate:function(e,t,i){const n=Ye(e);return void 0!==i&&"relative"===i.value?n.s-=n.s*t.value/100:n.s-=t.value/100,n.s=Ze(n.s),Xe(e,n)},lighten:function(e,t,i){const n=Ye(e);return void 0!==i&&"relative"===i.value?n.l+=n.l*t.value/100:n.l+=t.value/100,n.l=Ze(n.l),Xe(e,n)},darken:function(e,t,i){const n=Ye(e);return void 0!==i&&"relative"===i.value?n.l-=n.l*t.value/100:n.l-=t.value/100,n.l=Ze(n.l),Xe(e,n)},fadein:function(e,t,i){const n=Ye(e);return void 0!==i&&"relative"===i.value?n.a+=n.a*t.value/100:n.a+=t.value/100,n.a=Ze(n.a),Xe(e,n)},fadeout:function(e,t,i){const n=Ye(e);return void 0!==i&&"relative"===i.value?n.a-=n.a*t.value/100:n.a-=t.value/100,n.a=Ze(n.a),Xe(e,n)},fade:function(e,t){const i=Ye(e);return i.a=t.value/100,i.a=Ze(i.a),Xe(e,i)},spin:function(e,t){const i=Ye(e),n=(i.h+t.value)%360;return i.h=n<0?360+n:n,Xe(e,i)},mix:function(e,t,i){i||(i=new X(50));const n=i.value/100,s=2*n-1,r=Ye(e).a-Ye(t).a,o=((s*r==-1?s:(s+r)/(1+s*r))+1)/2,a=1-o,l=[e.rgb[0]*o+t.rgb[0]*a,e.rgb[1]*o+t.rgb[1]*a,e.rgb[2]*o+t.rgb[2]*a],c=e.alpha*n+t.alpha*(1-n);return new u(l,c)},greyscale:function(e){return Qe.desaturate(e,new X(100))},contrast:function(e,t,i,n){if(!e.rgb)return null;if(void 0===i&&(i=Qe.rgba(255,255,255,1)),void 0===t&&(t=Qe.rgba(0,0,0,1)),t.luma()>i.luma()){const e=i;i=t,t=e}return n=void 0===n?.43:tt(n),e.luma().5&&(n=1,i=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*n*(i-e)},hardlight:function(e,t){return st.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(const e in st)st.hasOwnProperty(e)&&(nt[e]=nt.bind(null,st[e]));var rt=e=>{const t=(e,t)=>new $e(t,e.index,e.currentFileInfo).eval(e.context);return{"data-uri":function(i,n){n||(n=i,i=null);let r=i&&i.value,o=n.value;const a=this.currentFileInfo,l=a.rewriteUrls?a.currentDirectory:a.entryPath,c=o.indexOf("#");let u="";-1!==c&&(u=o.slice(c),o=o.slice(0,c));const h=A(this.context);h.rawBuffer=!0;const f=e.getFileManager(o,l,h,e,!0);if(!f)return t(this,n);let p=!1;if(i)p=/;base64$/.test(r);else{if(r=e.mimeLookup(o),"image/svg+xml"===r)p=!1;else{const t=e.charsetLookup(r);p=["US-ASCII","UTF-8"].indexOf(t)<0}p&&(r+=";base64")}const d=f.loadFileSync(o,l,h,e);if(!d.contents)return s.warn(`Skipped data-uri embedding of ${o} because file not found`),t(this,n||i);let m=d.contents;if(p&&!e.encodeBase64)return t(this,n);m=p?e.encodeBase64(m):encodeURIComponent(m);const g=`data:${r},${m}${u}`;return new $e(new _e(`"${g}"`,g,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}};const ot=e=>Array.isArray(e.value)?e.value:Array(e);var at={_SELF:function(e){return e},"~":function(...e){return 1===e.length?e[0]:new te(e)},extract:function(e,t){return t=t.value-1,ot(e)[t]},length:function(e){return new X(ot(e).length)},range:function(e,t,i){let n,s,r=1;const o=[];t?(s=t,n=e.value,i&&(r=i.value)):(n=1,s=e);for(let e=n;e<=s.value;e+=r)o.push(new X(e,s.unit));return new ee(o)},each:function(e,t){const i=[];let n,s;const r=e=>e instanceof c?e.eval(this.context):e;s=!e.value||e instanceof _e?e.ruleset?r(e.ruleset).rules:e.rules?e.rules.map(r):Array.isArray(e)?e.map(r):[r(e)]:Array.isArray(e.value)?e.value.map(r):[r(e.value)];let o="@value",a="@key",l="@index";t.params?(o=t.params[0]&&t.params[0].name,a=t.params[1]&&t.params[1].name,l=t.params[2]&&t.params[2].name,t=t.rules):t=t.ruleset;for(let e=0;e{if(!(i instanceof X))throw{type:"Argument",message:"argument must be a number"};return null===t?t=i.unit:i=i.unify(),new X(e(parseFloat(i.value)),t)},ct={ceil:null,floor:null,sqrt:null,abs:null,tan:"",sin:"",cos:"",atan:"rad",asin:"rad",acos:"rad"};for(const e in ct)ct.hasOwnProperty(e)&&(ct[e]=lt.bind(null,Math[e],ct[e]));ct.round=(e,t)=>{const i=void 0===t?0:t.value;return lt(e=>e.toFixed(i),null,e)};const ut=function(e,t){switch((t=Array.prototype.slice.call(t)).length){case 0:throw{type:"Argument",message:"one or more arguments required"}}let i,n,s,r,o,a,l,c;const u=[],h={};for(i=0;io.value)&&(u[n]=s);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=u.length,u.push(s)}}return 1==u.length?u[0]:(t=u.map(e=>e.toCSS(this.context)).join(this.context.compress?",":", "),new Y(`${e?"min":"max"}(${t})`))};var ht={min:function(...e){try{return ut.call(this,!0,e)}catch(e){}},max:function(...e){try{return ut.call(this,!1,e)}catch(e){}},convert:function(e,t){return e.convertTo(t.value)},pi:function(){return new X(Math.PI)},mod:function(e,t){return new X(e.value%t.value,e.unit)},pow:function(e,t){if("number"==typeof e&&"number"==typeof t)e=new X(e),t=new X(t);else if(!(e instanceof X&&t instanceof X))throw{type:"Argument",message:"arguments must be numbers"};return new X(Math.pow(e.value,t.value),e.unit)},percentage:function(e){return lt(e=>100*e,"%",e)}},ft={e:function(e){return new _e('"',e instanceof Re?e.evaluated:e.value,!0)},escape:function(e){return new Y(encodeURI(e.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},replace:function(e,t,i,n){let s=e.value;return i="Quoted"===i.type?i.value:i.toCSS(),s=s.replace(new RegExp(t.value,n?n.value:""),i),new _e(e.quote||"",s,e.escaped)},"%":function(e){const t=Array.prototype.slice.call(arguments,1);let i=e.value;for(let e=0;e{const n="Quoted"===t[e].type&&i.match(/s/i)?t[e].value:t[e].toCSS();return i.match(/[A-Z]$/)?encodeURIComponent(n):n});return i=i.replace(/%%/g,"%"),new _e(e.quote||"",i,e.escaped)}},pt=()=>({"svg-gradient":function(e){let t,i,n="linear",s='x="0" y="0" width="1" height="1"';const r={compress:!1};let o;const a=e.toCSS(r);let l,c,h,f,p;function d(){throw{type:"Argument",message:"svg-gradient expects direction, start_color [start_position], [color position,]..., end_color [end_position] or direction, color list"}}switch(2==arguments.length?(arguments[1].value.length<2&&d(),t=arguments[1].value):arguments.length<3?d():t=Array.prototype.slice.call(arguments,1),a){case"to bottom":i='x1="0%" y1="0%" x2="0%" y2="100%"';break;case"to right":i='x1="0%" y1="0%" x2="100%" y2="0%"';break;case"to bottom right":i='x1="0%" y1="0%" x2="100%" y2="100%"';break;case"to top right":i='x1="0%" y1="100%" x2="100%" y2="0%"';break;case"ellipse":case"ellipse at center":n="radial",i='cx="50%" cy="50%" r="75%"',s='x="-50" y="-50" width="101" height="101"';break;default:throw{type:"Argument",message:"svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center'"}}for(o=`<${n}Gradient id="g" ${i}>`,l=0;l`;return o+=`${n}Gradient>`,o=encodeURIComponent(o),o="data:image/svg+xml,"+o,new $e(new _e(`'${o}'`,o,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}});const dt=(e,t)=>e instanceof t?fe.True:fe.False,mt=(e,t)=>{if(void 0===t)throw{type:"Argument",message:"missing the required second argument to isunit."};if("string"!=typeof(t="string"==typeof t.value?t.value:t))throw{type:"Argument",message:"Second argument to isunit should be a unit or a string."};return e instanceof X&&e.unit.is(t)?fe.True:fe.False};var gt={isruleset:function(e){return dt(e,be)},iscolor:function(e){return dt(e,u)},isnumber:function(e){return dt(e,X)},isstring:function(e){return dt(e,_e)},iskeyword:function(e){return dt(e,fe)},isurl:function(e){return dt(e,$e)},ispixel:function(e){return mt(e,"px")},ispercentage:function(e){return mt(e,"%")},isem:function(e){return mt(e,"em")},isunit:mt,unit:function(e,t){if(!(e instanceof X))throw{type:"Argument",message:"the first argument to unit must be a number"+(e instanceof xe?". Have you forgotten parenthesis?":"")};return t=t?t instanceof fe?t.value:t.toCSS():"",new X(e.value,t)},"get-unit":function(e){return new Y(e.unit)}};const vt=function(e){if(0===(e=Array.prototype.slice.call(e)).length)throw{type:"Argument",message:"one or more arguments required"};return e=[new Ce(e[0].value,this.index,this.currentFileInfo).eval(this.context)].map(e=>e.toCSS(this.context)).join(this.context.compress?",":", "),new Y(`style(${e})`)};var yt={style:function(...e){try{return vt.call(this,e)}catch(e){}}},bt=e=>{const t={functionRegistry:oe,functionCaller:Se};return oe.addMultiple(He),oe.add("default",me.eval.bind(me)),oe.addMultiple(it),oe.addMultiple(nt),oe.addMultiple(rt(e)),oe.addMultiple(at),oe.addMultiple(ct),oe.addMultiple(ht),oe.addMultiple(ft),oe.addMultiple(pt()),oe.addMultiple(gt),oe.addMultiple(yt),t};function wt(e,t){let i,n=(t=t||{}).variables;const s=new j.Eval(t);"object"!=typeof n||Array.isArray(n)||(n=Object.keys(n).map((function(e){let t=n[e];return t instanceof ze.Value||(t instanceof ze.Expression||(t=new ze.Expression([t])),t=new ze.Value([t])),new ze.Declaration("@"+e,t,!1,null,0)})),s.frames=[new ze.Ruleset(null,n)]);const r=[new re.JoinSelectorVisitor,new re.MarkVisibleSelectorsVisitor(!0),new re.ExtendVisitor,new re.ToCSSVisitor({compress:Boolean(t.compress)})],o=[];let a,l;if(t.pluginManager){l=t.pluginManager.visitor();for(let t=0;t<2;t++)for(l.first();a=l.get();)a.isPreEvalVisitor?0!==t&&-1!==o.indexOf(a)||(o.push(a),a.run(e)):0!==t&&-1!==r.indexOf(a)||(a.isPreVisitor?r.unshift(a):r.push(a))}i=e.eval(s);for(let e=0;e=t);i++);this.preProcessors.splice(i,0,{preProcessor:e,priority:t})}addPostProcessor(e,t){let i;for(i=0;i=t);i++);this.postProcessors.splice(i,0,{postProcessor:e,priority:t})}addFileManager(e){this.fileManagers.push(e)}getPreProcessors(){const e=[];for(let t=0;t0){let e;const t=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?e=this.sourceMapURL:this._sourceMapFilename&&(e=this._sourceMapFilename),this.sourceMapURL=e,this.sourceMap=t}return this._css.join("")}}}(e=new r(e,t)),o=function(e,t){return class{constructor(e){this.options=e}toCSS(t,i,n){const s=new e({contentsIgnoredCharsMap:n.contentsIgnoredChars,rootNode:t,contentsMap:n.contents,sourceMapFilename:this.options.sourceMapFilename,sourceMapURL:this.options.sourceMapURL,outputFilename:this.options.sourceMapOutputFilename,sourceMapBasepath:this.options.sourceMapBasepath,sourceMapRootpath:this.options.sourceMapRootpath,outputSourceFiles:this.options.outputSourceFiles,sourceMapGenerator:this.options.sourceMapGenerator,sourceMapFileInline:this.options.sourceMapFileInline,disableSourcemapAnnotation:this.options.disableSourcemapAnnotation}),r=s.toCSS(i);return this.sourceMap=s.sourceMap,this.sourceMapURL=s.sourceMapURL,this.options.sourceMapInputFilename&&(this.sourceMapInputFilename=s.normalizeFilename(this.options.sourceMapInputFilename)),void 0!==this.options.sourceMapBasepath&&void 0!==this.sourceMapURL&&(this.sourceMapURL=s.removeBasepath(this.sourceMapURL)),r+this.getCSSAppendage()}getCSSAppendage(){let e=this.sourceMapURL;if(this.options.sourceMapFileInline){if(void 0===this.sourceMap)return"";e="data:application/json;base64,"+t.encodeBase64(this.sourceMap)}return this.options.disableSourcemapAnnotation?"":e?`/*# sourceMappingURL=${e} */`:""}getExternalSourceMap(){return this.sourceMap}setExternalSourceMap(e){this.sourceMap=e}isInline(){return this.options.sourceMapFileInline}getSourceMapURL(){return this.sourceMapURL}getOutputFilename(){return this.options.sourceMapOutputFilename}getInputFilename(){return this.sourceMapInputFilename}}}(n,e),a=function(e){return class{constructor(e,t){this.root=e,this.imports=t}toCSS(t){let i;const n={};let r;try{i=wt(this.root,t)}catch(e){throw new O(e,this.imports)}try{const o=Boolean(t.compress);o&&s.warn("The compress option has been deprecated. We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.");const a={compress:o,dumpLineNumbers:t.dumpLineNumbers,strictUnits:Boolean(t.strictUnits),numPrecision:8};if(t.sourceMap){!0===t.sourceMap&&(t.sourceMap={});const s=t.sourceMap;if(!s.sourceMapInputFilename&&t.filename&&(s.sourceMapInputFilename=t.filename),void 0===s.sourceMapBasepath&&t.filename){const e=Math.max(t.filename.lastIndexOf("/"),t.filename.lastIndexOf("\\"));s.sourceMapBasepath=e>=0?t.filename.substring(0,e):"."}if(s.sourceMapFullFilename&&!s.sourceMapFileInline){if(!s.sourceMapFilename&&!s.sourceMapURL){const e=s.sourceMapFullFilename.split(/[/\\]/).pop();s.sourceMapFilename=e}}else if(!s.sourceMapFilename&&!s.sourceMapURL)if(s.sourceMapOutputFilename)s.sourceMapFilename=s.sourceMapOutputFilename+".map";else if(t.filename){const e=t.filename.split(/[/\\]/).pop().replace(/\.[^/.]+$/,"");s.sourceMapFilename=e+".css.map"}if(!s.sourceMapOutputFilename)if(t.filename){const e=t.filename.split(/[/\\]/).pop().replace(/\.[^/.]+$/,"");s.sourceMapOutputFilename=e+".css"}else s.sourceMapOutputFilename="output.css";r=new e(s),n.css=r.toCSS(i,a,this.imports)}else n.css=i.toCSS(a)}catch(e){throw new O(e,this.imports)}if(t.pluginManager){const e=t.pluginManager.getPostProcessors();for(let i=0;i{e?c(e):f(t)}),p?p.filename?f(p):c(p):d&&d.then(f,c)}}}(e);const u=function(e,t){const i=function(e,n,s){if("function"==typeof n?(s=n,n=$(this.options,{})):n=$(this.options,n||{}),!s){const t=this;return new Promise((function(s,r){i.call(t,e,n,(function(e,t){e?r(e):s(t)}))}))}this.parse(e,n,(function(e,i,n,r){if(e)return s(e);let o;try{o=new t(i,n).toCSS(r)}catch(e){return s(e)}s(null,o)}))};return i}(0,a),h=function(e,t,i){const n=function(e,t,s){if("function"==typeof t?(s=t,t=$(this.options,{})):t=$(this.options,t||{}),!s){const i=this;return new Promise((function(s,r){n.call(i,e,t,(function(e,t){e?r(e):s(t)}))}))}{let n,r;const o=new It(this,!t.reUsePluginManager);if(t.pluginManager=o,n=new j.Parse(t),t.rootFileInfo)r=t.rootFileInfo;else{const e=t.filename||"input",i=e.replace(/[^/\\]*$/,"");r={filename:e,rewriteUrls:n.rewriteUrls,rootpath:n.rootpath||"",currentDirectory:i,entryPath:i,rootFilename:e},r.rootpath&&"/"!==r.rootpath.slice(-1)&&(r.rootpath+="/")}const a=new i(this,n,r);this.importManager=a,t.plugins&&t.plugins.forEach((function(e){let t,i;if(e.fileContent){if(i=e.fileContent.replace(/^\uFEFF/,""),t=o.Loader.evalPlugin(i,n,a,e.options,e.filename),t instanceof O)return s(t)}else o.addPlugin(e)})),new ue(n,a,r).parse(e,(function(e,i){if(e)return s(e);s(null,i,a,t)}),t)}};return n}(0,0,c),f=Ct("v"+i),p={version:[f.major,f.minor,f.patch],data:l,tree:ze,Environment:r,AbstractFileManager:Ge,AbstractPluginLoader:We,environment:e,visitors:re,Parser:ue,functions:bt(e),contexts:j,SourceMapOutput:n,SourceMapBuilder:o,ParseTree:a,ImportManager:c,render:u,parse:h,LessError:O,transformTree:wt,utils:E,PluginManager:It,logger:s},d=function(e){return function(){const t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}};let m;const g=Object.create(p);for(const e in p.tree)if(m=p.tree[e],"function"==typeof m)g[e.toLowerCase()]=d(m);else{g[e]=Object.create(null);for(const t in m)g[e][t.toLowerCase()]=d(m[t])}return p.parse=p.parse.bind(g),p.render=p.render.bind(g),g}let At,_t,$t={};const Mt=function(){};Mt.prototype=Object.assign(new Ge,{alwaysMakePathsAbsolute:()=>!0,join(e,t){return e?this.extractUrlParts(t,e).path:t},doXHR(e,t,i,n){const s=new XMLHttpRequest,r=!At.isFileProtocol||At.fileAsync;function o(t,i,n){t.status>=200&&t.status<300?i(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof n&&n(t.status,e)}"function"==typeof s.overrideMimeType&&s.overrideMimeType("text/css"),_t.debug(`XHR: Getting '${e}'`),s.open("GET",e,r),s.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),s.send(null),At.isFileProtocol&&!At.fileAsync?0===s.status||s.status>=200&&s.status<300?i(s.responseText):n(s.status,e):r?s.onreadystatechange=()=>{4==s.readyState&&o(s,i,n)}:o(s,i,n)},supports:()=>!0,clearFileCache(){$t={}},loadFile(e,t,i){t&&!this.isPathAbsolute(e)&&(e=t+e),e=i.ext?this.tryAppendExtension(e,i.ext):e,i=i||{};const n=this.extractUrlParts(e,window.location.href).url,s=this;return new Promise((e,t)=>{if(i.useFileCache&&$t[n])try{const t=$t[n];return e({contents:t,filename:n,webInfo:{lastModified:new Date}})}catch(e){return t({filename:n,message:`Error loading file ${n} error was ${e.message}`})}s.doXHR(n,i.mime,(function(t,i){$t[n]=t,e({contents:t,filename:n,webInfo:{lastModified:i}})}),(function(e,i){t({type:"File",message:`'${i}' wasn't found (${e})`,href:n})}))})}});var Pt=(e,t)=>(At=e,_t=t,Mt);const Et=function(e){this.less=e};Et.prototype=Object.assign(new We,{loadPlugin:(e,t,i,n,s)=>new Promise((r,o)=>{s.loadFile(e,t,i,n).then(r).catch(o)})});var Rt=(t,n,s)=>({add:function(r,o){s.errorReporting&&"html"!==s.errorReporting?"console"===s.errorReporting?function(e,t){const i=e.filename||t,r=[];let o=`${e.type||"Syntax"}Error: ${e.message||"There is an error in your .less file"} in ${i}`;const a=(e,t,i)=>{void 0!==e.extract[t]&&r.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,i).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),o+=` on line ${e.line}, column ${e.column+1}:\n${r.join("\n")}`),e.stack&&(e.extract||s.logLevel>=4)&&(o+="\nStack Trace\n"+e.stack),n.logger.error(o)}(r,o):"function"==typeof s.errorReporting&&s.errorReporting("add",r,o):function(n,r){const o="less-error-message:"+e(r||""),a=t.document.createElement("div");let l,c;const u=[],h=n.filename||r,f=h.match(/([^/]+(\?.*)?)$/)[1];a.id=o,a.className="less-error-message",c=`${n.type||"Syntax"}Error: ${n.message||"There is an error in your .less file"}
in ${f} `;const p=(e,t,i)=>{void 0!==e.extract[t]&&u.push('
{content}'.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,i).replace(/\{content\}/,e.extract[t]))};n.line&&(p(n,0,""),p(n,1,"line"),p(n,2,""),c+=`on line ${n.line}, column ${n.column+1}:`),n.stack&&(n.extract||s.logLevel>=4)&&(c+="
Stack Trace"+n.stack.split("\n").slice(1).join("
")),a.innerHTML=c,i(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),a.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===s.env&&(l=setInterval(()=>{const e=t.document,i=e.body;i&&(e.getElementById(o)?i.replaceChild(a,e.getElementById(o)):i.insertBefore(a,i.firstChild),clearInterval(l))},10))}(r,o)},remove:function(i){s.errorReporting&&"html"!==s.errorReporting?"console"===s.errorReporting||"function"==typeof s.errorReporting&&s.errorReporting("remove",i):function(i){const n=t.document.getElementById("less-error-message:"+e(i));n&&n.parentNode.removeChild(n)}(i)}}),Ot="4.5.0";const Ft={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(const e in window.less)Object.prototype.hasOwnProperty.call(window.less,e)&&(Ft[e]=window.less[e]);((e,i)=>{t(i,n(e)),void 0===i.isFileProtocol&&(i.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),i.async=i.async||!1,i.fileAsync=i.fileAsync||!1,i.poll=i.poll||(i.isFileProtocol?1e3:1500),i.env=i.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||i.isFileProtocol?"development":"production");const s=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);s&&(i.dumpLineNumbers=s[1]),void 0===i.useFileCache&&(i.useFileCache=!0),void 0===i.onReady&&(i.onReady=!0),i.relativeUrls&&(i.rewriteUrls="all")})(window,Ft),Ft.plugins=Ft.plugins||[],window.LESS_PLUGINS&&(Ft.plugins=Ft.plugins.concat(window.LESS_PLUGINS));const Vt=((e,n)=>{const s=e.document,r=kt(void 0,void 0,Ot);r.options=n;const o=r.environment,a=Pt(n,r.logger),l=new a;o.addFileManager(l),r.FileManager=a,r.PluginLoader=Et,((e,t)=>{t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(let i=0;i{let n=null;if("development"!==t.env)try{n=void 0===e.localStorage?null:e.localStorage}catch(e){}return{setCSS:function(e,t,s,r){if(n){i.info(`saving ${e} to cache.`);try{n.setItem(e,r),n.setItem(e+":timestamp",t),s&&n.setItem(e+":vars",JSON.stringify(s))}catch(t){i.error(`failed to save "${e}" to local storage for caching.`)}}},getCSS:function(e,t,i){const s=n&&n.getItem(e),r=n&&n.getItem(e+":timestamp");let o=n&&n.getItem(e+":vars");if(i=i||{},o=o||"{}",r&&t.lastModified&&new Date(t.lastModified).valueOf()===new Date(r).valueOf()&&JSON.stringify(i)===o)return s}}})(e,n,r.logger);(()=>{function e(){throw{type:"Runtime",message:"Image size functions are not supported in browser version of less"}}const t={"image-size":function(t){return e(),-1},"image-width":function(t){return e(),-1},"image-height":function(t){return e(),-1}};oe.addMultiple(t)})(r.environment),n.functions&&r.functions.functionRegistry.addMultiple(n.functions);const h=/^text\/(x-)?less$/;function f(e){const t={};for(const i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t}function p(e){const t=s.getElementsByTagName("style");for(let i of t)if(i.type.match(h)){const t={...f(n),modifyVars:e,filename:s.location.href.replace(/#.*$/,"")},o=i.innerHTML||"";r.render(o,t,(e,t)=>{e?c.add(e,"inline"):(i.type="text/css",i.styleSheet?i.styleSheet.cssText=t.css:i.innerHTML=t.css)})}}function d(e,i,s,a,h){const p=f(n);t(p,e),p.mime=e.type,h&&(p.modifyVars=h),l.loadFile(e.href,null,p,o).then(t=>{!function(t){const n=t.contents,o=t.filename,h=t.webInfo,f={currentDirectory:l.getPath(o),filename:o,rootFilename:o,rewriteUrls:p.rewriteUrls};if(f.entryPath=f.currentDirectory,f.rootpath=p.rootpath||f.currentDirectory,h){h.remaining=a;const t=u.getCSS(o,h,p.modifyVars);if(!s&&t)return h.local=!0,void i(null,t,n,e,h,o)}c.remove(o),p.rootFileInfo=f,r.render(n,p,(t,s)=>{t?(t.href=o,i(t)):(u.setCSS(e.href,h.lastModified,p.modifyVars,s.css),i(null,s.css,n,e,h,o))})}(t)}).catch(e=>{console.log(e),i(e)})}function m(e,t,i){for(let n=0;n{r.watchMode&&(l.clearFileCache(),m((t,n,s,r,o)=>{t?c.add(t,t.href||r.href):n&&i(e.document,n,r)}))},n.poll))),this.watchMode=!0,!0},r.unwatch=function(){return clearInterval(r.watchTimer),this.watchMode=!1,!1},r.registerStylesheetsImmediately=()=>{const e=s.getElementsByTagName("link");r.sheets=[];for(let t=0;tnew Promise(e=>{r.registerStylesheetsImmediately(),e()}),r.modifyVars=e=>r.refresh(!0,e,!1),r.refresh=(t,n,s)=>((t||s)&&!1!==s&&l.clearFileCache(),new Promise((s,o)=>{let a,l,u,h;a=l=new Date,h=r.sheets.length,0===h?(l=new Date,u=l-a,r.logger.info("Less has finished and no sheets were loaded."),s({startTime:a,endTime:l,totalMilliseconds:u,sheets:r.sheets.length})):m((t,n,f,p,d)=>{if(t)return c.add(t,t.href||p.href),void o(t);d.local?r.logger.info(`Loading ${p.href} from cache.`):r.logger.info(`Rendered ${p.href} successfully.`),i(e.document,n,p),r.logger.info(`CSS for ${p.href} generated in ${new Date-l}ms`),h--,0===h&&(u=new Date-a,r.logger.info(`Less has finished. CSS generated in ${u}ms`),s({startTime:a,endTime:l,totalMilliseconds:u,sheets:r.sheets.length})),l=new Date},t,n),p(n)})),r.refreshStyles=p,r})(window,Ft);let Lt,Dt,jt;function Nt(e){e.filename&&console.warn(e),Ft.async||Dt.removeChild(jt)}return window.less=Vt,Ft.onReady&&(/!watch/.test(window.location.hash)&&Vt.watch(),Ft.async||(Lt="body { display: none !important }",Dt=document.head||document.getElementsByTagName("head")[0],jt=document.createElement("style"),jt.type="text/css",jt.styleSheet?jt.styleSheet.cssText=Lt:jt.appendChild(document.createTextNode(Lt)),Dt.appendChild(jt)),Vt.registerStylesheetsImmediately(),Vt.pageLoadFinished=Vt.refresh("development"===Vt.env).then(Nt,Nt)),Vt}));
-//# sourceMappingURL=less.min.js.map
diff --git a/packages/less/dist/less.min.js.map b/packages/less/dist/less.min.js.map
deleted file mode 100644
index 747bd5b6f..000000000
--- a/packages/less/dist/less.min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"less.min.js","sources":["../lib/less-browser/utils.js","../lib/less-browser/browser.js","../lib/less/logger.js","../lib/less/environment/environment.js","../lib/less/data/colors.js","../lib/less/data/unit-conversions.js","../lib/less/data/index.js","../lib/less/tree/node.js","../lib/less/tree/color.js","../lib/less/tree/paren.js","../lib/less/tree/combinator.js","../lib/less/tree/element.js","../lib/less/constants.js","../../../node_modules/.pnpm/is-what@3.14.1/node_modules/is-what/dist/index.esm.js","../../../node_modules/.pnpm/copy-anything@2.0.6/node_modules/copy-anything/dist/index.es.js","../lib/less/utils.js","../lib/less/less-error.js","../lib/less/visitors/visitor.js","../lib/less/contexts.js","../lib/less/visitors/import-sequencer.js","../lib/less/visitors/import-visitor.js","../lib/less/visitors/extend-visitor.js","../lib/less/tree/debug-info.js","../lib/less/tree/comment.js","../lib/less/tree/unit.js","../lib/less/tree/dimension.js","../lib/less/tree/anonymous.js","../lib/less/tree/expression.js","../lib/less/tree/value.js","../lib/less/tree/merge-rules.js","../lib/less/visitors/to-css-visitor.js","../lib/less/visitors/index.js","../lib/less/visitors/set-tree-visibility-visitor.js","../lib/less/visitors/join-selector-visitor.js","../lib/less/functions/function-registry.js","../lib/less/tree/atrule-syntax.js","../lib/less/deprecation.js","../lib/less/parser/parser.js","../lib/less/parser/parser-input.js","../lib/less/tree/selector.js","../lib/less/tree/keyword.js","../lib/less/tree/declaration.js","../lib/less/functions/default.js","../lib/less/tree/ruleset.js","../lib/less/tree/nested-at-rule.js","../lib/less/tree/atrule.js","../lib/less/tree/detached-ruleset.js","../lib/less/tree/operation.js","../lib/less/functions/function-caller.js","../lib/less/tree/call.js","../lib/less/tree/variable.js","../lib/less/tree/property.js","../lib/less/tree/attribute.js","../lib/less/tree/quoted.js","../lib/less/tree/url.js","../lib/less/tree/media.js","../lib/less/tree/import.js","../lib/less/tree/js-eval-node.js","../lib/less/tree/javascript.js","../lib/less/tree/assignment.js","../lib/less/tree/condition.js","../lib/less/tree/query-in-parens.js","../lib/less/tree/container.js","../lib/less/tree/unicode-descriptor.js","../lib/less/tree/negative.js","../lib/less/tree/extend.js","../lib/less/tree/variable-call.js","../lib/less/tree/namespace-value.js","../lib/less/tree/mixin-definition.js","../lib/less/tree/mixin-call.js","../lib/less/tree/index.js","../lib/less/environment/abstract-file-manager.js","../lib/less/environment/abstract-plugin-loader.js","../lib/less/functions/boolean.js","../lib/less/functions/color.js","../lib/less/functions/color-blending.js","../lib/less/functions/data-uri.js","../lib/less/functions/list.js","../lib/less/functions/math-helper.js","../lib/less/functions/math.js","../lib/less/functions/number.js","../lib/less/functions/string.js","../lib/less/functions/svg.js","../lib/less/functions/types.js","../lib/less/functions/style.js","../lib/less/functions/index.js","../lib/less/transform-tree.js","../lib/less/plugin-manager.js","../../../node_modules/.pnpm/parse-node-version@1.0.1/node_modules/parse-node-version/index.js","../lib/less/index.js","../lib/less/source-map-output.js","../lib/less/source-map-builder.js","../lib/less/parse-tree.js","../lib/less/import-manager.js","../lib/less/render.js","../lib/less/parse.js","../lib/less-browser/file-manager.js","../lib/less-browser/plugin-loader.js","../lib/less-browser/log-listener.js","../lib/less-browser/error-reporting.js","../lib/less-browser/bootstrap.js","../lib/less/default-options.js","../lib/less-browser/add-default-options.js","../lib/less-browser/index.js","../lib/less-browser/cache.js","../lib/less-browser/image-size.js"],"sourcesContent":["\nexport function extractId(href) {\n return href.replace(/^[a-z-]+:\\/+?[^/]+/, '') // Remove protocol & domain\n .replace(/[?&]livereload=\\w+/, '') // Remove LiveReload cachebuster\n .replace(/^\\//, '') // Remove root /\n .replace(/\\.[a-zA-Z]+$/, '') // Remove simple extension\n .replace(/[^.\\w-]+/g, '-') // Replace illegal characters\n .replace(/\\./g, ':'); // Replace dots with colons(for valid id)\n}\n\nexport function addDataAttr(options, tag) {\n if (!tag) {return;} // in case of tag is null or undefined\n for (const opt in tag.dataset) {\n if (Object.prototype.hasOwnProperty.call(tag.dataset, opt)) {\n if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') {\n options[opt] = tag.dataset[opt];\n } else {\n try {\n options[opt] = JSON.parse(tag.dataset[opt]);\n }\n catch (_) {}\n }\n }\n }\n}\n","import * as utils from './utils.js';\n\nexport default {\n createCSS: function (document, styles, sheet) {\n // Strip the query-string\n const href = sheet.href || '';\n\n // If there is no title set, use the filename, minus the extension\n const id = `less:${sheet.title || utils.extractId(href)}`;\n\n // If this has already been inserted into the DOM, we may need to replace it\n const oldStyleNode = document.getElementById(id);\n let keepOldStyleNode = false;\n\n // Create a new stylesheet node for insertion or (if necessary) replacement\n const styleNode = document.createElement('style');\n styleNode.setAttribute('type', 'text/css');\n if (sheet.media) {\n styleNode.setAttribute('media', sheet.media);\n }\n styleNode.id = id;\n\n if (!styleNode.styleSheet) {\n styleNode.appendChild(document.createTextNode(styles));\n\n // If new contents match contents of oldStyleNode, don't replace oldStyleNode\n keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger.js';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory === undefined) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors.js';\nimport unitConversions from './unit-conversions.js';\n\nexport default { colors, unitConversions };\n","/**\n * The reason why Node is a class and other nodes simply do not extend\n * from Node (since we're transpiling) is due to this issue:\n * \n * @see https://github.com/less/less.js/issues/3434\n */\nclass Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n }\n\n get currentFileInfo() {\n return this.fileInfo();\n }\n\n get index() {\n return this.getIndex();\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n // remove when genCSS has JSDoc types\n // eslint-disable-next-line no-unused-vars\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks === undefined) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks === undefined) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks === undefined) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","import Node from './node.js';\nimport colors from '../data/colors.js';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nconst Color = function(rgb, a, originalForm) {\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n}\n\nColor.prototype = Object.assign(new Node(), {\n type: 'Color',\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n // eslint-disable-next-line no-fallthrough\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n },\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n },\n\n toRGB() {\n return toHex(this.rgb);\n },\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n },\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n },\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n },\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n});\n\nColor.fromKeyword = function(keyword) {\n let c;\n const key = keyword.toLowerCase();\n // eslint-disable-next-line no-prototype-builtins\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n};\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n }).join('')}`;\n}\n\nexport default Color;\n","import Node from './node.js';\n\nconst Paren = function(node) {\n this.value = node;\n};\n\nParen.prototype = Object.assign(new Node(), {\n type: 'Paren',\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n const paren = new Paren(this.value.eval(context));\n \n if (this.noSpacing) {\n paren.noSpacing = true;\n }\n\n return paren;\n }\n});\n\nexport default Paren;\n","import Node from './node.js';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nconst Combinator = function(value) {\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n}\n\nCombinator.prototype = Object.assign(new Node(), {\n type: 'Combinator',\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n});\n\nexport default Combinator;\n","import Node from './node.js';\nimport Paren from './paren.js';\nimport Combinator from './combinator.js';\n\nconst Element = function(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n}\n\nElement.prototype = Object.assign(new Node(), {\n type: 'Element',\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n },\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n },\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n});\n\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/**\r\n * Returns the object type of the given payload\r\n *\r\n * @param {*} payload\r\n * @returns {string}\r\n */\r\nfunction getType(payload) {\r\n return Object.prototype.toString.call(payload).slice(8, -1);\r\n}\r\n/**\r\n * Returns whether the payload is undefined\r\n *\r\n * @param {*} payload\r\n * @returns {payload is undefined}\r\n */\r\nfunction isUndefined(payload) {\r\n return getType(payload) === 'Undefined';\r\n}\r\n/**\r\n * Returns whether the payload is null\r\n *\r\n * @param {*} payload\r\n * @returns {payload is null}\r\n */\r\nfunction isNull(payload) {\r\n return getType(payload) === 'Null';\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isPlainObject(payload) {\r\n if (getType(payload) !== 'Object')\r\n return false;\r\n return payload.constructor === Object && Object.getPrototypeOf(payload) === Object.prototype;\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isObject(payload) {\r\n return isPlainObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is { [K in any]: never }}\r\n */\r\nfunction isEmptyObject(payload) {\r\n return isPlainObject(payload) && Object.keys(payload).length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isFullObject(payload) {\r\n return isPlainObject(payload) && Object.keys(payload).length > 0;\r\n}\r\n/**\r\n * Returns whether the payload is an any kind of object (including special classes or objects with different prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isAnyObject(payload) {\r\n return getType(payload) === 'Object';\r\n}\r\n/**\r\n * Returns whether the payload is an object like a type passed in < >\r\n *\r\n * Usage: isObjectLike<{id: any}>(payload) // will make sure it's an object and has an `id` prop.\r\n *\r\n * @template T this must be passed in < >\r\n * @param {*} payload\r\n * @returns {payload is T}\r\n */\r\nfunction isObjectLike(payload) {\r\n return isAnyObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a function (regular or async)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is AnyFunction}\r\n */\r\nfunction isFunction(payload) {\r\n return typeof payload === 'function';\r\n}\r\n/**\r\n * Returns whether the payload is an array\r\n *\r\n * @param {any} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isArray(payload) {\r\n return getType(payload) === 'Array';\r\n}\r\n/**\r\n * Returns whether the payload is a an array with at least 1 item\r\n *\r\n * @param {*} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isFullArray(payload) {\r\n return isArray(payload) && payload.length > 0;\r\n}\r\n/**\r\n * Returns whether the payload is a an empty array\r\n *\r\n * @param {*} payload\r\n * @returns {payload is []}\r\n */\r\nfunction isEmptyArray(payload) {\r\n return isArray(payload) && payload.length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is a string\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isString(payload) {\r\n return getType(payload) === 'String';\r\n}\r\n/**\r\n * Returns whether the payload is a string, BUT returns false for ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isFullString(payload) {\r\n return isString(payload) && payload !== '';\r\n}\r\n/**\r\n * Returns whether the payload is ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isEmptyString(payload) {\r\n return payload === '';\r\n}\r\n/**\r\n * Returns whether the payload is a number (but not NaN)\r\n *\r\n * This will return `false` for `NaN`!!\r\n *\r\n * @param {*} payload\r\n * @returns {payload is number}\r\n */\r\nfunction isNumber(payload) {\r\n return getType(payload) === 'Number' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a boolean\r\n *\r\n * @param {*} payload\r\n * @returns {payload is boolean}\r\n */\r\nfunction isBoolean(payload) {\r\n return getType(payload) === 'Boolean';\r\n}\r\n/**\r\n * Returns whether the payload is a regular expression (RegExp)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is RegExp}\r\n */\r\nfunction isRegExp(payload) {\r\n return getType(payload) === 'RegExp';\r\n}\r\n/**\r\n * Returns whether the payload is a Map\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Map}\r\n */\r\nfunction isMap(payload) {\r\n return getType(payload) === 'Map';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakMap\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakMap}\r\n */\r\nfunction isWeakMap(payload) {\r\n return getType(payload) === 'WeakMap';\r\n}\r\n/**\r\n * Returns whether the payload is a Set\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Set}\r\n */\r\nfunction isSet(payload) {\r\n return getType(payload) === 'Set';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakSet\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakSet}\r\n */\r\nfunction isWeakSet(payload) {\r\n return getType(payload) === 'WeakSet';\r\n}\r\n/**\r\n * Returns whether the payload is a Symbol\r\n *\r\n * @param {*} payload\r\n * @returns {payload is symbol}\r\n */\r\nfunction isSymbol(payload) {\r\n return getType(payload) === 'Symbol';\r\n}\r\n/**\r\n * Returns whether the payload is a Date, and that the date is valid\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Date}\r\n */\r\nfunction isDate(payload) {\r\n return getType(payload) === 'Date' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a Blob\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Blob}\r\n */\r\nfunction isBlob(payload) {\r\n return getType(payload) === 'Blob';\r\n}\r\n/**\r\n * Returns whether the payload is a File\r\n *\r\n * @param {*} payload\r\n * @returns {payload is File}\r\n */\r\nfunction isFile(payload) {\r\n return getType(payload) === 'File';\r\n}\r\n/**\r\n * Returns whether the payload is a Promise\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Promise