source-map-js-1.0.2/000077500000000000000000000000001417156454300142115ustar00rootroot00000000000000source-map-js-1.0.2/.gitattributes000066400000000000000000000000521417156454300171010ustar00rootroot00000000000000bench/scalajs-runtime-sourcemap.js binary source-map-js-1.0.2/.gitignore000066400000000000000000000000461417156454300162010ustar00rootroot00000000000000*.iml *.log .idea node_modules/* dist source-map-js-1.0.2/.travis.yml000066400000000000000000000002301417156454300163150ustar00rootroot00000000000000language: node_js sudo: false node_js: - "0.10" - "0.12" - "4" - "5" - "6" cache: directories: - node_modules os: - linux - osx source-map-js-1.0.2/CHANGELOG.md000066400000000000000000000206361417156454300160310ustar00rootroot00000000000000# Change Log ## 1.0.2 * Add types for path imports ([#13](https://github.com/7rulnik/source-map-js/pull/13)) [@TrySound](https://github.com/TrySound) ## 1.0.1 * Remove cleanComments optimization ([#10](https://github.com/7rulnik/source-map-js/pull/10)) [@ai](https://github.com/ai) ## 1.0.0 * Fix package.json#typings field ([#6](https://github.com/7rulnik/source-map-js/pull/6)) [@chalkygames123](https://github.com/chalkygames123) * Reduce memory usage of eachMapping w/ loop ([#5](https://github.com/7rulnik/source-map-js/pull/5)) [@noppa](https://github.com/noppa) * Reduce npm package size ([#7](https://github.com/7rulnik/source-map-js/pull/7)) [@ai](https://github.com/ai) ---------- # It doesn't related to this fork: ## 0.5.6 * Fix for regression when people were using numbers as names in source maps. See #236. ## 0.5.5 * Fix "regression" of unsupported, implementation behavior that half the world happens to have come to depend on. See #235. * Fix regression involving function hoisting in SpiderMonkey. See #233. ## 0.5.4 * Large performance improvements to source-map serialization. See #228 and #229. ## 0.5.3 * Do not include unnecessary distribution files. See commit ef7006f8d1647e0a83fdc60f04f5a7ca54886f86. ## 0.5.2 * Include browser distributions of the library in package.json's `files`. See issue #212. ## 0.5.1 * Fix latent bugs in IndexedSourceMapConsumer.prototype._parseMappings. See ff05274becc9e6e1295ed60f3ea090d31d843379. ## 0.5.0 * Node 0.8 is no longer supported. * Use webpack instead of dryice for bundling. * Big speedups serializing source maps. See pull request #203. * Fix a bug with `SourceMapConsumer.prototype.sourceContentFor` and sources that explicitly start with the source root. See issue #199. ## 0.4.4 * Fix an issue where using a `SourceMapGenerator` after having created a `SourceMapConsumer` from it via `SourceMapConsumer.fromSourceMap` failed. See issue #191. * Fix an issue with where `SourceMapGenerator` would mistakenly consider different mappings as duplicates of each other and avoid generating them. See issue #192. ## 0.4.3 * A very large number of performance improvements, particularly when parsing source maps. Collectively about 75% of time shaved off of the source map parsing benchmark! * Fix a bug in `SourceMapConsumer.prototype.allGeneratedPositionsFor` and fuzzy searching in the presence of a column option. See issue #177. * Fix a bug with joining a source and its source root when the source is above the root. See issue #182. * Add the `SourceMapConsumer.prototype.hasContentsOfAllSources` method to determine when all sources' contents are inlined into the source map. See issue #190. ## 0.4.2 * Add an `.npmignore` file so that the benchmarks aren't pulled down by dependent projects. Issue #169. * Add an optional `column` argument to `SourceMapConsumer.prototype.allGeneratedPositionsFor` and better handle lines with no mappings. Issues #172 and #173. ## 0.4.1 * Fix accidentally defining a global variable. #170. ## 0.4.0 * The default direction for fuzzy searching was changed back to its original direction. See #164. * There is now a `bias` option you can supply to `SourceMapConsumer` to control the fuzzy searching direction. See #167. * About an 8% speed up in parsing source maps. See #159. * Added a benchmark for parsing and generating source maps. ## 0.3.0 * Change the default direction that searching for positions fuzzes when there is not an exact match. See #154. * Support for environments using json2.js for JSON serialization. See #156. ## 0.2.0 * Support for consuming "indexed" source maps which do not have any remote sections. See pull request #127. This introduces a minor backwards incompatibility if you are monkey patching `SourceMapConsumer.prototype` methods. ## 0.1.43 * Performance improvements for `SourceMapGenerator` and `SourceNode`. See issue #148 for some discussion and issues #150, #151, and #152 for implementations. ## 0.1.42 * Fix an issue where `SourceNode`s from different versions of the source-map library couldn't be used in conjunction with each other. See issue #142. ## 0.1.41 * Fix a bug with getting the source content of relative sources with a "./" prefix. See issue #145 and [Bug 1090768](bugzil.la/1090768). * Add the `SourceMapConsumer.prototype.computeColumnSpans` method to compute the column span of each mapping. * Add the `SourceMapConsumer.prototype.allGeneratedPositionsFor` method to find all generated positions associated with a given original source and line. ## 0.1.40 * Performance improvements for parsing source maps in SourceMapConsumer. ## 0.1.39 * Fix a bug where setting a source's contents to null before any source content had been set before threw a TypeError. See issue #131. ## 0.1.38 * Fix a bug where finding relative paths from an empty path were creating absolute paths. See issue #129. ## 0.1.37 * Fix a bug where if the source root was an empty string, relative source paths would turn into absolute source paths. Issue #124. ## 0.1.36 * Allow the `names` mapping property to be an empty string. Issue #121. ## 0.1.35 * A third optional parameter was added to `SourceNode.fromStringWithSourceMap` to specify a path that relative sources in the second parameter should be relative to. Issue #105. * If no file property is given to a `SourceMapGenerator`, then the resulting source map will no longer have a `null` file property. The property will simply not exist. Issue #104. * Fixed a bug where consecutive newlines were ignored in `SourceNode`s. Issue #116. ## 0.1.34 * Make `SourceNode` work with windows style ("\r\n") newlines. Issue #103. * Fix bug involving source contents and the `SourceMapGenerator.prototype.applySourceMap`. Issue #100. ## 0.1.33 * Fix some edge cases surrounding path joining and URL resolution. * Add a third parameter for relative path to `SourceMapGenerator.prototype.applySourceMap`. * Fix issues with mappings and EOLs. ## 0.1.32 * Fixed a bug where SourceMapConsumer couldn't handle negative relative columns (issue 92). * Fixed test runner to actually report number of failed tests as its process exit code. * Fixed a typo when reporting bad mappings (issue 87). ## 0.1.31 * Delay parsing the mappings in SourceMapConsumer until queried for a source location. * Support Sass source maps (which at the time of writing deviate from the spec in small ways) in SourceMapConsumer. ## 0.1.30 * Do not join source root with a source, when the source is a data URI. * Extend the test runner to allow running single specific test files at a time. * Performance improvements in `SourceNode.prototype.walk` and `SourceMapConsumer.prototype.eachMapping`. * Source map browser builds will now work inside Workers. * Better error messages when attempting to add an invalid mapping to a `SourceMapGenerator`. ## 0.1.29 * Allow duplicate entries in the `names` and `sources` arrays of source maps (usually from TypeScript) we are parsing. Fixes github issue 72. ## 0.1.28 * Skip duplicate mappings when creating source maps from SourceNode; github issue 75. ## 0.1.27 * Don't throw an error when the `file` property is missing in SourceMapConsumer, we don't use it anyway. ## 0.1.26 * Fix SourceNode.fromStringWithSourceMap for empty maps. Fixes github issue 70. ## 0.1.25 * Make compatible with browserify ## 0.1.24 * Fix issue with absolute paths and `file://` URIs. See https://bugzilla.mozilla.org/show_bug.cgi?id=885597 ## 0.1.23 * Fix issue with absolute paths and sourcesContent, github issue 64. ## 0.1.22 * Ignore duplicate mappings in SourceMapGenerator. Fixes github issue 21. ## 0.1.21 * Fixed handling of sources that start with a slash so that they are relative to the source root's host. ## 0.1.20 * Fixed github issue #43: absolute URLs aren't joined with the source root anymore. ## 0.1.19 * Using Travis CI to run tests. ## 0.1.18 * Fixed a bug in the handling of sourceRoot. ## 0.1.17 * Added SourceNode.fromStringWithSourceMap. ## 0.1.16 * Added missing documentation. * Fixed the generating of empty mappings in SourceNode. ## 0.1.15 * Added SourceMapGenerator.applySourceMap. ## 0.1.14 * The sourceRoot is now handled consistently. ## 0.1.13 * Added SourceMapGenerator.fromSourceMap. ## 0.1.12 * SourceNode now generates empty mappings too. ## 0.1.11 * Added name support to SourceNode. ## 0.1.10 * Added sourcesContent support to the customer and generator. source-map-js-1.0.2/CONTRIBUTING.md000066400000000000000000000063451417156454300164520ustar00rootroot00000000000000# Contributing Thank you for your interest in contributing to this library! Contributions are very appreciated. -------------------------------------------------------------------------------- ## Table of Contents - [Filing Issues](#filing-issues) - [Building From Source](#building-from-source) - [Submitting Pull Requests](#submitting-pull-requests) - [Running Tests](#running-tests) - [Writing New Tests](#writing-new-tests) ## Filing Issues If you are filing an issue for a bug or other misbehavior, please provide: * **A test case.** The more minimal the better, but sometimes a larger test case cannot be helped. This should be in the form of a gist, node script, repository, etc. * **Steps to reproduce the bug.** The more exact and specific the better. * **The result you expected.** * **The actual result.** ## Building From Source Install Node.js and then run $ git clone https://github.com/mozilla/source-map.git $ cd source-map/ $ npm install Next, run $ npm run build This will create the following files: * `dist/source-map.js` - The plain browser build. * `dist/source-map.min.js` - The minified browser build. * `dist/source-map.min.js.map` - The source map for the minified browser build. * `dist/source-map.debug.js` - The debug browser build. * `dist/source-map.debug.js.map` - The source map for the debug browser build. * `dist/test/*` - These are the test files built for running as xpcshell unit tests within mozilla-central. ## Submitting Pull Requests Make sure that tests pass locally before creating a pull request. Use a feature branch and pull request for each change, with logical commits. If your reviewer asks you to make changes before the pull request is accepted, fixup your existing commit(s) rather than adding follow up commits, and then force push to the remote branch to update the pull request. ## Running Tests The test suite is written for node.js. Install node.js `0.10.0` or greater and then run the tests with `npm test`: ```shell $ npm test > source-map@0.5.0 test /Users/fitzgen/src/source-map > node test/run-tests.js 119 / 119 tests passed. ``` ## Writing New Tests To add new tests, create a new file named `test/test-your-new-test-name.js` and export your test functions with names that start with "test", for example: ```js exports["test issue #123: doing the foo bar"] = function (assert) { ... }; ``` The new tests will be located and run automatically when you run the full test suite. The `assert` argument is a cut down version of node's assert module. You have access to the following assertion functions: * `doesNotThrow` * `equal` * `ok` * `strictEqual` * `throws` (The reason for the restricted set of test functions is because we need the tests to run inside Firefox's test suite as well and Firefox has a shimmed version of the assert module.) There are additional test utilities and helpers in `./test/util.js` which you can use as well: ```js var util = require('./util'); ``` source-map-js-1.0.2/LICENSE000066400000000000000000000027661417156454300152310ustar00rootroot00000000000000 Copyright (c) 2009-2011, Mozilla Foundation and contributors All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the names of the Mozilla Foundation nor the names of project contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. source-map-js-1.0.2/README.md000066400000000000000000000622101417156454300154710ustar00rootroot00000000000000# Source Map JS [![NPM](https://nodei.co/npm/source-map-js.png?downloads=true&downloadRank=true)](https://www.npmjs.com/package/source-map-js) Difference between original [source-map](https://github.com/mozilla/source-map): > TL,DR: it's fork of original source-map@0.6, but with perfomance optimizations. This journey starts from [source-map@0.7.0](https://github.com/mozilla/source-map/blob/master/CHANGELOG.md#070). Some part of it was rewritten to Rust and WASM and API became async. It's still a major block for many libraries like PostCSS or Sass for example because they need to migrate the whole API to the async way. This is the reason why 0.6.1 has 2x more downloads than 0.7.3 while it's faster several times. ![Downloads count](media/downloads.png) More important that WASM version has some optimizations in JS code too. This is why [community asked to create branch for 0.6 version](https://github.com/mozilla/source-map/issues/324) and port these optimizations but, sadly, the answer was «no». A bit later I discovered [the issue](https://github.com/mozilla/source-map/issues/370) created by [Ben Rothman (@benthemonkey)](https://github.com/benthemonkey) with no response at all. [Roman Dvornov (@lahmatiy)](https://github.com/lahmatiy) wrote a [serveral posts](https://t.me/gorshochekvarit/76) (russian, only, sorry) about source-map library in his own Telegram channel. He mentioned the article [«Maybe you don't need Rust and WASM to speed up your JS»](https://mrale.ph/blog/2018/02/03/maybe-you-dont-need-rust-to-speed-up-your-js.html) written by [Vyacheslav Egorov (@mraleph)](https://github.com/mraleph). This article contains optimizations and hacks that lead to almost the same performance compare to WASM implementation. I decided to fork the original source-map and port these optimizations from the article and several others PR from the original source-map. --------- This is a library to generate and consume the source map format [described here][format]. [format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit ## Use with Node $ npm install source-map-js -------------------------------------------------------------------------------- ## Table of Contents - [Examples](#examples) - [Consuming a source map](#consuming-a-source-map) - [Generating a source map](#generating-a-source-map) - [With SourceNode (high level API)](#with-sourcenode-high-level-api) - [With SourceMapGenerator (low level API)](#with-sourcemapgenerator-low-level-api) - [API](#api) - [SourceMapConsumer](#sourcemapconsumer) - [new SourceMapConsumer(rawSourceMap)](#new-sourcemapconsumerrawsourcemap) - [SourceMapConsumer.prototype.computeColumnSpans()](#sourcemapconsumerprototypecomputecolumnspans) - [SourceMapConsumer.prototype.originalPositionFor(generatedPosition)](#sourcemapconsumerprototypeoriginalpositionforgeneratedposition) - [SourceMapConsumer.prototype.generatedPositionFor(originalPosition)](#sourcemapconsumerprototypegeneratedpositionfororiginalposition) - [SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)](#sourcemapconsumerprototypeallgeneratedpositionsfororiginalposition) - [SourceMapConsumer.prototype.hasContentsOfAllSources()](#sourcemapconsumerprototypehascontentsofallsources) - [SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])](#sourcemapconsumerprototypesourcecontentforsource-returnnullonmissing) - [SourceMapConsumer.prototype.eachMapping(callback, context, order)](#sourcemapconsumerprototypeeachmappingcallback-context-order) - [SourceMapGenerator](#sourcemapgenerator) - [new SourceMapGenerator([startOfSourceMap])](#new-sourcemapgeneratorstartofsourcemap) - [SourceMapGenerator.fromSourceMap(sourceMapConsumer)](#sourcemapgeneratorfromsourcemapsourcemapconsumer) - [SourceMapGenerator.prototype.addMapping(mapping)](#sourcemapgeneratorprototypeaddmappingmapping) - [SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)](#sourcemapgeneratorprototypesetsourcecontentsourcefile-sourcecontent) - [SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])](#sourcemapgeneratorprototypeapplysourcemapsourcemapconsumer-sourcefile-sourcemappath) - [SourceMapGenerator.prototype.toString()](#sourcemapgeneratorprototypetostring) - [SourceNode](#sourcenode) - [new SourceNode([line, column, source[, chunk[, name]]])](#new-sourcenodeline-column-source-chunk-name) - [SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])](#sourcenodefromstringwithsourcemapcode-sourcemapconsumer-relativepath) - [SourceNode.prototype.add(chunk)](#sourcenodeprototypeaddchunk) - [SourceNode.prototype.prepend(chunk)](#sourcenodeprototypeprependchunk) - [SourceNode.prototype.setSourceContent(sourceFile, sourceContent)](#sourcenodeprototypesetsourcecontentsourcefile-sourcecontent) - [SourceNode.prototype.walk(fn)](#sourcenodeprototypewalkfn) - [SourceNode.prototype.walkSourceContents(fn)](#sourcenodeprototypewalksourcecontentsfn) - [SourceNode.prototype.join(sep)](#sourcenodeprototypejoinsep) - [SourceNode.prototype.replaceRight(pattern, replacement)](#sourcenodeprototypereplacerightpattern-replacement) - [SourceNode.prototype.toString()](#sourcenodeprototypetostring) - [SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])](#sourcenodeprototypetostringwithsourcemapstartofsourcemap) ## Examples ### Consuming a source map ```js var rawSourceMap = { version: 3, file: 'min.js', names: ['bar', 'baz', 'n'], sources: ['one.js', 'two.js'], sourceRoot: 'http://example.com/www/js/', mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' }; var smc = new SourceMapConsumer(rawSourceMap); console.log(smc.sources); // [ 'http://example.com/www/js/one.js', // 'http://example.com/www/js/two.js' ] console.log(smc.originalPositionFor({ line: 2, column: 28 })); // { source: 'http://example.com/www/js/two.js', // line: 2, // column: 10, // name: 'n' } console.log(smc.generatedPositionFor({ source: 'http://example.com/www/js/two.js', line: 2, column: 10 })); // { line: 2, column: 28 } smc.eachMapping(function (m) { // ... }); ``` ### Generating a source map In depth guide: [**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/) #### With SourceNode (high level API) ```js function compile(ast) { switch (ast.type) { case 'BinaryExpression': return new SourceNode( ast.location.line, ast.location.column, ast.location.source, [compile(ast.left), " + ", compile(ast.right)] ); case 'Literal': return new SourceNode( ast.location.line, ast.location.column, ast.location.source, String(ast.value) ); // ... default: throw new Error("Bad AST"); } } var ast = parse("40 + 2", "add.js"); console.log(compile(ast).toStringWithSourceMap({ file: 'add.js' })); // { code: '40 + 2', // map: [object SourceMapGenerator] } ``` #### With SourceMapGenerator (low level API) ```js var map = new SourceMapGenerator({ file: "source-mapped.js" }); map.addMapping({ generated: { line: 10, column: 35 }, source: "foo.js", original: { line: 33, column: 2 }, name: "christopher" }); console.log(map.toString()); // '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}' ``` ## API Get a reference to the module: ```js // Node.js var sourceMap = require('source-map'); // Browser builds var sourceMap = window.sourceMap; // Inside Firefox const sourceMap = require("devtools/toolkit/sourcemap/source-map.js"); ``` ### SourceMapConsumer A SourceMapConsumer instance represents a parsed source map which we can query for information about the original file positions by giving it a file position in the generated source. #### new SourceMapConsumer(rawSourceMap) The only parameter is the raw source map (either as a string which can be `JSON.parse`'d, or an object). According to the spec, source maps have the following attributes: * `version`: Which version of the source map spec this map is following. * `sources`: An array of URLs to the original source files. * `names`: An array of identifiers which can be referenced by individual mappings. * `sourceRoot`: Optional. The URL root from which all sources are relative. * `sourcesContent`: Optional. An array of contents of the original source files. * `mappings`: A string of base64 VLQs which contain the actual mappings. * `file`: Optional. The generated filename this source map is associated with. ```js var consumer = new sourceMap.SourceMapConsumer(rawSourceMapJsonData); ``` #### SourceMapConsumer.prototype.computeColumnSpans() Compute the last column for each generated mapping. The last column is inclusive. ```js // Before: consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" }) // [ { line: 2, // column: 1 }, // { line: 2, // column: 10 }, // { line: 2, // column: 20 } ] consumer.computeColumnSpans(); // After: consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" }) // [ { line: 2, // column: 1, // lastColumn: 9 }, // { line: 2, // column: 10, // lastColumn: 19 }, // { line: 2, // column: 20, // lastColumn: Infinity } ] ``` #### SourceMapConsumer.prototype.originalPositionFor(generatedPosition) Returns the original source, line, and column information for the generated source's line and column positions provided. The only argument is an object with the following properties: * `line`: The line number in the generated source. Line numbers in this library are 1-based (note that the underlying source map specification uses 0-based line numbers -- this library handles the translation). * `column`: The column number in the generated source. Column numbers in this library are 0-based. * `bias`: Either `SourceMapConsumer.GREATEST_LOWER_BOUND` or `SourceMapConsumer.LEAST_UPPER_BOUND`. Specifies whether to return the closest element that is smaller than or greater than the one we are searching for, respectively, if the exact element cannot be found. Defaults to `SourceMapConsumer.GREATEST_LOWER_BOUND`. and an object is returned with the following properties: * `source`: The original source file, or null if this information is not available. * `line`: The line number in the original source, or null if this information is not available. The line number is 1-based. * `column`: The column number in the original source, or null if this information is not available. The column number is 0-based. * `name`: The original identifier, or null if this information is not available. ```js consumer.originalPositionFor({ line: 2, column: 10 }) // { source: 'foo.coffee', // line: 2, // column: 2, // name: null } consumer.originalPositionFor({ line: 99999999999999999, column: 999999999999999 }) // { source: null, // line: null, // column: null, // name: null } ``` #### SourceMapConsumer.prototype.generatedPositionFor(originalPosition) Returns the generated line and column information for the original source, line, and column positions provided. The only argument is an object with the following properties: * `source`: The filename of the original source. * `line`: The line number in the original source. The line number is 1-based. * `column`: The column number in the original source. The column number is 0-based. and an object is returned with the following properties: * `line`: The line number in the generated source, or null. The line number is 1-based. * `column`: The column number in the generated source, or null. The column number is 0-based. ```js consumer.generatedPositionFor({ source: "example.js", line: 2, column: 10 }) // { line: 1, // column: 56 } ``` #### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition) Returns all generated line and column information for the original source, line, and column provided. If no column is provided, returns all mappings corresponding to a either the line we are searching for or the next closest line that has any mappings. Otherwise, returns all mappings corresponding to the given line and either the column we are searching for or the next closest column that has any offsets. The only argument is an object with the following properties: * `source`: The filename of the original source. * `line`: The line number in the original source. The line number is 1-based. * `column`: Optional. The column number in the original source. The column number is 0-based. and an array of objects is returned, each with the following properties: * `line`: The line number in the generated source, or null. The line number is 1-based. * `column`: The column number in the generated source, or null. The column number is 0-based. ```js consumer.allGeneratedpositionsfor({ line: 2, source: "foo.coffee" }) // [ { line: 2, // column: 1 }, // { line: 2, // column: 10 }, // { line: 2, // column: 20 } ] ``` #### SourceMapConsumer.prototype.hasContentsOfAllSources() Return true if we have the embedded source content for every source listed in the source map, false otherwise. In other words, if this method returns `true`, then `consumer.sourceContentFor(s)` will succeed for every source `s` in `consumer.sources`. ```js // ... if (consumer.hasContentsOfAllSources()) { consumerReadyCallback(consumer); } else { fetchSources(consumer, consumerReadyCallback); } // ... ``` #### SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing]) Returns the original source content for the source provided. The only argument is the URL of the original source file. If the source content for the given source is not found, then an error is thrown. Optionally, pass `true` as the second param to have `null` returned instead. ```js consumer.sources // [ "my-cool-lib.clj" ] consumer.sourceContentFor("my-cool-lib.clj") // "..." consumer.sourceContentFor("this is not in the source map"); // Error: "this is not in the source map" is not in the source map consumer.sourceContentFor("this is not in the source map", true); // null ``` #### SourceMapConsumer.prototype.eachMapping(callback, context, order) Iterate over each mapping between an original source/line/column and a generated line/column in this source map. * `callback`: The function that is called with each mapping. Mappings have the form `{ source, generatedLine, generatedColumn, originalLine, originalColumn, name }` * `context`: Optional. If specified, this object will be the value of `this` every time that `callback` is called. * `order`: Either `SourceMapConsumer.GENERATED_ORDER` or `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over the mappings sorted by the generated file's line/column order or the original's source/line/column order, respectively. Defaults to `SourceMapConsumer.GENERATED_ORDER`. ```js consumer.eachMapping(function (m) { console.log(m); }) // ... // { source: 'illmatic.js', // generatedLine: 1, // generatedColumn: 0, // originalLine: 1, // originalColumn: 0, // name: null } // { source: 'illmatic.js', // generatedLine: 2, // generatedColumn: 0, // originalLine: 2, // originalColumn: 0, // name: null } // ... ``` ### SourceMapGenerator An instance of the SourceMapGenerator represents a source map which is being built incrementally. #### new SourceMapGenerator([startOfSourceMap]) You may pass an object with the following properties: * `file`: The filename of the generated source that this source map is associated with. * `sourceRoot`: A root for all relative URLs in this source map. * `skipValidation`: Optional. When `true`, disables validation of mappings as they are added. This can improve performance but should be used with discretion, as a last resort. Even then, one should avoid using this flag when running tests, if possible. ```js var generator = new sourceMap.SourceMapGenerator({ file: "my-generated-javascript-file.js", sourceRoot: "http://example.com/app/js/" }); ``` #### SourceMapGenerator.fromSourceMap(sourceMapConsumer) Creates a new `SourceMapGenerator` from an existing `SourceMapConsumer` instance. * `sourceMapConsumer` The SourceMap. ```js var generator = sourceMap.SourceMapGenerator.fromSourceMap(consumer); ``` #### SourceMapGenerator.prototype.addMapping(mapping) Add a single mapping from original source line and column to the generated source's line and column for this source map being created. The mapping object should have the following properties: * `generated`: An object with the generated line and column positions. * `original`: An object with the original line and column positions. * `source`: The original source file (relative to the sourceRoot). * `name`: An optional original token name for this mapping. ```js generator.addMapping({ source: "module-one.scm", original: { line: 128, column: 0 }, generated: { line: 3, column: 456 } }) ``` #### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent) Set the source content for an original source file. * `sourceFile` the URL of the original source file. * `sourceContent` the content of the source file. ```js generator.setSourceContent("module-one.scm", fs.readFileSync("path/to/module-one.scm")) ``` #### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]]) Applies a SourceMap for a source file to the SourceMap. Each mapping to the supplied source file is rewritten using the supplied SourceMap. Note: The resolution for the resulting mappings is the minimum of this map and the supplied map. * `sourceMapConsumer`: The SourceMap to be applied. * `sourceFile`: Optional. The filename of the source file. If omitted, sourceMapConsumer.file will be used, if it exists. Otherwise an error will be thrown. * `sourceMapPath`: Optional. The dirname of the path to the SourceMap to be applied. If relative, it is relative to the SourceMap. This parameter is needed when the two SourceMaps aren't in the same directory, and the SourceMap to be applied contains relative source paths. If so, those relative source paths need to be rewritten relative to the SourceMap. If omitted, it is assumed that both SourceMaps are in the same directory, thus not needing any rewriting. (Supplying `'.'` has the same effect.) #### SourceMapGenerator.prototype.toString() Renders the source map being generated to a string. ```js generator.toString() // '{"version":3,"sources":["module-one.scm"],"names":[],"mappings":"...snip...","file":"my-generated-javascript-file.js","sourceRoot":"http://example.com/app/js/"}' ``` ### SourceNode SourceNodes provide a way to abstract over interpolating and/or concatenating snippets of generated JavaScript source code, while maintaining the line and column information associated between those snippets and the original source code. This is useful as the final intermediate representation a compiler might use before outputting the generated JS and source map. #### new SourceNode([line, column, source[, chunk[, name]]]) * `line`: The original line number associated with this source node, or null if it isn't associated with an original line. The line number is 1-based. * `column`: The original column number associated with this source node, or null if it isn't associated with an original column. The column number is 0-based. * `source`: The original source's filename; null if no filename is provided. * `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see below. * `name`: Optional. The original identifier. ```js var node = new SourceNode(1, 2, "a.cpp", [ new SourceNode(3, 4, "b.cpp", "extern int status;\n"), new SourceNode(5, 6, "c.cpp", "std::string* make_string(size_t n);\n"), new SourceNode(7, 8, "d.cpp", "int main(int argc, char** argv) {}\n"), ]); ``` #### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath]) Creates a SourceNode from generated code and a SourceMapConsumer. * `code`: The generated code * `sourceMapConsumer` The SourceMap for the generated code * `relativePath` The optional path that relative sources in `sourceMapConsumer` should be relative to. ```js var consumer = new SourceMapConsumer(fs.readFileSync("path/to/my-file.js.map", "utf8")); var node = SourceNode.fromStringWithSourceMap(fs.readFileSync("path/to/my-file.js"), consumer); ``` #### SourceNode.prototype.add(chunk) Add a chunk of generated JS to this source node. * `chunk`: A string snippet of generated JS code, another instance of `SourceNode`, or an array where each member is one of those things. ```js node.add(" + "); node.add(otherNode); node.add([leftHandOperandNode, " + ", rightHandOperandNode]); ``` #### SourceNode.prototype.prepend(chunk) Prepend a chunk of generated JS to this source node. * `chunk`: A string snippet of generated JS code, another instance of `SourceNode`, or an array where each member is one of those things. ```js node.prepend("/** Build Id: f783haef86324gf **/\n\n"); ``` #### SourceNode.prototype.setSourceContent(sourceFile, sourceContent) Set the source content for a source file. This will be added to the `SourceMap` in the `sourcesContent` field. * `sourceFile`: The filename of the source file * `sourceContent`: The content of the source file ```js node.setSourceContent("module-one.scm", fs.readFileSync("path/to/module-one.scm")) ``` #### SourceNode.prototype.walk(fn) Walk over the tree of JS snippets in this node and its children. The walking function is called once for each snippet of JS and is passed that snippet and the its original associated source's line/column location. * `fn`: The traversal function. ```js var node = new SourceNode(1, 2, "a.js", [ new SourceNode(3, 4, "b.js", "uno"), "dos", [ "tres", new SourceNode(5, 6, "c.js", "quatro") ] ]); node.walk(function (code, loc) { console.log("WALK:", code, loc); }) // WALK: uno { source: 'b.js', line: 3, column: 4, name: null } // WALK: dos { source: 'a.js', line: 1, column: 2, name: null } // WALK: tres { source: 'a.js', line: 1, column: 2, name: null } // WALK: quatro { source: 'c.js', line: 5, column: 6, name: null } ``` #### SourceNode.prototype.walkSourceContents(fn) Walk over the tree of SourceNodes. The walking function is called for each source file content and is passed the filename and source content. * `fn`: The traversal function. ```js var a = new SourceNode(1, 2, "a.js", "generated from a"); a.setSourceContent("a.js", "original a"); var b = new SourceNode(1, 2, "b.js", "generated from b"); b.setSourceContent("b.js", "original b"); var c = new SourceNode(1, 2, "c.js", "generated from c"); c.setSourceContent("c.js", "original c"); var node = new SourceNode(null, null, null, [a, b, c]); node.walkSourceContents(function (source, contents) { console.log("WALK:", source, ":", contents); }) // WALK: a.js : original a // WALK: b.js : original b // WALK: c.js : original c ``` #### SourceNode.prototype.join(sep) Like `Array.prototype.join` except for SourceNodes. Inserts the separator between each of this source node's children. * `sep`: The separator. ```js var lhs = new SourceNode(1, 2, "a.rs", "my_copy"); var operand = new SourceNode(3, 4, "a.rs", "="); var rhs = new SourceNode(5, 6, "a.rs", "orig.clone()"); var node = new SourceNode(null, null, null, [ lhs, operand, rhs ]); var joinedNode = node.join(" "); ``` #### SourceNode.prototype.replaceRight(pattern, replacement) Call `String.prototype.replace` on the very right-most source snippet. Useful for trimming white space from the end of a source node, etc. * `pattern`: The pattern to replace. * `replacement`: The thing to replace the pattern with. ```js // Trim trailing white space. node.replaceRight(/\s*$/, ""); ``` #### SourceNode.prototype.toString() Return the string representation of this source node. Walks over the tree and concatenates all the various snippets together to one string. ```js var node = new SourceNode(1, 2, "a.js", [ new SourceNode(3, 4, "b.js", "uno"), "dos", [ "tres", new SourceNode(5, 6, "c.js", "quatro") ] ]); node.toString() // 'unodostresquatro' ``` #### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap]) Returns the string representation of this tree of source nodes, plus a SourceMapGenerator which contains all the mappings between the generated and original sources. The arguments are the same as those to `new SourceMapGenerator`. ```js var node = new SourceNode(1, 2, "a.js", [ new SourceNode(3, 4, "b.js", "uno"), "dos", [ "tres", new SourceNode(5, 6, "c.js", "quatro") ] ]); node.toStringWithSourceMap({ file: "my-output-file.js" }) // { code: 'unodostresquatro', // map: [object SourceMapGenerator] } ``` source-map-js-1.0.2/lib/000077500000000000000000000000001417156454300147575ustar00rootroot00000000000000source-map-js-1.0.2/lib/array-set.js000066400000000000000000000061751417156454300172350ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var util = require('./util'); var has = Object.prototype.hasOwnProperty; var hasNativeMap = typeof Map !== "undefined"; /** * A data structure which is a combination of an array and a set. Adding a new * member is O(1), testing for membership is O(1), and finding the index of an * element is O(1). Removing elements from the set is not supported. Only * strings are supported for membership. */ function ArraySet() { this._array = []; this._set = hasNativeMap ? new Map() : Object.create(null); } /** * Static method for creating ArraySet instances from an existing array. */ ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { var set = new ArraySet(); for (var i = 0, len = aArray.length; i < len; i++) { set.add(aArray[i], aAllowDuplicates); } return set; }; /** * Return how many unique items are in this ArraySet. If duplicates have been * added, than those do not count towards the size. * * @returns Number */ ArraySet.prototype.size = function ArraySet_size() { return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; }; /** * Add the given string to this set. * * @param String aStr */ ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { var sStr = hasNativeMap ? aStr : util.toSetString(aStr); var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); var idx = this._array.length; if (!isDuplicate || aAllowDuplicates) { this._array.push(aStr); } if (!isDuplicate) { if (hasNativeMap) { this._set.set(aStr, idx); } else { this._set[sStr] = idx; } } }; /** * Is the given string a member of this set? * * @param String aStr */ ArraySet.prototype.has = function ArraySet_has(aStr) { if (hasNativeMap) { return this._set.has(aStr); } else { var sStr = util.toSetString(aStr); return has.call(this._set, sStr); } }; /** * What is the index of the given string in the array? * * @param String aStr */ ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { if (hasNativeMap) { var idx = this._set.get(aStr); if (idx >= 0) { return idx; } } else { var sStr = util.toSetString(aStr); if (has.call(this._set, sStr)) { return this._set[sStr]; } } throw new Error('"' + aStr + '" is not in the set.'); }; /** * What is the element at the given index? * * @param Number aIdx */ ArraySet.prototype.at = function ArraySet_at(aIdx) { if (aIdx >= 0 && aIdx < this._array.length) { return this._array[aIdx]; } throw new Error('No element indexed by ' + aIdx); }; /** * Returns the array representation of this set (which has the proper indices * indicated by indexOf). Note that this is a copy of the internal array used * for storing the members so that no one can mess with internal state. */ ArraySet.prototype.toArray = function ArraySet_toArray() { return this._array.slice(); }; exports.ArraySet = ArraySet; source-map-js-1.0.2/lib/base64-vlq.js000066400000000000000000000111521417156454300172010ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause * * Based on the Base 64 VLQ implementation in Closure Compiler: * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java * * Copyright 2011 The Closure Compiler Authors. All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Google Inc. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ var base64 = require('./base64'); // A single base 64 digit can contain 6 bits of data. For the base 64 variable // length quantities we use in the source map spec, the first bit is the sign, // the next four bits are the actual value, and the 6th bit is the // continuation bit. The continuation bit tells us whether there are more // digits in this value following this digit. // // Continuation // | Sign // | | // V V // 101011 var VLQ_BASE_SHIFT = 5; // binary: 100000 var VLQ_BASE = 1 << VLQ_BASE_SHIFT; // binary: 011111 var VLQ_BASE_MASK = VLQ_BASE - 1; // binary: 100000 var VLQ_CONTINUATION_BIT = VLQ_BASE; /** * Converts from a two-complement value to a value where the sign bit is * placed in the least significant bit. For example, as decimals: * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) */ function toVLQSigned(aValue) { return aValue < 0 ? ((-aValue) << 1) + 1 : (aValue << 1) + 0; } /** * Converts to a two-complement value from a value where the sign bit is * placed in the least significant bit. For example, as decimals: * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 */ function fromVLQSigned(aValue) { var isNegative = (aValue & 1) === 1; var shifted = aValue >> 1; return isNegative ? -shifted : shifted; } /** * Returns the base 64 VLQ encoded value. */ exports.encode = function base64VLQ_encode(aValue) { var encoded = ""; var digit; var vlq = toVLQSigned(aValue); do { digit = vlq & VLQ_BASE_MASK; vlq >>>= VLQ_BASE_SHIFT; if (vlq > 0) { // There are still more digits in this value, so we must make sure the // continuation bit is marked. digit |= VLQ_CONTINUATION_BIT; } encoded += base64.encode(digit); } while (vlq > 0); return encoded; }; /** * Decodes the next base 64 VLQ value from the given string and returns the * value and the rest of the string via the out parameter. */ exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { var strLen = aStr.length; var result = 0; var shift = 0; var continuation, digit; do { if (aIndex >= strLen) { throw new Error("Expected more digits in base 64 VLQ value."); } digit = base64.decode(aStr.charCodeAt(aIndex++)); if (digit === -1) { throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); } continuation = !!(digit & VLQ_CONTINUATION_BIT); digit &= VLQ_BASE_MASK; result = result + (digit << shift); shift += VLQ_BASE_SHIFT; } while (continuation); aOutParam.value = fromVLQSigned(result); aOutParam.rest = aIndex; }; source-map-js-1.0.2/lib/base64.js000066400000000000000000000030041417156454300163760ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); /** * Encode an integer in the range of 0 to 63 to a single base 64 digit. */ exports.encode = function (number) { if (0 <= number && number < intToCharMap.length) { return intToCharMap[number]; } throw new TypeError("Must be between 0 and 63: " + number); }; /** * Decode a single base 64 character code digit to an integer. Returns -1 on * failure. */ exports.decode = function (charCode) { var bigA = 65; // 'A' var bigZ = 90; // 'Z' var littleA = 97; // 'a' var littleZ = 122; // 'z' var zero = 48; // '0' var nine = 57; // '9' var plus = 43; // '+' var slash = 47; // '/' var littleOffset = 26; var numberOffset = 52; // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ if (bigA <= charCode && charCode <= bigZ) { return (charCode - bigA); } // 26 - 51: abcdefghijklmnopqrstuvwxyz if (littleA <= charCode && charCode <= littleZ) { return (charCode - littleA + littleOffset); } // 52 - 61: 0123456789 if (zero <= charCode && charCode <= nine) { return (charCode - zero + numberOffset); } // 62: + if (charCode == plus) { return 62; } // 63: / if (charCode == slash) { return 63; } // Invalid base64 digit. return -1; }; source-map-js-1.0.2/lib/binary-search.js000066400000000000000000000102311417156454300200410ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ exports.GREATEST_LOWER_BOUND = 1; exports.LEAST_UPPER_BOUND = 2; /** * Recursive implementation of binary search. * * @param aLow Indices here and lower do not contain the needle. * @param aHigh Indices here and higher do not contain the needle. * @param aNeedle The element being searched for. * @param aHaystack The non-empty array being searched. * @param aCompare Function which takes two elements and returns -1, 0, or 1. * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the * closest element that is smaller than or greater than the one we are * searching for, respectively, if the exact element cannot be found. */ function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { // This function terminates when one of the following is true: // // 1. We find the exact element we are looking for. // // 2. We did not find the exact element, but we can return the index of // the next-closest element. // // 3. We did not find the exact element, and there is no next-closest // element than the one we are searching for, so we return -1. var mid = Math.floor((aHigh - aLow) / 2) + aLow; var cmp = aCompare(aNeedle, aHaystack[mid], true); if (cmp === 0) { // Found the element we are looking for. return mid; } else if (cmp > 0) { // Our needle is greater than aHaystack[mid]. if (aHigh - mid > 1) { // The element is in the upper half. return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); } // The exact needle element was not found in this haystack. Determine if // we are in termination case (3) or (2) and return the appropriate thing. if (aBias == exports.LEAST_UPPER_BOUND) { return aHigh < aHaystack.length ? aHigh : -1; } else { return mid; } } else { // Our needle is less than aHaystack[mid]. if (mid - aLow > 1) { // The element is in the lower half. return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); } // we are in termination case (3) or (2) and return the appropriate thing. if (aBias == exports.LEAST_UPPER_BOUND) { return mid; } else { return aLow < 0 ? -1 : aLow; } } } /** * This is an implementation of binary search which will always try and return * the index of the closest element if there is no exact hit. This is because * mappings between original and generated line/col pairs are single points, * and there is an implicit region between each of them, so a miss just means * that you aren't on the very start of a region. * * @param aNeedle The element you are looking for. * @param aHaystack The array that is being searched. * @param aCompare A function which takes the needle and an element in the * array and returns -1, 0, or 1 depending on whether the needle is less * than, equal to, or greater than the element, respectively. * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the * closest element that is smaller than or greater than the one we are * searching for, respectively, if the exact element cannot be found. * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. */ exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { if (aHaystack.length === 0) { return -1; } var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, aCompare, aBias || exports.GREATEST_LOWER_BOUND); if (index < 0) { return -1; } // We have found either the exact element, or the next-closest element than // the one we are searching for. However, there may be more than one such // element. Make sure we always return the smallest of these. while (index - 1 >= 0) { if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { break; } --index; } return index; }; source-map-js-1.0.2/lib/mapping-list.js000066400000000000000000000044431417156454300177260ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2014 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var util = require('./util'); /** * Determine whether mappingB is after mappingA with respect to generated * position. */ function generatedPositionAfter(mappingA, mappingB) { // Optimized for most common case var lineA = mappingA.generatedLine; var lineB = mappingB.generatedLine; var columnA = mappingA.generatedColumn; var columnB = mappingB.generatedColumn; return lineB > lineA || lineB == lineA && columnB >= columnA || util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; } /** * A data structure to provide a sorted view of accumulated mappings in a * performance conscious manner. It trades a neglibable overhead in general * case for a large speedup in case of mappings being added in order. */ function MappingList() { this._array = []; this._sorted = true; // Serves as infimum this._last = {generatedLine: -1, generatedColumn: 0}; } /** * Iterate through internal items. This method takes the same arguments that * `Array.prototype.forEach` takes. * * NOTE: The order of the mappings is NOT guaranteed. */ MappingList.prototype.unsortedForEach = function MappingList_forEach(aCallback, aThisArg) { this._array.forEach(aCallback, aThisArg); }; /** * Add the given source mapping. * * @param Object aMapping */ MappingList.prototype.add = function MappingList_add(aMapping) { if (generatedPositionAfter(this._last, aMapping)) { this._last = aMapping; this._array.push(aMapping); } else { this._sorted = false; this._array.push(aMapping); } }; /** * Returns the flat, sorted array of mappings. The mappings are sorted by * generated position. * * WARNING: This method returns internal data without copying, for * performance. The return value must NOT be mutated, and should be treated as * an immutable borrow. If you want to take ownership, you must make your own * copy. */ MappingList.prototype.toArray = function MappingList_toArray() { if (!this._sorted) { this._array.sort(util.compareByGeneratedPositionsInflated); this._sorted = true; } return this._array; }; exports.MappingList = MappingList; source-map-js-1.0.2/lib/quick-sort.js000066400000000000000000000077441417156454300174320ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ // It turns out that some (most?) JavaScript engines don't self-host // `Array.prototype.sort`. This makes sense because C++ will likely remain // faster than JS when doing raw CPU-intensive sorting. However, when using a // custom comparator function, calling back and forth between the VM's C++ and // JIT'd JS is rather slow *and* loses JIT type information, resulting in // worse generated code for the comparator function than would be optimal. In // fact, when sorting with a comparator, these costs outweigh the benefits of // sorting in C++. By using our own JS-implemented Quick Sort (below), we get // a ~3500ms mean speed-up in `bench/bench.html`. function SortTemplate(comparator) { /** * Swap the elements indexed by `x` and `y` in the array `ary`. * * @param {Array} ary * The array. * @param {Number} x * The index of the first item. * @param {Number} y * The index of the second item. */ function swap(ary, x, y) { var temp = ary[x]; ary[x] = ary[y]; ary[y] = temp; } /** * Returns a random integer within the range `low .. high` inclusive. * * @param {Number} low * The lower bound on the range. * @param {Number} high * The upper bound on the range. */ function randomIntInRange(low, high) { return Math.round(low + (Math.random() * (high - low))); } /** * The Quick Sort algorithm. * * @param {Array} ary * An array to sort. * @param {function} comparator * Function to use to compare two items. * @param {Number} p * Start index of the array * @param {Number} r * End index of the array */ function doQuickSort(ary, comparator, p, r) { // If our lower bound is less than our upper bound, we (1) partition the // array into two pieces and (2) recurse on each half. If it is not, this is // the empty array and our base case. if (p < r) { // (1) Partitioning. // // The partitioning chooses a pivot between `p` and `r` and moves all // elements that are less than or equal to the pivot to the before it, and // all the elements that are greater than it after it. The effect is that // once partition is done, the pivot is in the exact place it will be when // the array is put in sorted order, and it will not need to be moved // again. This runs in O(n) time. // Always choose a random pivot so that an input array which is reverse // sorted does not cause O(n^2) running time. var pivotIndex = randomIntInRange(p, r); var i = p - 1; swap(ary, pivotIndex, r); var pivot = ary[r]; // Immediately after `j` is incremented in this loop, the following hold // true: // // * Every element in `ary[p .. i]` is less than or equal to the pivot. // // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. for (var j = p; j < r; j++) { if (comparator(ary[j], pivot, false) <= 0) { i += 1; swap(ary, i, j); } } swap(ary, i + 1, j); var q = i + 1; // (2) Recurse on each half. doQuickSort(ary, comparator, p, q - 1); doQuickSort(ary, comparator, q + 1, r); } } return doQuickSort; } function cloneSort(comparator) { let template = SortTemplate.toString(); let templateFn = new Function(`return ${template}`)(); return templateFn(comparator); } /** * Sort the given array in-place with the given comparator function. * * @param {Array} ary * An array to sort. * @param {function} comparator * Function to use to compare two items. */ let sortCache = new WeakMap(); exports.quickSort = function (ary, comparator, start = 0) { let doQuickSort = sortCache.get(comparator); if (doQuickSort === void 0) { doQuickSort = cloneSort(comparator); sortCache.set(comparator, doQuickSort); } doQuickSort(ary, comparator, start, ary.length - 1); }; source-map-js-1.0.2/lib/source-map-consumer.js000066400000000000000000001210121417156454300212160ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var util = require('./util'); var binarySearch = require('./binary-search'); var ArraySet = require('./array-set').ArraySet; var base64VLQ = require('./base64-vlq'); var quickSort = require('./quick-sort').quickSort; function SourceMapConsumer(aSourceMap, aSourceMapURL) { var sourceMap = aSourceMap; if (typeof aSourceMap === 'string') { sourceMap = util.parseSourceMapInput(aSourceMap); } return sourceMap.sections != null ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL) : new BasicSourceMapConsumer(sourceMap, aSourceMapURL); } SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) { return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL); } /** * The version of the source mapping spec that we are consuming. */ SourceMapConsumer.prototype._version = 3; // `__generatedMappings` and `__originalMappings` are arrays that hold the // parsed mapping coordinates from the source map's "mappings" attribute. They // are lazily instantiated, accessed via the `_generatedMappings` and // `_originalMappings` getters respectively, and we only parse the mappings // and create these arrays once queried for a source location. We jump through // these hoops because there can be many thousands of mappings, and parsing // them is expensive, so we only want to do it if we must. // // Each object in the arrays is of the form: // // { // generatedLine: The line number in the generated code, // generatedColumn: The column number in the generated code, // source: The path to the original source file that generated this // chunk of code, // originalLine: The line number in the original source that // corresponds to this chunk of generated code, // originalColumn: The column number in the original source that // corresponds to this chunk of generated code, // name: The name of the original symbol which generated this chunk of // code. // } // // All properties except for `generatedLine` and `generatedColumn` can be // `null`. // // `_generatedMappings` is ordered by the generated positions. // // `_originalMappings` is ordered by the original positions. SourceMapConsumer.prototype.__generatedMappings = null; Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { configurable: true, enumerable: true, get: function () { if (!this.__generatedMappings) { this._parseMappings(this._mappings, this.sourceRoot); } return this.__generatedMappings; } }); SourceMapConsumer.prototype.__originalMappings = null; Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { configurable: true, enumerable: true, get: function () { if (!this.__originalMappings) { this._parseMappings(this._mappings, this.sourceRoot); } return this.__originalMappings; } }); SourceMapConsumer.prototype._charIsMappingSeparator = function SourceMapConsumer_charIsMappingSeparator(aStr, index) { var c = aStr.charAt(index); return c === ";" || c === ","; }; /** * Parse the mappings in a string in to a data structure which we can easily * query (the ordered arrays in the `this.__generatedMappings` and * `this.__originalMappings` properties). */ SourceMapConsumer.prototype._parseMappings = function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { throw new Error("Subclasses must implement _parseMappings"); }; SourceMapConsumer.GENERATED_ORDER = 1; SourceMapConsumer.ORIGINAL_ORDER = 2; SourceMapConsumer.GREATEST_LOWER_BOUND = 1; SourceMapConsumer.LEAST_UPPER_BOUND = 2; /** * Iterate over each mapping between an original source/line/column and a * generated line/column in this source map. * * @param Function aCallback * The function that is called with each mapping. * @param Object aContext * Optional. If specified, this object will be the value of `this` every * time that `aCallback` is called. * @param aOrder * Either `SourceMapConsumer.GENERATED_ORDER` or * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to * iterate over the mappings sorted by the generated file's line/column * order or the original's source/line/column order, respectively. Defaults to * `SourceMapConsumer.GENERATED_ORDER`. */ SourceMapConsumer.prototype.eachMapping = function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { var context = aContext || null; var order = aOrder || SourceMapConsumer.GENERATED_ORDER; var mappings; switch (order) { case SourceMapConsumer.GENERATED_ORDER: mappings = this._generatedMappings; break; case SourceMapConsumer.ORIGINAL_ORDER: mappings = this._originalMappings; break; default: throw new Error("Unknown order of iteration."); } var sourceRoot = this.sourceRoot; var boundCallback = aCallback.bind(context); var names = this._names; var sources = this._sources; var sourceMapURL = this._sourceMapURL; for (var i = 0, n = mappings.length; i < n; i++) { var mapping = mappings[i]; var source = mapping.source === null ? null : sources.at(mapping.source); source = util.computeSourceURL(sourceRoot, source, sourceMapURL); boundCallback({ source: source, generatedLine: mapping.generatedLine, generatedColumn: mapping.generatedColumn, originalLine: mapping.originalLine, originalColumn: mapping.originalColumn, name: mapping.name === null ? null : names.at(mapping.name) }); } }; /** * Returns all generated line and column information for the original source, * line, and column provided. If no column is provided, returns all mappings * corresponding to a either the line we are searching for or the next * closest line that has any mappings. Otherwise, returns all mappings * corresponding to the given line and either the column we are searching for * or the next closest column that has any offsets. * * The only argument is an object with the following properties: * * - source: The filename of the original source. * - line: The line number in the original source. The line number is 1-based. * - column: Optional. the column number in the original source. * The column number is 0-based. * * and an array of objects is returned, each with the following properties: * * - line: The line number in the generated source, or null. The * line number is 1-based. * - column: The column number in the generated source, or null. * The column number is 0-based. */ SourceMapConsumer.prototype.allGeneratedPositionsFor = function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { var line = util.getArg(aArgs, 'line'); // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping // returns the index of the closest mapping less than the needle. By // setting needle.originalColumn to 0, we thus find the last mapping for // the given line, provided such a mapping exists. var needle = { source: util.getArg(aArgs, 'source'), originalLine: line, originalColumn: util.getArg(aArgs, 'column', 0) }; needle.source = this._findSourceIndex(needle.source); if (needle.source < 0) { return []; } var mappings = []; var index = this._findMapping(needle, this._originalMappings, "originalLine", "originalColumn", util.compareByOriginalPositions, binarySearch.LEAST_UPPER_BOUND); if (index >= 0) { var mapping = this._originalMappings[index]; if (aArgs.column === undefined) { var originalLine = mapping.originalLine; // Iterate until either we run out of mappings, or we run into // a mapping for a different line than the one we found. Since // mappings are sorted, this is guaranteed to find all mappings for // the line we found. while (mapping && mapping.originalLine === originalLine) { mappings.push({ line: util.getArg(mapping, 'generatedLine', null), column: util.getArg(mapping, 'generatedColumn', null), lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) }); mapping = this._originalMappings[++index]; } } else { var originalColumn = mapping.originalColumn; // Iterate until either we run out of mappings, or we run into // a mapping for a different line than the one we were searching for. // Since mappings are sorted, this is guaranteed to find all mappings for // the line we are searching for. while (mapping && mapping.originalLine === line && mapping.originalColumn == originalColumn) { mappings.push({ line: util.getArg(mapping, 'generatedLine', null), column: util.getArg(mapping, 'generatedColumn', null), lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) }); mapping = this._originalMappings[++index]; } } } return mappings; }; exports.SourceMapConsumer = SourceMapConsumer; /** * A BasicSourceMapConsumer instance represents a parsed source map which we can * query for information about the original file positions by giving it a file * position in the generated source. * * The first parameter is the raw source map (either as a JSON string, or * already parsed to an object). According to the spec, source maps have the * following attributes: * * - version: Which version of the source map spec this map is following. * - sources: An array of URLs to the original source files. * - names: An array of identifiers which can be referrenced by individual mappings. * - sourceRoot: Optional. The URL root from which all sources are relative. * - sourcesContent: Optional. An array of contents of the original source files. * - mappings: A string of base64 VLQs which contain the actual mappings. * - file: Optional. The generated file this source map is associated with. * * Here is an example source map, taken from the source map spec[0]: * * { * version : 3, * file: "out.js", * sourceRoot : "", * sources: ["foo.js", "bar.js"], * names: ["src", "maps", "are", "fun"], * mappings: "AA,AB;;ABCDE;" * } * * The second parameter, if given, is a string whose value is the URL * at which the source map was found. This URL is used to compute the * sources array. * * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# */ function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) { var sourceMap = aSourceMap; if (typeof aSourceMap === 'string') { sourceMap = util.parseSourceMapInput(aSourceMap); } var version = util.getArg(sourceMap, 'version'); var sources = util.getArg(sourceMap, 'sources'); // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which // requires the array) to play nice here. var names = util.getArg(sourceMap, 'names', []); var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); var mappings = util.getArg(sourceMap, 'mappings'); var file = util.getArg(sourceMap, 'file', null); // Once again, Sass deviates from the spec and supplies the version as a // string rather than a number, so we use loose equality checking here. if (version != this._version) { throw new Error('Unsupported version: ' + version); } if (sourceRoot) { sourceRoot = util.normalize(sourceRoot); } sources = sources .map(String) // Some source maps produce relative source paths like "./foo.js" instead of // "foo.js". Normalize these first so that future comparisons will succeed. // See bugzil.la/1090768. .map(util.normalize) // Always ensure that absolute sources are internally stored relative to // the source root, if the source root is absolute. Not doing this would // be particularly problematic when the source root is a prefix of the // source (valid, but why??). See github issue #199 and bugzil.la/1188982. .map(function (source) { return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) ? util.relative(sourceRoot, source) : source; }); // Pass `true` below to allow duplicate names and sources. While source maps // are intended to be compressed and deduplicated, the TypeScript compiler // sometimes generates source maps with duplicates in them. See Github issue // #72 and bugzil.la/889492. this._names = ArraySet.fromArray(names.map(String), true); this._sources = ArraySet.fromArray(sources, true); this._absoluteSources = this._sources.toArray().map(function (s) { return util.computeSourceURL(sourceRoot, s, aSourceMapURL); }); this.sourceRoot = sourceRoot; this.sourcesContent = sourcesContent; this._mappings = mappings; this._sourceMapURL = aSourceMapURL; this.file = file; } BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; /** * Utility function to find the index of a source. Returns -1 if not * found. */ BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) { var relativeSource = aSource; if (this.sourceRoot != null) { relativeSource = util.relative(this.sourceRoot, relativeSource); } if (this._sources.has(relativeSource)) { return this._sources.indexOf(relativeSource); } // Maybe aSource is an absolute URL as returned by |sources|. In // this case we can't simply undo the transform. var i; for (i = 0; i < this._absoluteSources.length; ++i) { if (this._absoluteSources[i] == aSource) { return i; } } return -1; }; /** * Create a BasicSourceMapConsumer from a SourceMapGenerator. * * @param SourceMapGenerator aSourceMap * The source map that will be consumed. * @param String aSourceMapURL * The URL at which the source map can be found (optional) * @returns BasicSourceMapConsumer */ BasicSourceMapConsumer.fromSourceMap = function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) { var smc = Object.create(BasicSourceMapConsumer.prototype); var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); smc.sourceRoot = aSourceMap._sourceRoot; smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), smc.sourceRoot); smc.file = aSourceMap._file; smc._sourceMapURL = aSourceMapURL; smc._absoluteSources = smc._sources.toArray().map(function (s) { return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL); }); // Because we are modifying the entries (by converting string sources and // names to indices into the sources and names ArraySets), we have to make // a copy of the entry or else bad things happen. Shared mutable state // strikes again! See github issue #191. var generatedMappings = aSourceMap._mappings.toArray().slice(); var destGeneratedMappings = smc.__generatedMappings = []; var destOriginalMappings = smc.__originalMappings = []; for (var i = 0, length = generatedMappings.length; i < length; i++) { var srcMapping = generatedMappings[i]; var destMapping = new Mapping; destMapping.generatedLine = srcMapping.generatedLine; destMapping.generatedColumn = srcMapping.generatedColumn; if (srcMapping.source) { destMapping.source = sources.indexOf(srcMapping.source); destMapping.originalLine = srcMapping.originalLine; destMapping.originalColumn = srcMapping.originalColumn; if (srcMapping.name) { destMapping.name = names.indexOf(srcMapping.name); } destOriginalMappings.push(destMapping); } destGeneratedMappings.push(destMapping); } quickSort(smc.__originalMappings, util.compareByOriginalPositions); return smc; }; /** * The version of the source mapping spec that we are consuming. */ BasicSourceMapConsumer.prototype._version = 3; /** * The list of original sources. */ Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { get: function () { return this._absoluteSources.slice(); } }); /** * Provide the JIT with a nice shape / hidden class. */ function Mapping() { this.generatedLine = 0; this.generatedColumn = 0; this.source = null; this.originalLine = null; this.originalColumn = null; this.name = null; } /** * Parse the mappings in a string in to a data structure which we can easily * query (the ordered arrays in the `this.__generatedMappings` and * `this.__originalMappings` properties). */ const compareGenerated = util.compareByGeneratedPositionsDeflatedNoLine; function sortGenerated(array, start) { let l = array.length; let n = array.length - start; if (n <= 1) { return; } else if (n == 2) { let a = array[start]; let b = array[start + 1]; if (compareGenerated(a, b) > 0) { array[start] = b; array[start + 1] = a; } } else if (n < 20) { for (let i = start; i < l; i++) { for (let j = i; j > start; j--) { let a = array[j - 1]; let b = array[j]; if (compareGenerated(a, b) <= 0) { break; } array[j - 1] = b; array[j] = a; } } } else { quickSort(array, compareGenerated, start); } } BasicSourceMapConsumer.prototype._parseMappings = function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { var generatedLine = 1; var previousGeneratedColumn = 0; var previousOriginalLine = 0; var previousOriginalColumn = 0; var previousSource = 0; var previousName = 0; var length = aStr.length; var index = 0; var cachedSegments = {}; var temp = {}; var originalMappings = []; var generatedMappings = []; var mapping, str, segment, end, value; let subarrayStart = 0; while (index < length) { if (aStr.charAt(index) === ';') { generatedLine++; index++; previousGeneratedColumn = 0; sortGenerated(generatedMappings, subarrayStart); subarrayStart = generatedMappings.length; } else if (aStr.charAt(index) === ',') { index++; } else { mapping = new Mapping(); mapping.generatedLine = generatedLine; for (end = index; end < length; end++) { if (this._charIsMappingSeparator(aStr, end)) { break; } } str = aStr.slice(index, end); segment = []; while (index < end) { base64VLQ.decode(aStr, index, temp); value = temp.value; index = temp.rest; segment.push(value); } if (segment.length === 2) { throw new Error('Found a source, but no line and column'); } if (segment.length === 3) { throw new Error('Found a source and line, but no column'); } // Generated column. mapping.generatedColumn = previousGeneratedColumn + segment[0]; previousGeneratedColumn = mapping.generatedColumn; if (segment.length > 1) { // Original source. mapping.source = previousSource + segment[1]; previousSource += segment[1]; // Original line. mapping.originalLine = previousOriginalLine + segment[2]; previousOriginalLine = mapping.originalLine; // Lines are stored 0-based mapping.originalLine += 1; // Original column. mapping.originalColumn = previousOriginalColumn + segment[3]; previousOriginalColumn = mapping.originalColumn; if (segment.length > 4) { // Original name. mapping.name = previousName + segment[4]; previousName += segment[4]; } } generatedMappings.push(mapping); if (typeof mapping.originalLine === 'number') { let currentSource = mapping.source; while (originalMappings.length <= currentSource) { originalMappings.push(null); } if (originalMappings[currentSource] === null) { originalMappings[currentSource] = []; } originalMappings[currentSource].push(mapping); } } } sortGenerated(generatedMappings, subarrayStart); this.__generatedMappings = generatedMappings; for (var i = 0; i < originalMappings.length; i++) { if (originalMappings[i] != null) { quickSort(originalMappings[i], util.compareByOriginalPositionsNoSource); } } this.__originalMappings = [].concat(...originalMappings); }; /** * Find the mapping that best matches the hypothetical "needle" mapping that * we are searching for in the given "haystack" of mappings. */ BasicSourceMapConsumer.prototype._findMapping = function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, aColumnName, aComparator, aBias) { // To return the position we are searching for, we must first find the // mapping for the given position and then return the opposite position it // points to. Because the mappings are sorted, we can use binary search to // find the best mapping. if (aNeedle[aLineName] <= 0) { throw new TypeError('Line must be greater than or equal to 1, got ' + aNeedle[aLineName]); } if (aNeedle[aColumnName] < 0) { throw new TypeError('Column must be greater than or equal to 0, got ' + aNeedle[aColumnName]); } return binarySearch.search(aNeedle, aMappings, aComparator, aBias); }; /** * Compute the last column for each generated mapping. The last column is * inclusive. */ BasicSourceMapConsumer.prototype.computeColumnSpans = function SourceMapConsumer_computeColumnSpans() { for (var index = 0; index < this._generatedMappings.length; ++index) { var mapping = this._generatedMappings[index]; // Mappings do not contain a field for the last generated columnt. We // can come up with an optimistic estimate, however, by assuming that // mappings are contiguous (i.e. given two consecutive mappings, the // first mapping ends where the second one starts). if (index + 1 < this._generatedMappings.length) { var nextMapping = this._generatedMappings[index + 1]; if (mapping.generatedLine === nextMapping.generatedLine) { mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; continue; } } // The last mapping for each line spans the entire line. mapping.lastGeneratedColumn = Infinity; } }; /** * Returns the original source, line, and column information for the generated * source's line and column positions provided. The only argument is an object * with the following properties: * * - line: The line number in the generated source. The line number * is 1-based. * - column: The column number in the generated source. The column * number is 0-based. * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the * closest element that is smaller than or greater than the one we are * searching for, respectively, if the exact element cannot be found. * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. * * and an object is returned with the following properties: * * - source: The original source file, or null. * - line: The line number in the original source, or null. The * line number is 1-based. * - column: The column number in the original source, or null. The * column number is 0-based. * - name: The original identifier, or null. */ BasicSourceMapConsumer.prototype.originalPositionFor = function SourceMapConsumer_originalPositionFor(aArgs) { var needle = { generatedLine: util.getArg(aArgs, 'line'), generatedColumn: util.getArg(aArgs, 'column') }; var index = this._findMapping( needle, this._generatedMappings, "generatedLine", "generatedColumn", util.compareByGeneratedPositionsDeflated, util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) ); if (index >= 0) { var mapping = this._generatedMappings[index]; if (mapping.generatedLine === needle.generatedLine) { var source = util.getArg(mapping, 'source', null); if (source !== null) { source = this._sources.at(source); source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL); } var name = util.getArg(mapping, 'name', null); if (name !== null) { name = this._names.at(name); } return { source: source, line: util.getArg(mapping, 'originalLine', null), column: util.getArg(mapping, 'originalColumn', null), name: name }; } } return { source: null, line: null, column: null, name: null }; }; /** * Return true if we have the source content for every source in the source * map, false otherwise. */ BasicSourceMapConsumer.prototype.hasContentsOfAllSources = function BasicSourceMapConsumer_hasContentsOfAllSources() { if (!this.sourcesContent) { return false; } return this.sourcesContent.length >= this._sources.size() && !this.sourcesContent.some(function (sc) { return sc == null; }); }; /** * Returns the original source content. The only argument is the url of the * original source file. Returns null if no original source content is * available. */ BasicSourceMapConsumer.prototype.sourceContentFor = function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { if (!this.sourcesContent) { return null; } var index = this._findSourceIndex(aSource); if (index >= 0) { return this.sourcesContent[index]; } var relativeSource = aSource; if (this.sourceRoot != null) { relativeSource = util.relative(this.sourceRoot, relativeSource); } var url; if (this.sourceRoot != null && (url = util.urlParse(this.sourceRoot))) { // XXX: file:// URIs and absolute paths lead to unexpected behavior for // many users. We can help them out when they expect file:// URIs to // behave like it would if they were running a local HTTP server. See // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. var fileUriAbsPath = relativeSource.replace(/^file:\/\//, ""); if (url.scheme == "file" && this._sources.has(fileUriAbsPath)) { return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] } if ((!url.path || url.path == "/") && this._sources.has("/" + relativeSource)) { return this.sourcesContent[this._sources.indexOf("/" + relativeSource)]; } } // This function is used recursively from // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we // don't want to throw if we can't find the source - we just want to // return null, so we provide a flag to exit gracefully. if (nullOnMissing) { return null; } else { throw new Error('"' + relativeSource + '" is not in the SourceMap.'); } }; /** * Returns the generated line and column information for the original source, * line, and column positions provided. The only argument is an object with * the following properties: * * - source: The filename of the original source. * - line: The line number in the original source. The line number * is 1-based. * - column: The column number in the original source. The column * number is 0-based. * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the * closest element that is smaller than or greater than the one we are * searching for, respectively, if the exact element cannot be found. * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. * * and an object is returned with the following properties: * * - line: The line number in the generated source, or null. The * line number is 1-based. * - column: The column number in the generated source, or null. * The column number is 0-based. */ BasicSourceMapConsumer.prototype.generatedPositionFor = function SourceMapConsumer_generatedPositionFor(aArgs) { var source = util.getArg(aArgs, 'source'); source = this._findSourceIndex(source); if (source < 0) { return { line: null, column: null, lastColumn: null }; } var needle = { source: source, originalLine: util.getArg(aArgs, 'line'), originalColumn: util.getArg(aArgs, 'column') }; var index = this._findMapping( needle, this._originalMappings, "originalLine", "originalColumn", util.compareByOriginalPositions, util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) ); if (index >= 0) { var mapping = this._originalMappings[index]; if (mapping.source === needle.source) { return { line: util.getArg(mapping, 'generatedLine', null), column: util.getArg(mapping, 'generatedColumn', null), lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) }; } } return { line: null, column: null, lastColumn: null }; }; exports.BasicSourceMapConsumer = BasicSourceMapConsumer; /** * An IndexedSourceMapConsumer instance represents a parsed source map which * we can query for information. It differs from BasicSourceMapConsumer in * that it takes "indexed" source maps (i.e. ones with a "sections" field) as * input. * * The first parameter is a raw source map (either as a JSON string, or already * parsed to an object). According to the spec for indexed source maps, they * have the following attributes: * * - version: Which version of the source map spec this map is following. * - file: Optional. The generated file this source map is associated with. * - sections: A list of section definitions. * * Each value under the "sections" field has two fields: * - offset: The offset into the original specified at which this section * begins to apply, defined as an object with a "line" and "column" * field. * - map: A source map definition. This source map could also be indexed, * but doesn't have to be. * * Instead of the "map" field, it's also possible to have a "url" field * specifying a URL to retrieve a source map from, but that's currently * unsupported. * * Here's an example source map, taken from the source map spec[0], but * modified to omit a section which uses the "url" field. * * { * version : 3, * file: "app.js", * sections: [{ * offset: {line:100, column:10}, * map: { * version : 3, * file: "section.js", * sources: ["foo.js", "bar.js"], * names: ["src", "maps", "are", "fun"], * mappings: "AAAA,E;;ABCDE;" * } * }], * } * * The second parameter, if given, is a string whose value is the URL * at which the source map was found. This URL is used to compute the * sources array. * * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt */ function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) { var sourceMap = aSourceMap; if (typeof aSourceMap === 'string') { sourceMap = util.parseSourceMapInput(aSourceMap); } var version = util.getArg(sourceMap, 'version'); var sections = util.getArg(sourceMap, 'sections'); if (version != this._version) { throw new Error('Unsupported version: ' + version); } this._sources = new ArraySet(); this._names = new ArraySet(); var lastOffset = { line: -1, column: 0 }; this._sections = sections.map(function (s) { if (s.url) { // The url field will require support for asynchronicity. // See https://github.com/mozilla/source-map/issues/16 throw new Error('Support for url field in sections not implemented.'); } var offset = util.getArg(s, 'offset'); var offsetLine = util.getArg(offset, 'line'); var offsetColumn = util.getArg(offset, 'column'); if (offsetLine < lastOffset.line || (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { throw new Error('Section offsets must be ordered and non-overlapping.'); } lastOffset = offset; return { generatedOffset: { // The offset fields are 0-based, but we use 1-based indices when // encoding/decoding from VLQ. generatedLine: offsetLine + 1, generatedColumn: offsetColumn + 1 }, consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL) } }); } IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; /** * The version of the source mapping spec that we are consuming. */ IndexedSourceMapConsumer.prototype._version = 3; /** * The list of original sources. */ Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { get: function () { var sources = []; for (var i = 0; i < this._sections.length; i++) { for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { sources.push(this._sections[i].consumer.sources[j]); } } return sources; } }); /** * Returns the original source, line, and column information for the generated * source's line and column positions provided. The only argument is an object * with the following properties: * * - line: The line number in the generated source. The line number * is 1-based. * - column: The column number in the generated source. The column * number is 0-based. * * and an object is returned with the following properties: * * - source: The original source file, or null. * - line: The line number in the original source, or null. The * line number is 1-based. * - column: The column number in the original source, or null. The * column number is 0-based. * - name: The original identifier, or null. */ IndexedSourceMapConsumer.prototype.originalPositionFor = function IndexedSourceMapConsumer_originalPositionFor(aArgs) { var needle = { generatedLine: util.getArg(aArgs, 'line'), generatedColumn: util.getArg(aArgs, 'column') }; // Find the section containing the generated position we're trying to map // to an original position. var sectionIndex = binarySearch.search(needle, this._sections, function(needle, section) { var cmp = needle.generatedLine - section.generatedOffset.generatedLine; if (cmp) { return cmp; } return (needle.generatedColumn - section.generatedOffset.generatedColumn); }); var section = this._sections[sectionIndex]; if (!section) { return { source: null, line: null, column: null, name: null }; } return section.consumer.originalPositionFor({ line: needle.generatedLine - (section.generatedOffset.generatedLine - 1), column: needle.generatedColumn - (section.generatedOffset.generatedLine === needle.generatedLine ? section.generatedOffset.generatedColumn - 1 : 0), bias: aArgs.bias }); }; /** * Return true if we have the source content for every source in the source * map, false otherwise. */ IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = function IndexedSourceMapConsumer_hasContentsOfAllSources() { return this._sections.every(function (s) { return s.consumer.hasContentsOfAllSources(); }); }; /** * Returns the original source content. The only argument is the url of the * original source file. Returns null if no original source content is * available. */ IndexedSourceMapConsumer.prototype.sourceContentFor = function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { for (var i = 0; i < this._sections.length; i++) { var section = this._sections[i]; var content = section.consumer.sourceContentFor(aSource, true); if (content) { return content; } } if (nullOnMissing) { return null; } else { throw new Error('"' + aSource + '" is not in the SourceMap.'); } }; /** * Returns the generated line and column information for the original source, * line, and column positions provided. The only argument is an object with * the following properties: * * - source: The filename of the original source. * - line: The line number in the original source. The line number * is 1-based. * - column: The column number in the original source. The column * number is 0-based. * * and an object is returned with the following properties: * * - line: The line number in the generated source, or null. The * line number is 1-based. * - column: The column number in the generated source, or null. * The column number is 0-based. */ IndexedSourceMapConsumer.prototype.generatedPositionFor = function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { for (var i = 0; i < this._sections.length; i++) { var section = this._sections[i]; // Only consider this section if the requested source is in the list of // sources of the consumer. if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) { continue; } var generatedPosition = section.consumer.generatedPositionFor(aArgs); if (generatedPosition) { var ret = { line: generatedPosition.line + (section.generatedOffset.generatedLine - 1), column: generatedPosition.column + (section.generatedOffset.generatedLine === generatedPosition.line ? section.generatedOffset.generatedColumn - 1 : 0) }; return ret; } } return { line: null, column: null }; }; /** * Parse the mappings in a string in to a data structure which we can easily * query (the ordered arrays in the `this.__generatedMappings` and * `this.__originalMappings` properties). */ IndexedSourceMapConsumer.prototype._parseMappings = function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { this.__generatedMappings = []; this.__originalMappings = []; for (var i = 0; i < this._sections.length; i++) { var section = this._sections[i]; var sectionMappings = section.consumer._generatedMappings; for (var j = 0; j < sectionMappings.length; j++) { var mapping = sectionMappings[j]; var source = section.consumer._sources.at(mapping.source); source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL); this._sources.add(source); source = this._sources.indexOf(source); var name = null; if (mapping.name) { name = section.consumer._names.at(mapping.name); this._names.add(name); name = this._names.indexOf(name); } // The mappings coming from the consumer for the section have // generated positions relative to the start of the section, so we // need to offset them to be relative to the start of the concatenated // generated file. var adjustedMapping = { source: source, generatedLine: mapping.generatedLine + (section.generatedOffset.generatedLine - 1), generatedColumn: mapping.generatedColumn + (section.generatedOffset.generatedLine === mapping.generatedLine ? section.generatedOffset.generatedColumn - 1 : 0), originalLine: mapping.originalLine, originalColumn: mapping.originalColumn, name: name }; this.__generatedMappings.push(adjustedMapping); if (typeof adjustedMapping.originalLine === 'number') { this.__originalMappings.push(adjustedMapping); } } } quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); quickSort(this.__originalMappings, util.compareByOriginalPositions); }; exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; source-map-js-1.0.2/lib/source-map-generator.js000066400000000000000000000340241417156454300213570ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var base64VLQ = require('./base64-vlq'); var util = require('./util'); var ArraySet = require('./array-set').ArraySet; var MappingList = require('./mapping-list').MappingList; /** * An instance of the SourceMapGenerator represents a source map which is * being built incrementally. You may pass an object with the following * properties: * * - file: The filename of the generated source. * - sourceRoot: A root for all relative URLs in this source map. */ function SourceMapGenerator(aArgs) { if (!aArgs) { aArgs = {}; } this._file = util.getArg(aArgs, 'file', null); this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); this._skipValidation = util.getArg(aArgs, 'skipValidation', false); this._sources = new ArraySet(); this._names = new ArraySet(); this._mappings = new MappingList(); this._sourcesContents = null; } SourceMapGenerator.prototype._version = 3; /** * Creates a new SourceMapGenerator based on a SourceMapConsumer * * @param aSourceMapConsumer The SourceMap. */ SourceMapGenerator.fromSourceMap = function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { var sourceRoot = aSourceMapConsumer.sourceRoot; var generator = new SourceMapGenerator({ file: aSourceMapConsumer.file, sourceRoot: sourceRoot }); aSourceMapConsumer.eachMapping(function (mapping) { var newMapping = { generated: { line: mapping.generatedLine, column: mapping.generatedColumn } }; if (mapping.source != null) { newMapping.source = mapping.source; if (sourceRoot != null) { newMapping.source = util.relative(sourceRoot, newMapping.source); } newMapping.original = { line: mapping.originalLine, column: mapping.originalColumn }; if (mapping.name != null) { newMapping.name = mapping.name; } } generator.addMapping(newMapping); }); aSourceMapConsumer.sources.forEach(function (sourceFile) { var sourceRelative = sourceFile; if (sourceRoot !== null) { sourceRelative = util.relative(sourceRoot, sourceFile); } if (!generator._sources.has(sourceRelative)) { generator._sources.add(sourceRelative); } var content = aSourceMapConsumer.sourceContentFor(sourceFile); if (content != null) { generator.setSourceContent(sourceFile, content); } }); return generator; }; /** * Add a single mapping from original source line and column to the generated * source's line and column for this source map being created. The mapping * object should have the following properties: * * - generated: An object with the generated line and column positions. * - original: An object with the original line and column positions. * - source: The original source file (relative to the sourceRoot). * - name: An optional original token name for this mapping. */ SourceMapGenerator.prototype.addMapping = function SourceMapGenerator_addMapping(aArgs) { var generated = util.getArg(aArgs, 'generated'); var original = util.getArg(aArgs, 'original', null); var source = util.getArg(aArgs, 'source', null); var name = util.getArg(aArgs, 'name', null); if (!this._skipValidation) { this._validateMapping(generated, original, source, name); } if (source != null) { source = String(source); if (!this._sources.has(source)) { this._sources.add(source); } } if (name != null) { name = String(name); if (!this._names.has(name)) { this._names.add(name); } } this._mappings.add({ generatedLine: generated.line, generatedColumn: generated.column, originalLine: original != null && original.line, originalColumn: original != null && original.column, source: source, name: name }); }; /** * Set the source content for a source file. */ SourceMapGenerator.prototype.setSourceContent = function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { var source = aSourceFile; if (this._sourceRoot != null) { source = util.relative(this._sourceRoot, source); } if (aSourceContent != null) { // Add the source content to the _sourcesContents map. // Create a new _sourcesContents map if the property is null. if (!this._sourcesContents) { this._sourcesContents = Object.create(null); } this._sourcesContents[util.toSetString(source)] = aSourceContent; } else if (this._sourcesContents) { // Remove the source file from the _sourcesContents map. // If the _sourcesContents map is empty, set the property to null. delete this._sourcesContents[util.toSetString(source)]; if (Object.keys(this._sourcesContents).length === 0) { this._sourcesContents = null; } } }; /** * Applies the mappings of a sub-source-map for a specific source file to the * source map being generated. Each mapping to the supplied source file is * rewritten using the supplied source map. Note: The resolution for the * resulting mappings is the minimium of this map and the supplied map. * * @param aSourceMapConsumer The source map to be applied. * @param aSourceFile Optional. The filename of the source file. * If omitted, SourceMapConsumer's file property will be used. * @param aSourceMapPath Optional. The dirname of the path to the source map * to be applied. If relative, it is relative to the SourceMapConsumer. * This parameter is needed when the two source maps aren't in the same * directory, and the source map to be applied contains relative source * paths. If so, those relative source paths need to be rewritten * relative to the SourceMapGenerator. */ SourceMapGenerator.prototype.applySourceMap = function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { var sourceFile = aSourceFile; // If aSourceFile is omitted, we will use the file property of the SourceMap if (aSourceFile == null) { if (aSourceMapConsumer.file == null) { throw new Error( 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + 'or the source map\'s "file" property. Both were omitted.' ); } sourceFile = aSourceMapConsumer.file; } var sourceRoot = this._sourceRoot; // Make "sourceFile" relative if an absolute Url is passed. if (sourceRoot != null) { sourceFile = util.relative(sourceRoot, sourceFile); } // Applying the SourceMap can add and remove items from the sources and // the names array. var newSources = new ArraySet(); var newNames = new ArraySet(); // Find mappings for the "sourceFile" this._mappings.unsortedForEach(function (mapping) { if (mapping.source === sourceFile && mapping.originalLine != null) { // Check if it can be mapped by the source map, then update the mapping. var original = aSourceMapConsumer.originalPositionFor({ line: mapping.originalLine, column: mapping.originalColumn }); if (original.source != null) { // Copy mapping mapping.source = original.source; if (aSourceMapPath != null) { mapping.source = util.join(aSourceMapPath, mapping.source) } if (sourceRoot != null) { mapping.source = util.relative(sourceRoot, mapping.source); } mapping.originalLine = original.line; mapping.originalColumn = original.column; if (original.name != null) { mapping.name = original.name; } } } var source = mapping.source; if (source != null && !newSources.has(source)) { newSources.add(source); } var name = mapping.name; if (name != null && !newNames.has(name)) { newNames.add(name); } }, this); this._sources = newSources; this._names = newNames; // Copy sourcesContents of applied map. aSourceMapConsumer.sources.forEach(function (sourceFile) { var content = aSourceMapConsumer.sourceContentFor(sourceFile); if (content != null) { if (aSourceMapPath != null) { sourceFile = util.join(aSourceMapPath, sourceFile); } if (sourceRoot != null) { sourceFile = util.relative(sourceRoot, sourceFile); } this.setSourceContent(sourceFile, content); } }, this); }; /** * A mapping can have one of the three levels of data: * * 1. Just the generated position. * 2. The Generated position, original position, and original source. * 3. Generated and original position, original source, as well as a name * token. * * To maintain consistency, we validate that any new mapping being added falls * in to one of these categories. */ SourceMapGenerator.prototype._validateMapping = function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, aName) { // When aOriginal is truthy but has empty values for .line and .column, // it is most likely a programmer error. In this case we throw a very // specific error message to try to guide them the right way. // For example: https://github.com/Polymer/polymer-bundler/pull/519 if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') { throw new Error( 'original.line and original.column are not numbers -- you probably meant to omit ' + 'the original mapping entirely and only map the generated position. If so, pass ' + 'null for the original mapping instead of an object with empty or null values.' ); } if (aGenerated && 'line' in aGenerated && 'column' in aGenerated && aGenerated.line > 0 && aGenerated.column >= 0 && !aOriginal && !aSource && !aName) { // Case 1. return; } else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated && aOriginal && 'line' in aOriginal && 'column' in aOriginal && aGenerated.line > 0 && aGenerated.column >= 0 && aOriginal.line > 0 && aOriginal.column >= 0 && aSource) { // Cases 2 and 3. return; } else { throw new Error('Invalid mapping: ' + JSON.stringify({ generated: aGenerated, source: aSource, original: aOriginal, name: aName })); } }; /** * Serialize the accumulated mappings in to the stream of base 64 VLQs * specified by the source map format. */ SourceMapGenerator.prototype._serializeMappings = function SourceMapGenerator_serializeMappings() { var previousGeneratedColumn = 0; var previousGeneratedLine = 1; var previousOriginalColumn = 0; var previousOriginalLine = 0; var previousName = 0; var previousSource = 0; var result = ''; var next; var mapping; var nameIdx; var sourceIdx; var mappings = this._mappings.toArray(); for (var i = 0, len = mappings.length; i < len; i++) { mapping = mappings[i]; next = '' if (mapping.generatedLine !== previousGeneratedLine) { previousGeneratedColumn = 0; while (mapping.generatedLine !== previousGeneratedLine) { next += ';'; previousGeneratedLine++; } } else { if (i > 0) { if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { continue; } next += ','; } } next += base64VLQ.encode(mapping.generatedColumn - previousGeneratedColumn); previousGeneratedColumn = mapping.generatedColumn; if (mapping.source != null) { sourceIdx = this._sources.indexOf(mapping.source); next += base64VLQ.encode(sourceIdx - previousSource); previousSource = sourceIdx; // lines are stored 0-based in SourceMap spec version 3 next += base64VLQ.encode(mapping.originalLine - 1 - previousOriginalLine); previousOriginalLine = mapping.originalLine - 1; next += base64VLQ.encode(mapping.originalColumn - previousOriginalColumn); previousOriginalColumn = mapping.originalColumn; if (mapping.name != null) { nameIdx = this._names.indexOf(mapping.name); next += base64VLQ.encode(nameIdx - previousName); previousName = nameIdx; } } result += next; } return result; }; SourceMapGenerator.prototype._generateSourcesContent = function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { return aSources.map(function (source) { if (!this._sourcesContents) { return null; } if (aSourceRoot != null) { source = util.relative(aSourceRoot, source); } var key = util.toSetString(source); return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) ? this._sourcesContents[key] : null; }, this); }; /** * Externalize the source map. */ SourceMapGenerator.prototype.toJSON = function SourceMapGenerator_toJSON() { var map = { version: this._version, sources: this._sources.toArray(), names: this._names.toArray(), mappings: this._serializeMappings() }; if (this._file != null) { map.file = this._file; } if (this._sourceRoot != null) { map.sourceRoot = this._sourceRoot; } if (this._sourcesContents) { map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); } return map; }; /** * Render the source map being generated to a string. */ SourceMapGenerator.prototype.toString = function SourceMapGenerator_toString() { return JSON.stringify(this.toJSON()); }; exports.SourceMapGenerator = SourceMapGenerator; source-map-js-1.0.2/lib/source-node.js000066400000000000000000000327601417156454300175500ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator; var util = require('./util'); // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other // operating systems these days (capturing the result). var REGEX_NEWLINE = /(\r?\n)/; // Newline character code for charCodeAt() comparisons var NEWLINE_CODE = 10; // Private symbol for identifying `SourceNode`s when multiple versions of // the source-map library are loaded. This MUST NOT CHANGE across // versions! var isSourceNode = "$$$isSourceNode$$$"; /** * SourceNodes provide a way to abstract over interpolating/concatenating * snippets of generated JavaScript source code while maintaining the line and * column information associated with the original source code. * * @param aLine The original line number. * @param aColumn The original column number. * @param aSource The original source's filename. * @param aChunks Optional. An array of strings which are snippets of * generated JS, or other SourceNodes. * @param aName The original identifier. */ function SourceNode(aLine, aColumn, aSource, aChunks, aName) { this.children = []; this.sourceContents = {}; this.line = aLine == null ? null : aLine; this.column = aColumn == null ? null : aColumn; this.source = aSource == null ? null : aSource; this.name = aName == null ? null : aName; this[isSourceNode] = true; if (aChunks != null) this.add(aChunks); } /** * Creates a SourceNode from generated code and a SourceMapConsumer. * * @param aGeneratedCode The generated code * @param aSourceMapConsumer The SourceMap for the generated code * @param aRelativePath Optional. The path that relative sources in the * SourceMapConsumer should be relative to. */ SourceNode.fromStringWithSourceMap = function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { // The SourceNode we want to fill with the generated code // and the SourceMap var node = new SourceNode(); // All even indices of this array are one line of the generated code, // while all odd indices are the newlines between two adjacent lines // (since `REGEX_NEWLINE` captures its match). // Processed fragments are accessed by calling `shiftNextLine`. var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); var remainingLinesIndex = 0; var shiftNextLine = function() { var lineContents = getNextLine(); // The last line of a file might not have a newline. var newLine = getNextLine() || ""; return lineContents + newLine; function getNextLine() { return remainingLinesIndex < remainingLines.length ? remainingLines[remainingLinesIndex++] : undefined; } }; // We need to remember the position of "remainingLines" var lastGeneratedLine = 1, lastGeneratedColumn = 0; // The generate SourceNodes we need a code range. // To extract it current and last mapping is used. // Here we store the last mapping. var lastMapping = null; aSourceMapConsumer.eachMapping(function (mapping) { if (lastMapping !== null) { // We add the code from "lastMapping" to "mapping": // First check if there is a new line in between. if (lastGeneratedLine < mapping.generatedLine) { // Associate first line with "lastMapping" addMappingWithCode(lastMapping, shiftNextLine()); lastGeneratedLine++; lastGeneratedColumn = 0; // The remaining code is added without mapping } else { // There is no new line in between. // Associate the code between "lastGeneratedColumn" and // "mapping.generatedColumn" with "lastMapping" var nextLine = remainingLines[remainingLinesIndex] || ''; var code = nextLine.substr(0, mapping.generatedColumn - lastGeneratedColumn); remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - lastGeneratedColumn); lastGeneratedColumn = mapping.generatedColumn; addMappingWithCode(lastMapping, code); // No more remaining code, continue lastMapping = mapping; return; } } // We add the generated code until the first mapping // to the SourceNode without any mapping. // Each line is added as separate string. while (lastGeneratedLine < mapping.generatedLine) { node.add(shiftNextLine()); lastGeneratedLine++; } if (lastGeneratedColumn < mapping.generatedColumn) { var nextLine = remainingLines[remainingLinesIndex] || ''; node.add(nextLine.substr(0, mapping.generatedColumn)); remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn); lastGeneratedColumn = mapping.generatedColumn; } lastMapping = mapping; }, this); // We have processed all mappings. if (remainingLinesIndex < remainingLines.length) { if (lastMapping) { // Associate the remaining code in the current line with "lastMapping" addMappingWithCode(lastMapping, shiftNextLine()); } // and add the remaining lines without any mapping node.add(remainingLines.splice(remainingLinesIndex).join("")); } // Copy sourcesContent into SourceNode aSourceMapConsumer.sources.forEach(function (sourceFile) { var content = aSourceMapConsumer.sourceContentFor(sourceFile); if (content != null) { if (aRelativePath != null) { sourceFile = util.join(aRelativePath, sourceFile); } node.setSourceContent(sourceFile, content); } }); return node; function addMappingWithCode(mapping, code) { if (mapping === null || mapping.source === undefined) { node.add(code); } else { var source = aRelativePath ? util.join(aRelativePath, mapping.source) : mapping.source; node.add(new SourceNode(mapping.originalLine, mapping.originalColumn, source, code, mapping.name)); } } }; /** * Add a chunk of generated JS to this source node. * * @param aChunk A string snippet of generated JS code, another instance of * SourceNode, or an array where each member is one of those things. */ SourceNode.prototype.add = function SourceNode_add(aChunk) { if (Array.isArray(aChunk)) { aChunk.forEach(function (chunk) { this.add(chunk); }, this); } else if (aChunk[isSourceNode] || typeof aChunk === "string") { if (aChunk) { this.children.push(aChunk); } } else { throw new TypeError( "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk ); } return this; }; /** * Add a chunk of generated JS to the beginning of this source node. * * @param aChunk A string snippet of generated JS code, another instance of * SourceNode, or an array where each member is one of those things. */ SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { if (Array.isArray(aChunk)) { for (var i = aChunk.length-1; i >= 0; i--) { this.prepend(aChunk[i]); } } else if (aChunk[isSourceNode] || typeof aChunk === "string") { this.children.unshift(aChunk); } else { throw new TypeError( "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk ); } return this; }; /** * Walk over the tree of JS snippets in this node and its children. The * walking function is called once for each snippet of JS and is passed that * snippet and the its original associated source's line/column location. * * @param aFn The traversal function. */ SourceNode.prototype.walk = function SourceNode_walk(aFn) { var chunk; for (var i = 0, len = this.children.length; i < len; i++) { chunk = this.children[i]; if (chunk[isSourceNode]) { chunk.walk(aFn); } else { if (chunk !== '') { aFn(chunk, { source: this.source, line: this.line, column: this.column, name: this.name }); } } } }; /** * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between * each of `this.children`. * * @param aSep The separator. */ SourceNode.prototype.join = function SourceNode_join(aSep) { var newChildren; var i; var len = this.children.length; if (len > 0) { newChildren = []; for (i = 0; i < len-1; i++) { newChildren.push(this.children[i]); newChildren.push(aSep); } newChildren.push(this.children[i]); this.children = newChildren; } return this; }; /** * Call String.prototype.replace on the very right-most source snippet. Useful * for trimming whitespace from the end of a source node, etc. * * @param aPattern The pattern to replace. * @param aReplacement The thing to replace the pattern with. */ SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { var lastChild = this.children[this.children.length - 1]; if (lastChild[isSourceNode]) { lastChild.replaceRight(aPattern, aReplacement); } else if (typeof lastChild === 'string') { this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); } else { this.children.push(''.replace(aPattern, aReplacement)); } return this; }; /** * Set the source content for a source file. This will be added to the SourceMapGenerator * in the sourcesContent field. * * @param aSourceFile The filename of the source file * @param aSourceContent The content of the source file */ SourceNode.prototype.setSourceContent = function SourceNode_setSourceContent(aSourceFile, aSourceContent) { this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; }; /** * Walk over the tree of SourceNodes. The walking function is called for each * source file content and is passed the filename and source content. * * @param aFn The traversal function. */ SourceNode.prototype.walkSourceContents = function SourceNode_walkSourceContents(aFn) { for (var i = 0, len = this.children.length; i < len; i++) { if (this.children[i][isSourceNode]) { this.children[i].walkSourceContents(aFn); } } var sources = Object.keys(this.sourceContents); for (var i = 0, len = sources.length; i < len; i++) { aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); } }; /** * Return the string representation of this source node. Walks over the tree * and concatenates all the various snippets together to one string. */ SourceNode.prototype.toString = function SourceNode_toString() { var str = ""; this.walk(function (chunk) { str += chunk; }); return str; }; /** * Returns the string representation of this source node along with a source * map. */ SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { var generated = { code: "", line: 1, column: 0 }; var map = new SourceMapGenerator(aArgs); var sourceMappingActive = false; var lastOriginalSource = null; var lastOriginalLine = null; var lastOriginalColumn = null; var lastOriginalName = null; this.walk(function (chunk, original) { generated.code += chunk; if (original.source !== null && original.line !== null && original.column !== null) { if(lastOriginalSource !== original.source || lastOriginalLine !== original.line || lastOriginalColumn !== original.column || lastOriginalName !== original.name) { map.addMapping({ source: original.source, original: { line: original.line, column: original.column }, generated: { line: generated.line, column: generated.column }, name: original.name }); } lastOriginalSource = original.source; lastOriginalLine = original.line; lastOriginalColumn = original.column; lastOriginalName = original.name; sourceMappingActive = true; } else if (sourceMappingActive) { map.addMapping({ generated: { line: generated.line, column: generated.column } }); lastOriginalSource = null; sourceMappingActive = false; } for (var idx = 0, length = chunk.length; idx < length; idx++) { if (chunk.charCodeAt(idx) === NEWLINE_CODE) { generated.line++; generated.column = 0; // Mappings end at eol if (idx + 1 === length) { lastOriginalSource = null; sourceMappingActive = false; } else if (sourceMappingActive) { map.addMapping({ source: original.source, original: { line: original.line, column: original.column }, generated: { line: generated.line, column: generated.column }, name: original.name }); } } else { generated.column++; } } }); this.walkSourceContents(function (sourceFile, sourceContent) { map.setSourceContent(sourceFile, sourceContent); }); return { code: generated.code, map: map }; }; exports.SourceNode = SourceNode; source-map-js-1.0.2/lib/util.js000066400000000000000000000360531417156454300163010ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ /** * This is a helper function for getting values from parameter/options * objects. * * @param args The object we are extracting values from * @param name The name of the property we are getting. * @param defaultValue An optional value to return if the property is missing * from the object. If this is not specified and the property is missing, an * error will be thrown. */ function getArg(aArgs, aName, aDefaultValue) { if (aName in aArgs) { return aArgs[aName]; } else if (arguments.length === 3) { return aDefaultValue; } else { throw new Error('"' + aName + '" is a required argument.'); } } exports.getArg = getArg; var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/; var dataUrlRegexp = /^data:.+\,.+$/; function urlParse(aUrl) { var match = aUrl.match(urlRegexp); if (!match) { return null; } return { scheme: match[1], auth: match[2], host: match[3], port: match[4], path: match[5] }; } exports.urlParse = urlParse; function urlGenerate(aParsedUrl) { var url = ''; if (aParsedUrl.scheme) { url += aParsedUrl.scheme + ':'; } url += '//'; if (aParsedUrl.auth) { url += aParsedUrl.auth + '@'; } if (aParsedUrl.host) { url += aParsedUrl.host; } if (aParsedUrl.port) { url += ":" + aParsedUrl.port } if (aParsedUrl.path) { url += aParsedUrl.path; } return url; } exports.urlGenerate = urlGenerate; var MAX_CACHED_INPUTS = 32; /** * Takes some function `f(input) -> result` and returns a memoized version of * `f`. * * We keep at most `MAX_CACHED_INPUTS` memoized results of `f` alive. The * memoization is a dumb-simple, linear least-recently-used cache. */ function lruMemoize(f) { var cache = []; return function(input) { for (var i = 0; i < cache.length; i++) { if (cache[i].input === input) { var temp = cache[0]; cache[0] = cache[i]; cache[i] = temp; return cache[0].result; } } var result = f(input); cache.unshift({ input, result, }); if (cache.length > MAX_CACHED_INPUTS) { cache.pop(); } return result; }; } /** * Normalizes a path, or the path portion of a URL: * * - Replaces consecutive slashes with one slash. * - Removes unnecessary '.' parts. * - Removes unnecessary '/..' parts. * * Based on code in the Node.js 'path' core module. * * @param aPath The path or url to normalize. */ var normalize = lruMemoize(function normalize(aPath) { var path = aPath; var url = urlParse(aPath); if (url) { if (!url.path) { return aPath; } path = url.path; } var isAbsolute = exports.isAbsolute(path); // Split the path into parts between `/` characters. This is much faster than // using `.split(/\/+/g)`. var parts = []; var start = 0; var i = 0; while (true) { start = i; i = path.indexOf("/", start); if (i === -1) { parts.push(path.slice(start)); break; } else { parts.push(path.slice(start, i)); while (i < path.length && path[i] === "/") { i++; } } } for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { part = parts[i]; if (part === '.') { parts.splice(i, 1); } else if (part === '..') { up++; } else if (up > 0) { if (part === '') { // The first part is blank if the path is absolute. Trying to go // above the root is a no-op. Therefore we can remove all '..' parts // directly after the root. parts.splice(i + 1, up); up = 0; } else { parts.splice(i, 2); up--; } } } path = parts.join('/'); if (path === '') { path = isAbsolute ? '/' : '.'; } if (url) { url.path = path; return urlGenerate(url); } return path; }); exports.normalize = normalize; /** * Joins two paths/URLs. * * @param aRoot The root path or URL. * @param aPath The path or URL to be joined with the root. * * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a * scheme-relative URL: Then the scheme of aRoot, if any, is prepended * first. * - Otherwise aPath is a path. If aRoot is a URL, then its path portion * is updated with the result and aRoot is returned. Otherwise the result * is returned. * - If aPath is absolute, the result is aPath. * - Otherwise the two paths are joined with a slash. * - Joining for example 'http://' and 'www.example.com' is also supported. */ function join(aRoot, aPath) { if (aRoot === "") { aRoot = "."; } if (aPath === "") { aPath = "."; } var aPathUrl = urlParse(aPath); var aRootUrl = urlParse(aRoot); if (aRootUrl) { aRoot = aRootUrl.path || '/'; } // `join(foo, '//www.example.org')` if (aPathUrl && !aPathUrl.scheme) { if (aRootUrl) { aPathUrl.scheme = aRootUrl.scheme; } return urlGenerate(aPathUrl); } if (aPathUrl || aPath.match(dataUrlRegexp)) { return aPath; } // `join('http://', 'www.example.com')` if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { aRootUrl.host = aPath; return urlGenerate(aRootUrl); } var joined = aPath.charAt(0) === '/' ? aPath : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); if (aRootUrl) { aRootUrl.path = joined; return urlGenerate(aRootUrl); } return joined; } exports.join = join; exports.isAbsolute = function (aPath) { return aPath.charAt(0) === '/' || urlRegexp.test(aPath); }; /** * Make a path relative to a URL or another path. * * @param aRoot The root path or URL. * @param aPath The path or URL to be made relative to aRoot. */ function relative(aRoot, aPath) { if (aRoot === "") { aRoot = "."; } aRoot = aRoot.replace(/\/$/, ''); // It is possible for the path to be above the root. In this case, simply // checking whether the root is a prefix of the path won't work. Instead, we // need to remove components from the root one by one, until either we find // a prefix that fits, or we run out of components to remove. var level = 0; while (aPath.indexOf(aRoot + '/') !== 0) { var index = aRoot.lastIndexOf("/"); if (index < 0) { return aPath; } // If the only part of the root that is left is the scheme (i.e. http://, // file:///, etc.), one or more slashes (/), or simply nothing at all, we // have exhausted all components, so the path is not relative to the root. aRoot = aRoot.slice(0, index); if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { return aPath; } ++level; } // Make sure we add a "../" for each component we removed from the root. return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); } exports.relative = relative; var supportsNullProto = (function () { var obj = Object.create(null); return !('__proto__' in obj); }()); function identity (s) { return s; } /** * Because behavior goes wacky when you set `__proto__` on objects, we * have to prefix all the strings in our set with an arbitrary character. * * See https://github.com/mozilla/source-map/pull/31 and * https://github.com/mozilla/source-map/issues/30 * * @param String aStr */ function toSetString(aStr) { if (isProtoString(aStr)) { return '$' + aStr; } return aStr; } exports.toSetString = supportsNullProto ? identity : toSetString; function fromSetString(aStr) { if (isProtoString(aStr)) { return aStr.slice(1); } return aStr; } exports.fromSetString = supportsNullProto ? identity : fromSetString; function isProtoString(s) { if (!s) { return false; } var length = s.length; if (length < 9 /* "__proto__".length */) { return false; } if (s.charCodeAt(length - 1) !== 95 /* '_' */ || s.charCodeAt(length - 2) !== 95 /* '_' */ || s.charCodeAt(length - 3) !== 111 /* 'o' */ || s.charCodeAt(length - 4) !== 116 /* 't' */ || s.charCodeAt(length - 5) !== 111 /* 'o' */ || s.charCodeAt(length - 6) !== 114 /* 'r' */ || s.charCodeAt(length - 7) !== 112 /* 'p' */ || s.charCodeAt(length - 8) !== 95 /* '_' */ || s.charCodeAt(length - 9) !== 95 /* '_' */) { return false; } for (var i = length - 10; i >= 0; i--) { if (s.charCodeAt(i) !== 36 /* '$' */) { return false; } } return true; } /** * Comparator between two mappings where the original positions are compared. * * Optionally pass in `true` as `onlyCompareGenerated` to consider two * mappings with the same original source/line/column, but different generated * line and column the same. Useful when searching for a mapping with a * stubbed out mapping. */ function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { var cmp = strcmp(mappingA.source, mappingB.source); if (cmp !== 0) { return cmp; } cmp = mappingA.originalLine - mappingB.originalLine; if (cmp !== 0) { return cmp; } cmp = mappingA.originalColumn - mappingB.originalColumn; if (cmp !== 0 || onlyCompareOriginal) { return cmp; } cmp = mappingA.generatedColumn - mappingB.generatedColumn; if (cmp !== 0) { return cmp; } cmp = mappingA.generatedLine - mappingB.generatedLine; if (cmp !== 0) { return cmp; } return strcmp(mappingA.name, mappingB.name); } exports.compareByOriginalPositions = compareByOriginalPositions; function compareByOriginalPositionsNoSource(mappingA, mappingB, onlyCompareOriginal) { var cmp cmp = mappingA.originalLine - mappingB.originalLine; if (cmp !== 0) { return cmp; } cmp = mappingA.originalColumn - mappingB.originalColumn; if (cmp !== 0 || onlyCompareOriginal) { return cmp; } cmp = mappingA.generatedColumn - mappingB.generatedColumn; if (cmp !== 0) { return cmp; } cmp = mappingA.generatedLine - mappingB.generatedLine; if (cmp !== 0) { return cmp; } return strcmp(mappingA.name, mappingB.name); } exports.compareByOriginalPositionsNoSource = compareByOriginalPositionsNoSource; /** * Comparator between two mappings with deflated source and name indices where * the generated positions are compared. * * Optionally pass in `true` as `onlyCompareGenerated` to consider two * mappings with the same generated line and column, but different * source/name/original line and column the same. Useful when searching for a * mapping with a stubbed out mapping. */ function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { var cmp = mappingA.generatedLine - mappingB.generatedLine; if (cmp !== 0) { return cmp; } cmp = mappingA.generatedColumn - mappingB.generatedColumn; if (cmp !== 0 || onlyCompareGenerated) { return cmp; } cmp = strcmp(mappingA.source, mappingB.source); if (cmp !== 0) { return cmp; } cmp = mappingA.originalLine - mappingB.originalLine; if (cmp !== 0) { return cmp; } cmp = mappingA.originalColumn - mappingB.originalColumn; if (cmp !== 0) { return cmp; } return strcmp(mappingA.name, mappingB.name); } exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; function compareByGeneratedPositionsDeflatedNoLine(mappingA, mappingB, onlyCompareGenerated) { var cmp = mappingA.generatedColumn - mappingB.generatedColumn; if (cmp !== 0 || onlyCompareGenerated) { return cmp; } cmp = strcmp(mappingA.source, mappingB.source); if (cmp !== 0) { return cmp; } cmp = mappingA.originalLine - mappingB.originalLine; if (cmp !== 0) { return cmp; } cmp = mappingA.originalColumn - mappingB.originalColumn; if (cmp !== 0) { return cmp; } return strcmp(mappingA.name, mappingB.name); } exports.compareByGeneratedPositionsDeflatedNoLine = compareByGeneratedPositionsDeflatedNoLine; function strcmp(aStr1, aStr2) { if (aStr1 === aStr2) { return 0; } if (aStr1 === null) { return 1; // aStr2 !== null } if (aStr2 === null) { return -1; // aStr1 !== null } if (aStr1 > aStr2) { return 1; } return -1; } /** * Comparator between two mappings with inflated source and name strings where * the generated positions are compared. */ function compareByGeneratedPositionsInflated(mappingA, mappingB) { var cmp = mappingA.generatedLine - mappingB.generatedLine; if (cmp !== 0) { return cmp; } cmp = mappingA.generatedColumn - mappingB.generatedColumn; if (cmp !== 0) { return cmp; } cmp = strcmp(mappingA.source, mappingB.source); if (cmp !== 0) { return cmp; } cmp = mappingA.originalLine - mappingB.originalLine; if (cmp !== 0) { return cmp; } cmp = mappingA.originalColumn - mappingB.originalColumn; if (cmp !== 0) { return cmp; } return strcmp(mappingA.name, mappingB.name); } exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; /** * Strip any JSON XSSI avoidance prefix from the string (as documented * in the source maps specification), and then parse the string as * JSON. */ function parseSourceMapInput(str) { return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, '')); } exports.parseSourceMapInput = parseSourceMapInput; /** * Compute the URL of a source given the the source root, the source's * URL, and the source map's URL. */ function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) { sourceURL = sourceURL || ''; if (sourceRoot) { // This follows what Chrome does. if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') { sourceRoot += '/'; } // The spec says: // Line 4: An optional source root, useful for relocating source // files on a server or removing repeated values in the // “sources” entry. This value is prepended to the individual // entries in the “source” field. sourceURL = sourceRoot + sourceURL; } // Historically, SourceMapConsumer did not take the sourceMapURL as // a parameter. This mode is still somewhat supported, which is why // this code block is conditional. However, it's preferable to pass // the source map URL to SourceMapConsumer, so that this function // can implement the source URL resolution algorithm as outlined in // the spec. This block is basically the equivalent of: // new URL(sourceURL, sourceMapURL).toString() // ... except it avoids using URL, which wasn't available in the // older releases of node still supported by this library. // // The spec says: // If the sources are not absolute URLs after prepending of the // “sourceRoot”, the sources are resolved relative to the // SourceMap (like resolving script src in a html document). if (sourceMapURL) { var parsed = urlParse(sourceMapURL); if (!parsed) { throw new Error("sourceMapURL could not be parsed"); } if (parsed.path) { // Strip the last path component, but keep the "/". var index = parsed.path.lastIndexOf('/'); if (index >= 0) { parsed.path = parsed.path.substring(0, index + 1); } } sourceURL = join(urlGenerate(parsed), sourceURL); } return normalize(sourceURL); } exports.computeSourceURL = computeSourceURL; source-map-js-1.0.2/media/000077500000000000000000000000001417156454300152705ustar00rootroot00000000000000source-map-js-1.0.2/media/downloads.png000066400000000000000000005563521417156454300200100ustar00rootroot00000000000000PNG  IHDR)4 iCCPICC ProfileHVgXTNoދ &02C;@QD DaHPb * h;׷u=,Z1OFRxiWаp% @&y7oX^2oMk$cRH\ eLOa ) q3x1f̞@G tG@ux nCư/:i}n<w0%: 'S8G.q\#׉Í>x&^ »\r|!ߌǏ9.N%2 yr^qE] =H"j͉n0b"q%D@>ME"OR(K%RDSnP)Tq&՚HMVPoi4 ͂GKU.it#=NLG?K@`04vpFc3qA)/.-VJY+Qlrc7DG(bbb5bUbmbbLqCqBWć%H%8*ӑen`1/2YD&˝*`bu$%$M$%$$OII4ܥJݓ4G~94ι5gBzttt]O2J22I2[dZdeudd3ew^˚k5;7ѹP99rr]r |GN+(2m(PTWJVP4,즜G[yRES%H%GI*UZڡ:歶JA:EMS}BCS#DcFưffc-r;Dmv:NN ]TL7Awn<ZYYJ*1  XXsX(DU>Sk7dmhÄjdzN8'W|ng J.*.q. .c+]Ϻ<ݶ˻s<=V{\{xVz>x{ޥޏ/-lwR'}O| `, 8>!(QVPzPGhpDp}DSHIH_աdZI{9/ںh04"/bY,]Rѥ" !"?s|85(1#we]tYHuLIPulIpu\iHm|yhcBeD]I>I!M)Ȕ6/wa²e=|]~oH4GڕCzMFUƇcYY:+6vy%~%we*UW_g &jMZյk׹ۿ>iwB6< s^ٽ{޼܁!a`65ij*8 8yQϣQ8x~3Ҽy%5ͣݪ N*:%y4ti3ggGŝX|;.t_x˥g.[_>yJUՖkfךL_7~֛۬7{e{mۗ߹vwݞ{AFݏ? '{LxDIS5jgwߩYG܁y09yP/|99կ^]cco ʼ]Ǹ)''?|SȧϤSS_<<|3pBcc`0obalg͟G}åγmY~40}Q,+2h_k͞AwS`X( j1l8]D,^0R;gi&ȲeXIfMM*>F(iNx̠ASCIIScreenshotަ pHYs%%IR$iTXtXML:com.adobe.xmp 460 1228 Screenshot +v=iDOT(oBk@IDATx&U.|f 3$EP@^]\kq]1`BQW5/U*4+A2{+NosV+]OU=9ߙ~h+#x;fd[-r] @2Vh]D<`!gQGY9r񳩛1EJƷ9c%4(+;Oä㿎ÇCh` C.(`G9IheYM[rA6ِIC)p,ܦ- 9rJο6p򜰄95(%=Ri 3imҤ.LR}‰^= Vz{u|%}‰jpf|'3]/hRUafJOο *xT ee ȞiHT?5ƼO( iԚc %Gϊ rcr'TZj1r# gEKa1ow0[Aʭ,g7衽ˁUJ+ s#8 p36e?B֟  :' +4G%o9rQ-OgQVyx'l(3C=A*ߛWiKrj! 9̀"jѪ7!(uΕܱ#tC X!65,Z>v<6΀ҷ?/矜$g"t,/UD^ptlL'j o^W^ɿ3L^'ԃ\:_?KqgG0 L1?ň&]9ViTApb G403~_~̎ BP+( nS t f__rILapbSG1;H#`ӱϠOCr*JNv<R0\EeqL˖4 [$ϛ +àASvvM6x􅑎aЀo@x4 iOV 4Fx4 iO?FA~3 >Hm5/_?7B iAjӨ 9rbЀ0LRFMmύ!2\z ,UJpR\m@lVc(cƿꪫ\袋=etB8 mzd1_?,}҉3W?[wߣA;wwokMOH)rVu DF__ AJ?r^Kѐ?͌J$xtҩ]RGF^G^ 37SɤԦlJR7CWMYڐg Fǝ7CakMEmq+M>kr‰_( ɻ]R:k$ug_C 6u7h*ޚKm-jC-861woӟw޹8 o]Mn#lYo B7CoZԆ0}ɘ`yY@X"KjkYoȳ&U5!ZԆ<[plb ][`Emȳ&U5!ZԆ<[plb ][`Emȳ&U5!ZԆ<[plb ][`Emȳ&U5!ZԆ<[plb ][`Emȳ&U5!ZԆ<[plb ][`Emȳ&U5!ZԆ<[plb ][`Emȳ&U5!ZԆ<[plb ][`Emȳ&U5!ZԆ<[plb ][`Emȳ&U5!ZԆ<[plb ][`Emȳ&U5!ZԆ<[plb ][`Emȳ&U5!ZԆ<[plb ][`Emȳ&U5!ZԆ<[plb ][`Emȳ&U5!ZԆ<[plb ][`Emȳ&U5!ZԆ# fWr}'D>5PW6Yǖ}?l2W˗//~chIO|ғoy1K{uO X뭷A,k|9rx~#?+./ﰣtrO7/W\R.(/]ZNm˷w0xtȯK[ p^WpO. ]+1O} \@"k뿖=܃4Jﻘ/,i3w2>8:eͻIw]D;m7Y?_~ee3~Tyzy9eԎV*rrͫ~p^ }VVX!zȡ#7|k;Nwپ6ׯK̓ +/y&bzkfow}wso?;/Ǽ7p_9s@s7/[0ӂeYCQ{ڂz=xm//HXkz ]g>{?|_N~r畻n-4km1g|e2Z>A#grht-OF,{;Yw] Pu)mqk}q \Nw-YD)yO/Z[7'].SO>>b_rɯIJ[wڙfQ|晌?|ӟx ~-o9m҅kyah U=o- J}kdg:yC!Rɶo}q U=ohߢ6Z*7A [Ԇ\K%۾53T}ڐkd۷>޸@v7oQr-l Pu-jCm@{{оEmȵT[ho\ ;@yڷ J}kdg:yC!Rɶo}q U=ohߢ6Z*7A [Ԇ\K%۾53T}ڐkd۷>޸@v7oQr-l Pu-jCm@{{оEmȵT[ho\ ;@yڷ J}kdg:yC!Rɶo}q U=ohߢ6Z*7A [Ԇ\K%۾53T}ڐkd۷>޸@v7oQr-l Pu-jCm@{{оEmȵT[ho\ ;@yڷ J}kdg:yC!Rɶo}q U=ohߢ6Z*7A [Ԇ\K%۾53T}ڐkd۷>޸@v7oQr-l Pu-jCm@{{оEmȵT[ho\71P{ˀERGY9Wc}EnЃteM6)^{E ik>p*p6D{%iC*0Xe. $e_N?X>>S9̰Мte]*ܺr7s>[S?˩~~+= l$ǏCGRb,ZΈp|s0XeyH K6,5qWE҃y/e-+o3[/Co(s}f,>|,ڲk{(,[>>ڃ א3 +eq%2Z\d| < ΐw__[R>% ΐ/_ɹōI?4Itr6ƍIN?Y w-2p!^71Y+n-Kw- g 1N;-j'wCOzZq(|;YgU~5V_h,;>|C_J _k6%zgeѢEsq*o}[ HO["^}|.\|k[m]vi>Nl~M߶O٫=|K.8ebVxzpy_T6\QвqtI7*Y9rgSD?$1TYrLV=MX4Q PEn:ZkhH.׿Є uW-G?{"cQk-Z4[ZwaZ 9}kSvDf|#oC3?#ǧ_/OHq[L>Zk/t͖D>Oqfkk+Gu?r`F m_裏 HuIJN1=֚l.dA~~9'}.om|=\q8?ٺ뮫95?-Tήq7!*p ;|vϵ9=ASO9U?s9WQ܋>+G>Q}N3S^$Ll|N<{޳+q9Bg~1.cld"y-.=*)~ӃkέU$2 NlAIV ̂*wKKJ6rڤs+tfAɻ̿¥S%9oz`mҹ:]Ré7=h6 YPE.opTFN4Xtn,"yTpd#MM:Bg`T[*\z8US &[30 He-.=*)~ӃkέU$2 NlAa6,MNs/|I'gK.+mm~I/mU{/|㎢n+=9er{[?~-mEy_c3/e///绎@q 7ܰ7)7HwXN)!܍RH)r[h2}a3~ҥf[f's-;Hq%/뮻nn'he{[~믻^zzӟtg>SMuE_Q-ۯЂާ|_R6]Zz!>w|e]*KŹTK;CQ -ltʵ /ZzғTN\p}>.?_N] ?'7/37%Ci: tDtAz&9 MNs%栣/HK49AGD_hr>? ]/4}~}A^i: tDtAz&9 MNs%栣/HK49AGD_hr>? ]/4}~}A^i: tDtAz&9 MNs%栣/HK49AGD_hr>? ]/4}~}A^i: tDtAz&9 MNs%栣/HK49AGD_hj#3IW 6trC]c=ˇQg>ٲᦛ=/%-L=\wʻr{GVG~/l=o,ϣpTwnّhcj@u˭Qν7-XE<1eŊekv+w\./?F?f&/~ы낞-/d}J^ f-ض-H9av7yزY嚫}w7MXs!haٲ0EHzB4? 2#9P 9G![{/j!x0d`ѻ({Q>B?`šaX|,Dem3RG/rkzP%py$Uz$~Wf5oˑGN}otߏ6]BzGȿy4J&ovdycEtnCw#5s~NIw aFwc_2?~Boj ]ҥƒ21Ҭ5#C-%%5rç 6JrjF֚@ο9SG%vzvi -Ť[ba\r] @߬b㭷ʌ~ ?zIq'}Kemo_rm}(-pBC^6Z-fZS[ˁ@ ^S駟^-qFctH&{xBw8 %G>qbjw-O|e.Zp-Ie \\ C ""Ɇ.Ac3xk-(ۈ8?AdWUia|_ru'.#(W#_-oNIsʍ7b%Q+bAwC3<~n+ &kh+husM6.|3^{}You~/iVᾴ6~gmG>B9?#D-SW59~̋.,vP-=|LJxmFg[^{(-SLK'PoQD7z:4t?돟%㷬e)\i9^-GGf'C_Z__?tp3ȜϘͭ#)4rsɍ@93\h3ͰH[T׿4F7VCG/YC Ox|},mq}7lvk'H/+06~ q@m'[D#%$-^eC2ӣmRWkӣ7󣧕v_}CjR->ڸGg얛W|J%u_\k[ﳋoI9A/8]d3q:真y$=i[œN_A֚ыg}sfe߾{$EZ^~9>?"j[wi\ ,h)jo뭖RVO>gZ_/{k/:YJXkvwEyѲ柏a[^4/E_~w;N}mqrȡOqA^xh|6U B?,1C|/y捎/|!}93t4ۈÛsoG\ȁ3t4ۈÛ2~FCz_g?e@r2okh:5//M9l4$G |SFޔoh(қ;r6#ol4x HNFMY- ֟a6>|< 1 @]E ^^lXdAilPZK`gyb'iϟ]p$ϣ.G>0>v(9 u" _l:Z|^efBt Yg%qo~Bs/}8;wo]Hil"ك֑].4ė.}rY]u][z3 X1_<9,廫ŋghu&}r.sx?(1# 駟 gLp]g t!#Y~C@oα7 _8ArೠѾQ1X{Y^61!'oO=_*~ TSPMλ, 8loN9s?u ]{ݵEC6-*o!g&lfrw H3!ҥy~􋇛ŤEm٦%l~oſxuiǿ>OZBzYX eE\B??ɹ;,ݖKW2ZVghKftW-&.0Lzs#xz ?qW%\"yqE/|׾5Y8^Q[W"mp  ?nva'~b&h_") '|cCȭ4ӶGAW4pGs#ɲiy2>w-u$qg!%2Idits*$Ns9tU&.w?)"͍֓Ǯ$q>eHZĥΓ'YhȣxTy[3ח. zUW2icN;\~ӟprƙg I26 7ܨ/_/?яS_+.~a3d_qc%:w eK^&le{?w=}=U;7tz$n /7t|#|Ӎ7äcĭ'b= ]lI-޸|WVL3xԧzxۋM8;U!F&={_k|Uy^&OO$}#-lX?M0>h ?Gcd?N<0_JvaÁ;yW 69DŽ%)A6-yae gj*(%NPvԆwTF@N_*WdXs-Y/ۿ}z}%?w-`grgO >?wSiUiIO|in_K~c@e뭷n}?]s|+f_DZ1dzˮ;}aWG]j|>g1 Z'XDBf=$Z^efoǁwRZwe7ϥ#|3[t}l_ GB'>ќ64mC/+fG5Asݛ*u?K 33&qO3vvxۢ_5@h7f[V@Gqգ&jpE_s$9YtGTN8"wTUƸQ(ռNȝk$'1+.Xc\(j 'X䎑**>W= w 3~͑8fEkR;1RwVGTN8"wƯ9ǬhcqգPy'`;FΪtXc\(j 'X5GM|1zJ5,rHYkR;Hr邏5UBpE;cqգPy'`;INcV4]ƸQ(ռN#U~gU:|1zJ5,rħ;V[YUBmfqfeT.Ʌoa*Zh!У~(W˿sҀ[c5ˣ&駗\|ʺk{޹eì^S9rsz;U|kȷe/˘ek_zMYx@IDAT/7J=y-o;lslW\V0sl;٨{ 0+K9>{ֳf cmҥr3gB_~eeުa1xr/=B(.R~sptÈfK prWJ?k|܏Џ(qsUWYrr7nEP7p}yw*B{ҝzo[O~Rh׾b!ˆwkuVwɬ|ӟ)?)l!YB ڇ#Cw>k|t?&5/9rql@}(&Oa%(gyٕDU7 s#/|~Pzh3*uayZ|^3mIh5҉۽,oy[˵?D /-I wkXe-E/uE/a! +B(+_ʗKcRQ~H?!s&6Z\%dY܉Daſ+ZgG2*`v)-:qrrϢ|z(K;G2y B,ٰp}{Sc|rzu'y#(I'j9xђ: ۿG5&Az8C__oMxcB&-BuWZ,maWiN@K0YY9r87ߜ|j /\eM^MXE0 rh I9}$5||ߤ1kh椏 ى;lC qh8A31de( fճZ^Z. G#矜 ƧH*qz̐#ϿvORC'?w=)#6ukc2:~)MUrgbѥe#M6ݴ~׻OnS+>ϫ?B166^L;H?Vx-N?E[˖[m]M fU@Zޕ7ضj0B7т) /hg?-X~!>e1=yuVhBR[ɞ^N[+}[nM?!B^Vgr{Ui\4&7A=y峟L ӝyvFH@pC‹nTw^ Iu ٹMUdsWy7#$&7d箪:n4U FHMn]Uuh Tܐ T5!A6!;wUApj0BlRpCv:FS`٤:Uu^ Iu ٹMUdsWy7#$&7d箪:n4U FHMn]Uuh Tܐ T5!A6!;wUApj0BlRpCv:FS`٤:Uu^ Iu ٹMUdsWy7#$&7d箪:n4U FHMn]Uuh Tܐ T5!A6!;wUApj0BlRpCv:FS`٤:Uu^ Iu ٹMUdsWy7#$&7d箪:n4U FHMn]Uuh Tܐ T5!A6!;wUAp;Di[nr$.LJ&= lD*e8 RCOoi!HJ&= G¤i[nFRCOoi:;Lzt:wێ.˖-&mCOoi!ȾS+e8tzi[ntLtC.^2MzzK @Ai[nRCOoi!>ӕ2MzzK @x=T4q-M7uRCOoi!HJ&= NW4q-M7P)ġ4dJ&= ]*e8:])ġ4CLtC}P+e8tzi[ntLtC.^2MzzK @Ai[nRCOoi!>ӕ2MzzK @x=T4q-M7uRCOoi!HJ&= NW4q-M7P)ġ4dJ&= ]*e8Vh70[8 p36e?Ÿi]}5)'"NJ?4p6ouѳs[dgs̀9ss7=IY/y/?}cV]"i-}xx{8VH߂f~+^¿t T4z[~,ᥥH<2~s7?y돼7ʉ.oyIylw2q͍ o^5{Buj/j;p1ŀ7L:? &* "nS D&B3Dܦ Lą4*f M1# iTApb G40Ҩ !6@$h`".QA0CmHD\HP '|r'?YNBl{=е/XI&BZApb G40Ҩ !6@$h`".QA0CmHD\H`m$yq$z怛gKy-@ꝛnϖ#&[&;7-GMLwn>[$ϛHm5/eт UwU_G*%8I6Q d1{[f|X2PY9hCipӽpuqcvMs %9 Ie(}##Ͽyo^M4Safjx~q6wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC-861wo ֢6قcsf*ޚKm-jC3u\!$χܣ=IJnoDeQ2$9r7?ym๑pMҼ@y{T5BwdH>+5\y9YXe9 =Hm?a撃|D!R<3d|r37_CAgv濞Q3,Q!| )0\Lb@Ákȹgv9r&^s3dbCy$r7ɹōIN?Y 9ܦ-2tyswZftOZ7;PI7rZ?/&~uC R9߂ӆ>9 /? ]/4}~}A^i: tDtAz&9 MNs%栣/HK49AGD_hr>? ]/4}~}A^i: tDtAz&9 MNs%栣/HK49AGD_hr>? ]/4}~}A^i: tDtAz&9 MNs%栣/HK49AGD_hr>? ]/4}~}A^i: tDtAz&9 MNs%栣/HK45-af a. ąaZF#O44]{-#KgVLjI`aPX%.$A%Ul&?76Hgcogi۳2CH7_gV%vfz={kM //Ǐ3%m.i ç 6Jr|o)1.i O?>udQO?T4JjILOEҐv94O?93Ls|)Ev_=e[[,h_{ϿnP.^KsDIP" 0죷&A6d9 :4gf Æ?NBJM8 i c*(wrM+Z- ky'PRj5KJǏ4$*-5ƼO( iԚc %Gϊ rc8a>[٣ozmC{m^by+A=+qW4Oa%(gySnHTu07JPhleժ}(VTFX Y-y/ 5 ĄVB{Vxr&yvmFBz6VBq;&lv;,擾I{ngE{sG39K<#3+\u;|ןlQ) vDKDi,gAW?Ch?immh S00]^#YgA^3`-(Fg]^lQ4FM%51Kbh,רQ"b""|?3s3;{w|=n<;s7nr=x"?)(CA{žE B__G/? _偛iFTSf;cHS$GF9h1$P$M [{Gʒnt!|'׿1T7^L$QTnL6Fŵt{/_'J򬡲?iL/_7,`"I"}LoDiB ^s·—o^q(\O;u wVbGW/-ZhJr5Ul=O+2|'?R4תá)^Z#ڄoszm\iM[O=ӊO?-R,̜y&gA$kg&E d%m"#&?񗆸 usrD?͗3+%Py9!NrNr/\%~3qR ">%罅 dDr};Kr%ehI4W~>\ I&W?V9EY$/?O ,k'?>3t5Wn>78RNo!B(?0=65|T]RJKD[ajJ0`Ms9MsCX |O&u0`ӴT*i|Q騕\'?eYOjK VRE`rKVr\g=/ D+XMKUv)cKnbSyxK*,bY‹\RzQ*lIC`(?OWnWUsAEOrC\/+lӠ\'? iUAE߹DWnPIyOXpHlk{_yOg.$(-s+=IS.k|{Vcڸ10"ڜ s7Ikjt^7UM>>2>lakCNۿ_ƏrJXW/;BeNy6 /_hr"EFcC_Ű~P<㌰J+¯"矖o/-mńGÜs߯_p5W_r_{?N3MNK[N@lĈafSuB EGGG𥴪$mOFFOr1> -0*O m{W3ra%Iߡ}rZ#`"Tھ_DɁ-0*O m%et9FIJ5'C?.#IA)Ã8&B%mߍ7.0>i_h[`e]&D2䟈&u<~:?8h$Nz?Pq\\$O2wŀhy!ovuᬳV^y娜*1K mx 'dnI__"rc=CO . ׿NJXR~zd@IDAT1I\$hGJV qLJC[ġ|p@j$-0*O m amN7]x}ߤ)/R {lXeM;@[n }ɐ7AkK,^i'.HCO c`>[w0 :Fl> O2I㥊T'IiQ5Ѭͻ+›oZj&f@5*o>e.N$d ׿5\~a 0]eB|MSye 8S 7ue`;[o?zd&vjo&̹Pw7|'x_.tF٦,NXb{]wV}٨0w .nV${G0[w}>f_-" yp!ͶؼcZh w<4*m݋/$bA5>)Qh!ۨ9nzz.COjg>鈆0Ou? /xҥ o?,p0^8|?}Y9=G@ߙQsly~VX~~1&X끃^rylR]vd=/ ~zXs5হI ܊l{jᚿI9; 19Of> YÌ34|Y1WD7?bc JOH[%;u[y7~wsw8B׮]7߬91RFҲ~M_?a\L=5 ?oq_RO6lXh؆rX-x#κ*w3OqspX`}ָ>?(7t<ڏt:h +ӋSO=5t K.T aY^ .E9{py燩r&gd m2rt5,w^RfAԷF{OlN?unv6-@O){~:p߽]w%I#8S~8noÕW^?: ig|s'6}Axe^CV[^:V[0b3N sYkT C\$VF,\s0/< }VF0 1m2f'¾ =x*?QZSalo"Ԙ+z z>vm{@R)4& UkjDG*6 5UPu:#JN*RQZӊd֑ME%BMl(TiE]NHŦS Tִ.YubSQɩPS[* UkZQ:RT-5KiTTr*TB՚V%봎Tl**9j`KEjM+uZG*6 5UPu:#JN*RQZӊd֑ME%BMl(TiE]NHŦS Tִ.Yubh谡a60Fak^yp}aïBK šŢ'vc,)NS[* UkZQ:R>u!t݈J{AI.ͫLⴎTl**9j`KEjM+j$sݵfxY=4oɩPS3(Tj'?|lhMHq!F/t@ՠfXaez2n ,LI>8RMS Tִ.Y-ɡx1O<ϭ"Y45JB՚Ѿ[W%['̛RWm„ˮF}_BIͰ5UFgX!j\xWޏ90ˏ~\sZ@ԯM˺0RVBTjF}ca-IԭWsSrES3(TjL*i!(-AMͰPU3;#JN*RQZӊd֑ME%BMl(TiE]NHŦS Tִ.YubSQɩPS[* UkZQ:RT-5KiTTr*TB՚V%%y>:̮ ˅C;q_~w ~w i5}vQGH!Ad dR~TV[mڅgbj0NJ3#hgđђoi`KEjM+-ªaf dyKNa%DjMUaiI0[km@^h'/0ӃTΦq/&lVaРv&) g\cX||7@M A1k\Hk`]SD(%4y5UIRBF 5J"oּF@Z뚪$F)itWXT%7J Mk^@ uMUy4Qi k5Q *QJh(5UIRBӚ(Hk`]SD(%4j@Z뚪$F)ik5J"oFwFyaF۽<41l^Jc=˜cÁzRY5y4Qi k5"ӧOZ+>LG}k$F)kHXT%1Fwp#K,Dk,5UI7`'̟'#G~WJ>ߤMrGꚪ$F)Yi kUGqd{ܱur0uMUyдf5 XT%7J M%*QJhZi k]Hk`]SD(%4y5UIRBF 5J"oּF@Z뚪$F) avUa5Vc!vwO8Ns=@TV%7 ~9=>h#RrFEI8E駝]~'Io*̵k }*F)iy(afA)m]TH]lU)oJ|yaEףAno߇A1&fn+w}0L3[tM|9Oj7. CAMg~Zkڷz;㖛1[a ݺuC=81I?o-P#9f籡K.[=۱ LJJaE_s^C 4Dqaԧ8[ϕW^O}woXMr0?^zϝ/ m[%muzJ cXʥ -o*4ziJfZ&s@QJ[?B%ȥRŽi0.*h?!Os{=a9p5-#FxKyF`3o}c40Vi\tE kn+yvo ]= ~;KmF~f8>=9'tEr*默#}àW_Egs'9+' o`y|aWtI|xw;>,OsV]Ws9d?aC݉}ϟywyx^x73|?YMQrS5Ra7C Y|V,Jab(l݀f O2՞a O=$}QO3EX f@9°8fI ׵kװ6$ř'?M.試 PXm^*3b#@[ۇ'N-br3-E)w!6*0!%F4̇fq_^|2b0+|? lAَ?r">胰ܲˇ%~D<< Ak=ܷOx{pz?U<^2M?Z:K.dqL1B Le҆.?o; І2gX6oÛZmw {c<.(~.̲Kt{G%~JTe4h^rn:cǀ)8n/<kvrS$r'05'jч@Usl^]x1Y *?gPǟrsWbÄp*;̮O2Q?\ZrUV DB}1w/ݡ苙),ba5Hbj4=EV*O21Y_aFs̚tpK3-9(-:၇ 4*4I@tׄ8K|*n)A_Gŏ; +K. ^4j;J8@ѣǠ b s&~=zNnab:@_=/h~NPÞi ^zp$cqwGy nBF7=޽{N8!9p:hZ{p @`?BةpKqtMrjZѶL__Yo{#f /ꫭe8`΀O>efQr[EJ 뭷th;wl7 k0-yG/0aF8ɤ; V9:>^gM|Zq,~\Ӑt{=PaSs3VO У逸nŪl]8`G\?0dvŕ$ |Xt]QW`.6G 8HRWS14IB$#kx.Js=mȑc(^k[n;vlyWR<ҷ/tc_/p_ >Qon۸̓yӶ^{!+1s{jfJ~v-ܫtx ׸kj0 %1FNWS*)1"7pTT&HDm)SԠ 0AJ$jcH "կU R"QcD n~55L#RpHA`H8E_M Dsye)q{7X08~Pcsp)'swΟ\S3;Nˠ\n1S?-]K 75M[nXTp>К^о Գ~ofc=^s{Up]|?箚[|PimVqŧ~,8q^nOfk kU"|!t YfbKK;!3ϨE1*3z k\~e>~k5'0$$jc@P,U=&b ;JB}ݓ̤ ).mOo +4w~1qGmܤf;؉|Pᦛ`g_ǟp"[n[5j&d3lvÏ EonlFr&*uWԯ ;qP(H3?ڮRȲj&kvQR*rAkWcvQR(rAkWcvQR(aCa-|;̪VN9 oy㧚h4Ш>[Q{@ޭxO =%u! [ݛwhMVlG-InL` G(U.oڨb$/mQwu_:6mN;+ln\&QJ`$][u7tF:iLSM#A^55۞D tRN1cxӘ\0Io5vbB;@C /#?$Rd,Jw+Fr#Fp;^F)좤(Ìv#_FL~ݭ|hl;~sENpe_u<+z\=^k"rM0![drOn7Je)WLd5d릱%IKu"]I6SEI=RD"yzC?~B:kst5$'/Qx.Dr)\uWr_Tg6K9 io3<vb H+F~ w=wQqbG/ d~Vx:mE @' >//.9I۵em #mQ^96u|3fn8ϔgvQ"]Ji[;˼vu%uPa7`~iCpgy&?/b;5I ?Ŝ˹\+t~JN]ٳ2dh4M蒋9믇81"9/DV0s8#x# Fxh6Zb81v1xśެ7mԛO7ŞvM s!eH+/'i1vpFs>Z%ÉW8*4q럡0U#tOQ6{/L89GKxp{ް,Yg#j XݨXmոa zfroX䔨{f43*矧O9zynxQ''VjL ^lw/VXq`X=uhQ}[:̜uF:]CG&=ci>=Vǜmv^2>M3npěf*_\;Nq6g"?aoRx}6J$hSQ;hJ\.0s8# ݠ7M4o}5K>ԓczO_^_+n;c0:GZsMհ\QL QOnsEir8#` vpFh|_y4 0g,=3(aihh!;^fb$֟ω#T7Ձ\.1ЩЦY^+WM5H>XR_Iu1~s]\3tEf/am|=zH/:(b,I(VXc(J;F欃#j jƿ4X**ntru .cbE4Q[oλ4 Cgׇ 6'?8$]h#b-` mhz"f&=ي4 ސU7<`9nv+6pC|*r>} M@AOGIx*mŢKh-t >Ťs;<*y*ujE?T|/-^"E"kP/m7RA=O' f C1QF^hI)ѶQgD3Yz `h8?ES@y ?\\SN;̰9nX]G%3h"T?ϤTM[hc+c>9ߦT&:6c<}뭷0~C~nE4S%y3wF#o>z?Lzִp̻KK:QXv!3*Q`.& o:k s?9sYHBU-Fea6U4,fMI,&McAsvC9%5OZx@(jjϿ~LO6or OhqtaU '?w#$)ç8^^u5rH ydk'd>=M=\Z$$kc'ѱGeijYB"H{f#MHT̋0{3msU7d"OGKJ}bF4S5yF}˟KD)l(-2{%D>FzTd HG1MѧOO`z>8Gia=dO2>[a8SE2zyB zK )b-2Y΋v44}$C+bt^s7St̼ʪi>=,o.})ݗc꨻RrKP\_~)ρS{qɥ$re>34¬S=#՜V̋0EVP'"h4>-6M42aCiD%[+\p&ISnT8sn8)C7WN*8UVZ$] 6]b-FZ&t|4ȣ ~MW%d+Jz. FQӤ~;蠃1s!;@=376|3d9?fMmw ^NS{ 'dcsI>M!F - xE dbJ˯&a6)>Z($B.]հF凥5dj@+e:f:m6d;(R.뮻. f.+.y'uyL;В(mN:ycO<? !bH>}1)0A?-D "qL%Ioa-"% aviHI3^{qbjX+t.^$ԎN;sbaO j%'4)'2d9M?%_^n].ŤiX]ok?1W6ϯ~+^8fiq$Ks}/l&WSOM~k^fp(V-?FE+/*,k$yycxmOKVɜ/}A[ l}Y؍sw K2,x.^uRZkM/Vk\NE|3< Vc+A۴;Vx&#}/q|F)FmRώ`j$1*?XrTvFP)k46EQ)BqD u!h_)'iN.8BuoD3I_yt;g W9itћQGok=h>`P>~z[yU4޿7hԣXz *IU0 V#Xq0KyKNgOQeJ?Q@9"Jdbʖϟ'E&f}E? wgaVw/&T/CmN.;)##F? hxiLb+tȐ!*S޿dLokj4g<aGɓL4edAgb^&!obQ$Z|?p.tHmqzdGr?fvJӃͤğFzn-F#Zm3>QyCe6gDqI5s~#ĉ'WĨ15: :}8Y7}\)Hq^wu @O1_*|_Q=j+MoAb+,J@O?P>r%;Uv`PD6/ſɿk7DOl:V';&Lh˩s:Le^Xh0^vt:Y㸑My.-/LmPBSO2,Y u2 Ujk1"rsZ7x537⛻0:hCR |QjCJTrh(|VE,zG3f1uU~oY@(Jdk<4b%{BQ"^#LYL]+/[Y)f:bXyI޲PȢHy4iSWKDFʣN*V^R, %5RtUe(EiHk2@?Q~ֳD ^<7O҅K!F5R9 sR;y”*0`^|WsVĽpitJ. gߡ*K N%Zo꟦Lx\h󞉖3c觖 VD4`)掣U7j*4ʔADz\M,rԸY  7᭹YYEBC=^zua,D[x1z!ύg-U7&aI1WVkV_K> tFƫc?av?i+ 0jEWלTеܳ#Ɵblh LIi{'wb#t]JkPKpZ܃:ɷM9Ԕ;xa)?)xHR5l!bFIc|FGXyI[TԷ;Cyɻ4q-qZye!6^ə0^#Ey`IWNCfHd>V׳JmP,HYLb1؞U enaVZg9x޶3:1!ӌ4oco{&Zg4VJr>_Z s L(J;̴/R5G!HuQ+xN8 7aIKeta{@qa֯˥wb5yqQ\wcc-wԋ [o'c{6g``]6 e!s%9yV-NHw:ן;( [!9\bS$ρkxt$aQb~#/pcqK3 LhgvhC7}A=uߧX 1Cן1ѱ)U~Oh6M>J'eM8>`2\0E(QG݊U0\O]~0tG>VQN㽃q\v@Q>aY]Ah*^V -si!p+֣M t?wLjh'1Φ(<@PyBWS3zG$ O0)4(!CZťN:膯ʎ4Sm\GF]|lôYOi8j*l]ކ$pҏ,ڜfo8w?EEņ1>!Lu\#E{JIW51H龎Os= / hsnǿsz*ə`Jfo|Ѻ>n֣|l_:̺/sDWy30sGhbtEq^Z6=w2h]f⾘ȺW?Քg:lYz@c&HR'_'fwjL3& r/(O͋,;m1,wZ&ƚkڠbLTq^zMIfO(R&98`%ca. cicwHb+XMܛof#&CUM!8쩣Mfc`[(19^5d गDl{A? /V]Zu$>U?\([w~6FV^OgseC 71DF->yg}jw淿'MN l7oZZ#M?Ks2OH~ܢ`٣mtcU Fq/"%w 76i>fcDDC,^Іf3:?o76\^&r&$ .7֙PL[A#YNe>T2xpŀQ꼢?rYщ858n Q|Dx<͟lo:Q+qK~W§}&ӿ0O2Hp옏G2}T?ͅ4+RJ,hFdkcqy&Z߲7ˊo+ 2癸kY7.ȼ hNE ]h2l#vҙxL;FmQwA-|A F<}G=h:h#l\b.v UeYru!eRCE;l+ӌ< rD6 2¬awZsLBN-kHs}O?MϿ1e*ٴi#F$}NLgj Np*T-Q\jfX#Xx|Gqd1l|gnS5)YZa֣x?u6O f%RY''0W9q*e1RgI])Z`#GֵqQ0٪kBVI^\0Œ 4qhF|+SMOSJҐKDFp'`Rx;M©\SSxF( Np*T-T4^ov&$5UK1mIi4 rMRLEFh'`Rx;M©\SSxF( Np*T-T4^ov&$5UK1mIi4 rMRLEFh'`Rx;M©\SSx%eGD?aKu0ua՚{ }HG'?[p^4|>iEQtC4FœH8t6Hd㍹QJ XZպw0j'\Ph|y̹n:87 8KImUGoRޞТO~Yj|2b^x330IOmpܿk"Q鈣 sacaF 49|o'lrМZӹ|ϒms+R*"9#šaP0)<&TZڠ{LOux?߯f1ԉNR!٨Q[?ŊJuXV:cLnNw0ky"ڊa4Jӳ&GҵZjbV:ϴ ȰF( Np*T-T4^ov&$5UK1mIi4 rMRLEFh'`Rx;M©\SSxF( Np*T-T4^ov&$5UK1dw@IDATmIi4 rMRLEFh'`Rx;M©\SS|L/A`GjIiOSG7+eTAXOa9Eyx'o6لN98#iS,Lv]w 6zHw(X؈b,T`~us4s`7/ct+9ΤKilzCq9Lŭ gX6հi: }d^hW_:`Ii4 rMlz k եhMZm ha-;LCe[p!]lrLȋĺ%֛_V~+ľ_?&<0m|2a.` ' xWam G NJ 3b%xQFDW卼 4Ml_C:hh^kM?Geڍ*Ri2Om!VÍ"i&=:]@ _*LgaycAo~b?O?tdZ'?tFrଳf@,e6\|%aYga&gnSG$n^g=fy0Wn+-,px:V^!c~gVʍ/Vaz48 C9$/>N ,~̦gx/l|YȫLӤFñmx@GSu ;NMĜ#p.Xsi &"-[I񉎱V$_H X=\r%\YzJ+q~G:e/x bKސ. aLAZdEq L8rragc? /DX"|I| -PX[7ҋ/_Qkּ)?Q6dc.SOO w(E Fo{Y(:jjtA|yxi0`O'X5~Nlx'=ԓh~;ͨ +ѿ\kg)u[_Wz9QڵkXdE{~/szOJp7\;qY?OGu1buựRּB4:;;F^e&3ۿ-H mvms'+kRZJy2dHj+>~B0<)1lҏ8?v6>dYr8@ q_M?;+wF .0O nmZ#kNReSS"m",,MjQQ83 /;HX?;ذ Mہht=p߰:w@Glj5n9l:;L(BSS8""LvoXʛ^tEJuv|9b!Q)f55LGfiELSLu0 t%AR^ߥz KtoH^tˊ-Fmg*N/B^hؐkA8=ԧwG?QXwSᔓOƏ'Q5\|Bi֙z?ԛf*< vx3Ohw  X^|mtr!7@Cl?4кnV%FhN=3~vAb{GχQ4ܿ%Mt6%evmjHy;Dv:~Mw$emPQ>{d,FHSOzjaM?>Qc3(hz\Yp7faG+2eIvɝs\s*BӪ].RUkj"lxA?Q0  :=]o05Z '|RHBmN;jpxVgCӂZVzMw|M 7"=k}WPfBUW lܮ50f _OiT Ś ZдjTǚ MTM#iElEcMM9ߙS=X}u=JU/m|g> ڦaL# y?qm `"^ ۠ݖpQG:bIϟN8xt*-vu-R¹˝`T:O;]XtE1G [;X/(1?U)n }Q纲os</[QǪh7na~n+y F5^kmJo{-a:XvL Ŝrh+=̓N&<~oȨU4^>`[lY'}3 9 #BvIc참K  0 WZ~~Tܻ5PSџ`)̅k E4wpB :OǶ[o'RNqW:VJsS%7v0x`!=s'ǗT- u]QDFMǤ3o;絑F.»oFYh{nٱQ5:MV2SF6:1Y`{8fUԭ2~BѢT4w[`$*~?Imr?^0Uc 4/[ojyM» Goȿaqr'?oV8̩¡90ZsoSZAì?![9ͯ? Ty':T|ֿfz/P{EVJ8X7IK$|o8rƔI >s?q# 3xejwyAjtArMNsч˥69AGD^.4 7Ok΃Uڠm(7ktg綠XZ.Ɂrg ?ʏGG: ebSmr>< ].i: t&9à R栣"/HKmr>< ].IkiraK+19$׫\(ҥMNsч˥69AGD^.4}xyA\jtgKnI]9au:%WץMkZZVu1NsCrڔZX\s5Iq'=q)ƍ<񤤧__tqMO{Ï;1G߮O͠2&9à R栣"/HKmr>< ].i: t&9à RV00I|Bu|[,27"7$˿=(" qq1hެ]7_o|%:aUn4Yi? 2_* |xCE#Q?wn9x{LHi 0T(>os=楗Nk,qq1hY,n3u:A{ Xbf홹x i˿?;eCe~oN3_"w y'hO߅^[Қ$>;A2E+_|qQM qg |zLq~aki;tcKo#p#oG`azLs4S*q 2gf[I`Hp3<^#QA^-Kgx V_(=D?}=*֍h;ߘSO'dҴmobVQk! i AZE_:݉%Z"ie1t63=\MgS=ˊ) IMDK-F:wu&@Yd$@13#=QKЂ D?K}T%c[H Y/' ۻ?e[/U fl&oH;L󕋢 Ǩ}@4O7R18KJ-0&OȕJ늫1"E'_Am5071>SJcWbo1ЄJ(o+:5V[@_\!*8Es[KbJ'^KȨ;)_?|#U:⠁Af'Thh\;:)gWtKEA P!D˵S7qvETt 2_ [[k?=Ol ۍAURMQ~?:t/mOk " 1 7EO?p@ݩk *)'0|ພҗxcCnԒMDO?a~w5ܨ\l=oz?tA|}&{<.fٯ#hn}[=]*(-:G$ SԿh}=Z*';G7K-7K{0cqNc˜]]t7 OS mtx?ɁhdBZEY, [ID07Q I/#Q֦uC[,n=XH<7?q*Kt#œNT'"gIH\P 'A:KJ<"owRwdR_;_igO+aI$ZS%;ưTI*eF;aCğUM:6U)wumD<X>R :n z? -_ TuR :n z? -_ TuR :n z? -_-xѶ;$dYwU+Ip"WrqyW r:>Βp@j5ԿhrAXN<>R+5)'T+f@}KChmAlXcG?T@j:㫎1oiT?>*ZeO?U5Z'-c %E[VĆ5|yZa6ͬҵo|*U+byƁaSrJs!UY#8. Tv`.q*}_/r*JT̅0Tg!ڿT#UE!1\@UzVq'AHUQrxH 08P>iIe:RU̅0TgRT%s!UY#!T#UE!1\@UzVqdr*9/lH=DA%۾T1(*8?u[JRU.\%PΘa?D71Zʰ"_1*xt*L(,?qzy$3WȸP[&{CuQ~}oߌ QrE|'zu܃^v _RňOwT9/!G R$0FKHo?r`#~6$(5:|+S6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6e FHMnƝUuDkdmx G*e0i-E7S.LJLzZK @ĮdO0)e0i-E7zRRtC=¤Į$ JLzZK @ RRtC(G*e0i-E7S.LJLzZK @ĮdO0)e0i-E7zRRtC=¤Į$ JLzZK @ RRtC(G*e0i-E7S.LJLzZK @ĮdO0)e0i-E7zRRtC=¤Į$ JLzZK @ RRtC(G*e0i-E7S.LJLzZK @ĮdO0)e0i-E7zRRtC=¤Į$ JLzZK @ RRtC(G*e0i-E7S.LJLzZK @ĮdO0)e0i-E7zRRtC=¤Į$ kdH^_FVHN=+4G%Q~ğB?k hth)NA=WiK>EϚB?SZmU_9Wi`[5g{hi`ƒ5g@OQkU}l^B(ϕLZgsC X!45oL G3Osg SPQ~?_0߉EtX_1 hp0xcQ?/vW?2H}CEBYaVg*z40i|/sҨ 5G3ʏB8 uz#+)vW3_Կ|'A:ڋD42fA6@MDF 5ܦ=(Ҩ 5GB3Ԡrb&h`\H`TnS  L iTPmܣr! jPM1P{40Q.QA0C *)jr&ʅ4*fA6@MDF 5ܦ=(Ҩ 5GB3Ԡrb&h`\H`TnS  L iTPmܣr! jPM1P{40Q.QA0C *)jr&ʅ4*fA6@MDF 5ܦ=(Ҩ 5GB3Ԡrb&h`\H`TnS T#Jɕs5U~=JK쒆)e[| be*D?QQ4Z%flQU!R)_j-0Kl7O%AtOX{Mh (?qOvC>Atz+ rρip [I@ (Y>nЀ$.yG'!x D;$&>0F)؎gЀ[ꄯFE -3h@x^/_?'( t:4EG#W1UNv<~O3aܐ %L_\@ߛ<61rћ<61rO;y%@nJq HCshDv[0M:o7C}F5A}H_iv4 G30CMi@% Pu>QT? g>|CDA (3A|' H? g>"A"BE g>iz7llg:qW $"Tz߰A|#!_'@P~v󙏨A"BE g>iz7llg:O?}$됒VsF9^,k F??"W%􂌀ؑ,5':vGKngW1ZDXL/ET,[{cp O"D` r"`B!"e-!jiD%h;V7jѵ"E<:Z\m':#@'?1)Cm'F:#@?d(Ifdwu IPEMLnq>Ho(; :ADgΰxz=(" qq1h OaU{%"5zT<3;zLs4`KcQ6J v4h O_R;jZ$\;AQE:PZDgf{IeV{ n&O?!ZI?PVĀG2͏$p5/WE 2X&g BɾEG)Ri]q5PdԿhD0 7gj_zL@1Wp-qY `Y"j ;dvB4hn+Q~UlUī ¢]p>EoUߢJT40 kG>EO?N{(`!*dvtSF;ή贗2;BFKyk#x |''Yx3CJ*8)ʏGCm}<0CWf7>z@ӪW<\@UzVϩ^9WDyƁk|[*I 08P>ъk9WTBҳG__*ԑ`.q*=+|D8D u(9<$ aJ Q4Q2H*JBҳG?C? RGCbƁOO*ԑ`.q*=+|D8L`G29i՜6I$NɒmlKQΘaOjx?U-c)*_ (g0OtG-eXg<:T^R <۫|Id|-ohs:(?7CoFQUߨR Gt`AM;q/b'?T Ȑ#_})?N?90utLar?Rz{KH{VpCZ)[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm5?С" X!}03@}=4>җ9fiTPmܣGevT!d  /_?QE mO`A3Ԡrb&h`\H`TnS  L iTPmܣr! jPM1P{40Q.QA0C *)jr&ʅ4*fA6@MDF 5ܦ=(Ҩ 5GB3Ԡrb&h`\H`TnS  L iTPmܣr! jPM1P{40Q.QA0C *)jr&ʅ4*fA6@MDF 5ܦ=(Ҩ 5GB3Ԡrb&h`\bl@IDATH`TnS  L iTPmܣr! jPM1P{40Q.QA0C *)*rLֹ*%N@vIղ-o2M>;=&x4j#ݮJUײEG $G:EGDkQJwl\7E#ʶTE{S3߄-? AZ :'?j֖RgND̈́k kۉ;:n!z;H?7:wyҼΛ>Ꮴ)rz}s97=CgI:Kzs[.M34W%W3z_kLwyg{OgJ7Fϊ50u駟feӎ;igWA.Zo2h +nLBu;K=wTG:*WX_f!t:4}~?W3>p] hD)1ijU\& k(1Sָցg@?Fhr c~ABZhI;ߥtz\& trz#f¬% 87Py贓OI<cSchHčpfOlijwmZi9l)&Ӧ78:l|4/j$y~%-R5 9Mg<,3ϔvigJnSR1ꫮLύ~.1iιޡ9vkIMO=tMjZOx 7IlJuk/?䵟?/i|jl{{unwhNIղEIM;4Jq HCshZK"W#YGE5JsŠ_a3 >HMZkjor3MSN1#W,X$TO?kҽݗ}iE>#i |=?_~y}ޛf{䩃5\#MOh 3SNL8?>ǐ Cvҁr!=ap:e>s4/~iFQpV+I'$??=!iW"3teȣЪB -'3?ϋ{Îۓ}DZjOujNq+UW]5}-~[|$}ߤy`ǭ=tdvu4 3ՑZOt_LO>YvۭӨQ3Q+:twI'4iI' [Hi\ؕ\kƸ?3q\P=vB[V% o1~U)),QeK<-GEth%~~w!V^ |sDGHO:D[U#zx}>;P@:IƟ\Ѕ\5ԝk??6(u]2~O<.i>Gd4L/b~ĝpxǤL;h\&ڃgwޙ>?@Nw饗iv$=0۬GMNiG%\-Ztޞb* /2M^W iOSLAXGSo!w#e!co#ܚY7 ._Ƽrk>iWM\?@r"f.-pYLz$s̳wڑ~訯 R;IњJ`l%Ya7gdJߥϻ~">iд2r 9RhSٗr K(Q/Q7qf*JyvoAPT>/V(Q/(nךUQҘLs*o9sJ -Df*dG4&%h:Jd}[Naq{y4۟V3MҳόΧ i՝0Ða /CewғK}V G;nO.tڗwy[$ۖ[n%?O2$t1ǦM|)}&29Oz?^/Wjc>&r-V4対('7t? 7|o%qbzADҽ/GhFit`)u LIAXrdK.I9ɦHkVzON3MΡ'nx9y矯dQ7şXj}A t_"xA=LaֹӠ*SWt&r5)L<W#jt_۬7˯]vYVɾbdpu!\25~ulV4z&}SJ_җov;IŒ&xL-ΝrVt"w}=M'Xrӟү~KPVsXnp8wVӓ"H&a6sڑU8xr>ztWƤ暓V M\ ^J?Pz_O˒}"F #WfeT񷡑˫7!~4Sj<:+8J~s4ɏ Q\UB;SCk76,<ߖz[pcD&Wy겆]lP_;GMy`HEZqꩧfãp W\o|w*ji6L%77?+LcgڗveIЄk6(?y:+mwێ& w)}nU)a/RZeLLS>j#fNKd>ֿM7$?5m֧'@4[wvHG0S`_. " NϠ}qyuLk'dZ"x=t/|K{¬.` @qTd{_H+ӜsΙ>;Ubȁބc=dgWWCI!>5hOZtU4ʫhiĿ_xQ7)P~dqEM;) 3Ji}d݇,:zI t54#ȉG^t ͝}@9]w}O{==2Q^XҜB}\s̙{>XuvٴAA_ lJ^U^Pac|w(Y`Ӛ*$Z!_?Eco;tݵץZƃOR]Shcu'hO'i{h_%>, )}+ ֿ;iU~4nYf˧  .e?Ӵ&y=4QgV?_JߗxɨQ3/f~_L~dzMhg9砧X^2|fϋt=OLSK҂oǿ=w۽ܝC9_Gx_>I^8w4;i-8tGhiLs^y0 /+,ok/%%!е]>(anjzNBt=v߃:SOD"i~GikL`LJc=ӳ=#A-ȇү;.]ӔO.fYYpv0.q?hѴ7a918irMZ3/O?׿vq4+=Fí 'iSO;]Vm6#Nn;p }/Vg+JH^EV|=5$jwx{cώ~V'&fF<6wlv[j`sXz8ɟ>h|1Gn{x5`c㗼Q=`XJ-Xwf*.Ae7lA|#8 !b`Yb Pu>Ԃ\J%۹53T| }) Rv.y q U3H_J-ȥTKHo\ ;@җR r)l Pu>Ԃ\J%۹53T| }) Rv.y q U3H_J-ȥTKHo\ ;@җR r)l Pu>Ԃ\J%۹53T| }) Rv.y q U3H_J-ȥTKHo\ ;@җR r)ϯV#'D4N_>Ҋ&a]G2K.?u(Ok47oNo˭}aD_FҶ%gKWet9=92a§< 0eˤ| Bm]w$g#KXd+I6sΣ}owH}W5<cJ'4Q6>/qHz߰A|=P0}O篥lWSN sCiZr+9ēO={*<)#\sC/&mx. & \8/^]v:mu=';poyʧ _!)NA: @!rN?29W.t S`lP9xE"=/u]w@+i5cӃ#kEoyGhi˔7l z糲w/rק#M9Ŕ?mz|2GQ_[WJyK,h}zyYgUtagh=x%IVy)- lF:!$>c _tETGO ;:^^Tso.y\s۴&*C5 (I^7!?ߌ@SSLZ+[O"*;e䘛HYš%|;xL~8W}O~:Ӽ*gӠ5WqmоhS?4&J`M=Q?9gM^ɤ}y4/+h 6~XC/H[o4VB_@;\C:kӊy<~^}-mLۦW-_œlmx׿W0}gWET'%|,X%W1ZtMY~_}OjѫXau7P}GĮj״e퓟GB-$."z⚲>EJblj{ N͒Afm7&wxBe5δe4ӢLi{/N<ڊ,9hYr+y;za=@zz s/Rښ"w{˴G{_dOL9CdOcYwk}mo?unH2yUoc5s5h~f̫c7ʹ⋉>zJ|o^uՕD*鳫.=SO?5MON?|<ȏn۟G3[{5GW1Zt>[0sd])lsN9TM4;t޹禓N>9e uxS=3Ӳ40!LxUG87$^_A2z?eu3y /[P~i*RO$n,G?g- E+NfWi|>zu7_6n?k\k_Mksq]ߔ3RfOq|n5ݟH%4)#e[^^}*"mT<;chiwmZW{G'8^;¶nCfs:oNx!95r6wPGt?/L+fvMqK{\JV4!BH.O # K0  R<3DTuuD<,x:ngG&?IUz@v7Y_~VZqE_x!MѦ}07"JGl+R$o]w-kϴ7 ZʹOg/h?:7䍝>SX7<r zJDZB+//hꤓN/,؍W/y\gwAp9vPJNo7~$QzGsR*-ڗfӽ?棆{L~EKG "A[^$|+>Ht&u.W93O ?vؑ&q'R z-o;{݀_\]˙)< -x;{~?];|B#O7xcZc5wܫHeyOG~i>@6pص+c7\]&ufZ]߆'ǻNKʿzk:hoMʢ`&EyRZ%z93 EOl4ǧ.(-B?>]V8>+Ys6d,{?+e7<9ioV$Rʧ(q;Àd0% [.L_L̦jtY[el_+\^ ݣ[ZMŗ}mc>V}=G OMWl{ߓh)fut-I^ͯ cm$qe$Ǧs>{wm!r._╤3 =Ixly瑕_&NJ *i"=~jx{wO8QƋR.Xڎi~";OMӃxPʟK~|ɒ4ǣ\'GaI[k1rD߿j3iuv] R?xߩut-%VANSN9=ٳ3Iz?jkSXm&N'$#]ie2R L*OޘsV:M72n\excѿzjt,.kivމ'Bg`&T|b\tȡW9W=^uM7_al~iAu43 3#}^9fZaW}/M<¢J7-Xzp>6ַb`>|&zq# X +x3NKO21 ꇲY=s9K6[ގMz;@}62\FU$f]M(@$uth``Ze%ZFfpK|"< '_B2UAǟx\fy{[ڟm9, O\5l?dT>WArΒ~>74 rOմLTGw7(@$Ư|7>?ʏGDz(@ơgE.^H>EV+ѓc OrO-D?ѪM7,M>%ʪW_I?tt,/M㤓N1Fc>sG/dd|V[H;KJc[uP+[qrk{؝~rV~+-v)HګfKW^}UbmIvf?>M_g7f>cHHƛ8렫O^|YüWjϧ-)ȁ077SPg5bU@"BgI꧘֮Gp_t4[Ϫc緀0 'OW33W{\zS2/٬z z]z"\[%}c?짲':O(~k_w~mM;ȠU$*EdJ:a%K=&9 y/ |Q 7@{_z'K=v[nwa].ŝw%@y$/)rG~QGf`[O×{7Ojԍkd^=+>dNx[`~)'x::%M#Q8xAB:^mr>< ].i: t&9à R栣"/HKmr>< ].i: t&9à R栣"/HKmr>< ].i: t&9à R栣"/HKmr>< ].i: t&9à G2ěOipo6oWl5֠GWX^]^_.͕eXN[nFӗ)͖%a9J$Ҁ7䉺UWYx>Jc2?y癏K?v*Gh/Cs9GƑVGN95Te.i16o Ië>:{pf%$r7X 4ic;GpP絜˫69AGD^.4}xyA\jtArMNsч˥69AGD^.4}xyA\jmO>-wv]4м%B ]J^tc WK6[o#o^~avz?G7Iv>>B M%*#;+u4ѾS~0H{ LVc￟Gϱbj# 3~x 6wp@oGOiFڮ3G.n6o\6|΍?/fA><^zk;Z|{YҊ+m4M]yz(YV00I|Bu|,leB'_x)/~ 3Kд吏zJ첪/PB-eYab&K.ވ4QyǝRY4>ɯnvE8ziЀ^{QG66;~yLl eR>?W>W񪠑;z;?M/p-pdh~fZ'VK~X)?b-f khW/$1ʇU]w=N?>1]giq?$#AVVw|~Ï^veM0Io,=gZuU'iON^Pqǟ@ߒ-du]pki^MJqM)\) ~`Ra 0Xff̌l 1xE=TK}9:juKq*Y8?^n`$ΚڕU`Ȟ3h-=>L3ߢG9FtM9ߞ4х 9c`\XPzJZ6J{mŖ94]M$!,ʀy`{< =J+C?ݛ1 n^xa}D 4Y1zq=Z u3$' \<~Awcg}]5\-]j0S7p#<89sk$EIkt.5oZ6Xүs5^A[#74oUy$S&Fhlx/_y5-I?j:>% 3}q ?0 Y~"x(m! 8 W^yԩ~Eo;Cq'H=EV}g^U￯@/2$oοdyD8%çs_-A`H.5rDnOߺnk[CoRyo2zArl]=c0d}ߟ6ß(zi=kh؃^6ݴu!M?/"d+IRos^BC&6}$⋦^''xqʧ>g-I[3% v./Vdn'mHh~y%ZIU*GwN:S<^:0ǁ *&#CA~]{ԌV<7YK>.ߒygȀgl8G MM+oƛҌFF%x_yikVUU>~]w5=iA~?Ŗϯ=&Y2oKo1Nh ߖ'p/M"}In}~Z/Xr 1Q3Qі\T&Fkh?4^ǿ0q u[&t O_&tBlLIhnELΟ?ʏG[#7!Nzd4aF+Vf:5TXaf9 w-l{4ќ)'*_vm&Lfi5ũ 0'?Aqnb&}Ryđ⋥No2h ʫD/-x<.2^fΥ^~}5s1yҖdCvM6捼4aFӗiW'v Mb|ڟ#MZ_ZNZ.gS8&n:ZaF+hlЁG2Wg*PK\`,JN7=@pÞVU)˙?7K.M ?{uYUytӠ-h "J5Qe1FLhV QFh⃨1Aѐ/Qq >Qhj]>WPWU޺sٗ~`,YSOWUF27=:+W|ΫvveZ8>NMǾXhLhsij':sSL`c_(~L 8u s3W"Dwxu)|ß]fx3=Hx=]/[?nK :%)"k}^)P[93>'~: ~eh^BqAS~>cO|nՙy@86-5v3篦fhA@^|5xN|mz7TJlGӤMcF}=tf%;>?;y_ytU?-t$Kn^җ%{ԏ'oߏ zL?x_k gEbKMBy鍊nS/WHw5@u 2뽺 9~Ɵ/o_-Pݴ3Cοk?Y~0dOow?}4?O?j&t<? m){s-|L~p;~M*m|bn;/ $JʃoYFӊWZ?c閡щ~dz32w^t|=z}_EW{ /u|hPd=cP--dZq_cUK:2uxGTZ_o=&ѕUv$zP__N#_W)%Z>c^@Nk#^=֞gܤ;FKJ}S/y2]lS5c^Of?Q9?jj7JO,@LwrߒkQ8 [2qOl}h7Yt21]`G^oy{K 5|5Dc7>7wlכz '̺nAgl 7p^F LÉOBZYIe1Ǿ~C`|^´r/X+Ʒ^|2~|}2ù~ _wȢ|ЭG|B7>×M1.6?N\}VWȣ5c%]ėHj~-fd7z}0J,z5!o*_5o>?#.Ty{Tɏ ߗpWZ(/_H]+~~v(.IDAT> jGUTy|:j}JWщDS&=y>LǼr-ZjZǩTTbZmⵟ_*_+(r SBV?7p 'L?:zӟKTKGm>-pqSV]> 㗯 ,Jο^a^A'TH+HY|O5Z!,[E|fS2>pmϦw}=M?m'2q&i^˛驑~܂OcCvժUrV[ѝ@몮Y/5h.kl\˓-6#isZ'gH{?doY>x?NzҚm}{]6бY2>/ǎtˆ[eғG_WNָ}X>h͵?0z?Z Zr/SROY~ypNΦ 8!Ӌ^"=8MH7H+HT ￷nZ>Ec_EF9˳Q6|;O{aW)>7$2t!_uGwJ򪫦7 %lOz>tHr~OO|~ڜxs}8 돽.r[6Ak~.BoCe-603"FS$-F N>=9\мUX>Kz)]5R]0Gsx 3Oac톿7r/ۙ_14*-wt[OnzՍ_K.Lޒ,>.9>?TzA⇠7 ??.5` w˶C(܃nA=hr,'Jɛ韠d5)?MF€X| /z.QƏo=X=}79]ߊ%ty^ctj_69{QG':zmo+5e$z/ϷFN('O>p'rLw}if5ӚLW_st"]|=DZC.wt{nI`C}2=miӟm7Ф~-p>V[Aގ1~;G'8y(ƲAS~It),vxK\z٥&Py'X?Q&Ûn6N14M9S .Y~BO۟NXT~Oߠ; ӗS}y|+Z!L<|К|\rK8:|#S^a~䪽Ul72>ߣA]='R rYgN|[䂜ݩJ'g._{wy>%LT˸~k.Wi]ի1|~^K*:w5-J@G#|~㼅i6HCBO݂9wtBO@m|̤ШFkW7v+ϸߴcu}h9o_xg?'m_ gU)AZjmL\ Osߟ^cr~_N ._>=;zr;=PRm~];1N|ǧAu3$|hQ[hb[}騣gcӭM;==it KWQ|e''KzF㿕|ɗ8/񥭪m`Ϥc|~.yZldu 8%ߏDž10۶/O)BP;q? $Y4(#hb Oo7H|`Ipwl8oS[INR[vB>bdWWÝ Z~/y >D'("4>Ma?~DJwfl6=h]e}2^/kN</Ÿ3|?(5z'$}~>~>1;4ӏct:wGoߢۯGo_{sCdۜMJNvylPmwΗΙNk<8T\32B*Z|W/RE/KD_v%v*w"5MU*qwj!M}sCWO5k:N1h5(YG'7sPV 'ԍዴosHWCk0|[o5]5$B/=}C<`/7utߺpɳK/!]~![ɏ;u=I(߾z|Bv=Qvæ>yVM75Y4Q)(2 /oZ$9MuR ֵtkWͽ RGbcm]x59wZnj`=ԏ\5?wV;#wu:Fƿ&~#Agw06K|)"ie!C!|ʍSs<eh%7~*OzZNk%ޞ9$z-=>_v M(EDnM{ǟK/_vmW9Hp1Z0Ir%sro:~@}2M`Y,jZa٭eC_瞫>my{ˏ鱍>g!mY9~y%(*c eU]XCWgc)q(]8~8(Jzq[:"eMUm? }*IzF;Է C>.G)t|?H[nQm߅`3߿҅L0/j\ODcSsA-CLXxtGIG#3oS.Z|VG^/}*~˵~*O̼Wykݭh-;?~ɏ~c;i]вbrp.oV]O) i_M_IW'oO,vvq=u)sO[K?zar7{g>'n+u"I?| j)nf|]3jS{gE]JU) $Z1l-IPZVW-#>7Ҿs!?|# }A, 1 J߮s۠[(8l>yf,!7? -OKȩ :=Bagr*(}mAPp2䙱 Jߠs[3,̿>yf,!7>xMlh^Z'cϠDk{cK3(=sEǿ.6Θj<$?Lzѓ6A/.2t/Zs/>Z1{/TqWrovB/RFkB3Nm,ms|/ jc12! $+xRrƧ14*矏 bc~e@7-%g|CIYLCh 61W֟?! $+xRrƧ14*돏 bc~=ZZsr5G2aḞJ3 kkhnֲxIwRzZh ~FO/Et/q6)FHkVe㸏J팹6B{Vk|ʅ@7s%lV_نDI5cО~e59%$GB1WFPh 24 #!QJxH̘+a#(g_?Iɑ(%<$f̕ڳ¯?C$HH3J YWNw=Kzzw!oҝy;??pׂߎs .d% }ӏi=5V5Nߖ=%G 6ogZjvt6Q+ ))2VkYcY"P/_֟BZbwiS'3ym{{3{}# Y,s֞|ӂ!~|^(z@ޡ?v-AD?ϗ|rt3n^Z=';?eοAQ5L?/s[3Β/fq4 _߬DPrcK%vrpykHsK詍|O'_>]O]NYGp r&yNr,~Qw[*vKhL /:]L7)MEdqy7#$&7d.:n4 FHMn]Tuh* Tܐ T4!A6!wQAph0BlRpC6:FS`٤:lEu^ Iu ٸMEdqy7#$&7d.:n4 FHMn]Tuh* Tܐ T4!A6!wQAph0BlRpC6:FS`٤:lEu^ Iu ٸMEdqy7#$&7d.:n4 FHMn]Tuh* Tܐ T4!A6!wQAph0BlRpC6:FS`٤:lEu^ Iu ٸMEdqy7#$&7d.:n4 FHMn]Tuh* Tܐ T4!A6!wQAph0BlRpC6:FS`٤:lEu^ Iu ٸMEdqy7#$&7d.:n4 FHMn]Tuh* Tܐ T4!A6!wQApEDT< R扽T$H{Ok!0)e{ZK @bT< R扽T$H{Ok!0)e{ZK @bT< R扽T$H{Ok!0)e{ZK @bT< R扽T$H{Ok!0)e{ZK @bT< R扽T$H{Ok!0)e{ZK @bT< R扽T$H{Ok!0)e{ZK @bT< R扽T$H{Ok!0)e{ZK @bT< R扽T$H{Ok!0)e{ZK @bT< R扽T$H{Ok!0)e{ZK @bT< R扽T$kd]h_|a; Zip@re^9"l,g)2l*`a<vk^9l,/B? 92RD-ZW`Z%6W֟? Yl*d4H[ 0`cɯ?Y(T"jѪ5*!(JT\w=$3}q;$8f ٴyFj<%:vwJL|`\F)\؎gЀKUƥ[Ϡ?Fο9ybUcv3h@z-O֟?Y&Е%x dhdY sĀͼ*U wiKWћ<6.1rOXʍm`LRFMmd3n4' 9;ԦQS<9rs3Ġ?aٙ6/矛! Cx4 iOο9 1hOsvM6xr?:av+媻2׀ހ#' %8I)72Q d2[[ZX29ѿ?W]a@[vMYBr?YsC ?(,CtjcM 7y1*T)v9+\[QWc6wko VGȳ&nU5!yܭJ&R["5CWքXjVقcsf*֚KmuԊ<[plb ]Z`Zg Mݚ[kB,Q+l[3t~kM:jE-861wko VGȳ&nU5!yܭJ&R["5CWքXjVقcsf*֚KmuԊ<[plb ]Z`Zg Mݚ[kB,Q+l[3t~kM:jE-861wko VGȳ&nU5!yܭJ&R["5CWքXjVقcsf*֚KmuԊ<[plb ]Z`Zg Mݚ[kB,Q+l[3t~kM:jE-861wko VGȳ&nU5!yܭJ&R["5CWքXjVقcsf*֚KmuԊ<[plb ]Z`Zg Mݚ[kB,Q+l[3t~kM:jE-861wko VGȳ&nU5!yܭJ&R["5CWքXjVقcsf*֚KmuԊ<[plb ]Z`Z{.!d CQ-z$D[FrI:_C/OFk#pLR@yxz5*K:_Q0$y_G ΍Ę`[es{W+j ;ExC9Mܝ1ҍӭ]:7rhCba@柄r?|JXdS0WBaf א72-li ?$.a$co:@y˯Z+R~7l|g:okJuCϸv_h8AjV=o Pu+qyU7llg:oqyU7llg:oqyU7llg:oqyU7llg:oqyU7llg:oqyU7llg:ouGޒAq$)2 iC"pns|GQC/ɚ9% ge3>a,2Ŕ K H"[P(  D~ rdI|" jy7?2lj$)u"ƒfObBzpUx:3 f,!HOvƿ윑3,!\}) .&1C @Uӹ!_οEJ1XY(]!o͔߬YN֟(s;C֟T 3.bnub Njj;iuY!g3rK\hHw#W@Ys/ӣۭN[\9?GE-n[\''jQp-"n[\?t(I3gmd: h;P'}ߦQx y4*79dB@EA Jʐ>_@\j2 H'?WӀw ]D+Să_dG/RJ3H{'X ni:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^i:b}A^j 3kP K'T7h ,V;0 A _W#Qxfq Ls4`VKcB_s  d)qi;0 Wi@__?ʁ:#"9緞Yx ظՒX+x?E@c@)?bͩ١3.nށIڈ9 G9PgDq[Lt :P\8Zs3<?aͦog~IE  6M~M끸ۙ}rS֚@?e ާ-7ek deeayf73@M֚@ο90}a$&IkM O֟?>efY'͒3d$_`zڗK2@tvߢA?Ţ$@9d{oc!?{~.<3ݼ{3O[)0d^D ObeCU)njy?N^8lؼׯ?J_pWh1?;bh=46*ZYq۟H]lI=Y7{c[J- kyOdMr[ndʾ0zEzVxCh|A4w0gPˏZk싊+Us&Y_*ԑ`΄1"=+yq'AHQQRxHt0gP޼8x u()<$:3a H o^bIe:RT̙0Tg71^2H)*J L*ҳ›׿R%Ds&Y+Zh'BqVtϔ>t$x::mhIƘBGKT(cLyђo+oiio@ĊZ$:MgҚA^>!| ?onI}3(`_r4Z_Cï~o_8~rl߿tr!O}%SO,)$td7 Q 4% FHUFܐ;k )i0B2:I5^-MId7dNniJ !+wR@pKS`Yet Yj[#$*nʝT5Ҕ4!AVpCV r'x 4% FHUFܐ;k )i0B2:I5^-MId7dNniJ !+wR@pKS`Yet Yj[#$*nʝT5Ҕ4!AVpCV r'x 4% FHUFܐ;k )i0B2:I5^-MId7dNniJ !+wR@pKS`Yet Yj[#$*nʝT5Ҕ4!AVpCV r'x 4% FHUFܐ;k )i0B2:I5^-MId7dNniJ !+wR@pKS`Yet Yj[#$*nʝT5Ҕ4!AVpCV r'x 4% FHUFܐ;k )i0B2:I5^-MId7dNniJ !+wR@pKS`Yet Yj[h0)Zdt&6=% [ʅ)R:ڒuE(EFJgbS[\"3-YWZdt&6=% [ʅ)R:ڒuE(EFJgbS[\"3-YWZdt&6=% [ʅ)R:ڒuE(EFJgbS[\"3-YWZdt&6=% [ʅ)R:ڒuE(EFJgbS[\"3-YWZdt&6=% [ʅ)R:ڒuE(EFJgbS[\"3-YWZdt&6=% [ʅ)R:ڒuE(EFJgbS[\"3-YWZdt&6=% [ʅ)R:ڒuE(EFJgbS[\"3-YWZdt&6=% [ʅ)R:ڒuE(EFJgbS[\"3-YWZdt&6=% [ʅ)R:ڒuE(EFJgbS[\"3-YWZdt&6=% [ʅ)R:ڒuE(y 3u KxNa; wip@r^"l,y=TiS@CKd{ P`cɛ?oTiS{VZ/+@L9.xM34ȩƒ76bπJkz ~CH}Dd<BVi8k^,R O̸=ͭ+MAex.|%.~%~?6:;at~_~EmC0~T>ȭCig iS|>?2ì(NQh`QfJA %(ܪ((-^_>DBPWPAWpb7U0y*o~1YXUQ`L;H%nU L TP­ܢr! JPUQP[40Q.RAPC * Jr&ʅT*j(AVEAInDJA %(ܪ((-(R [%EB*5p$h`\HnU L TP­ܢr! JPUQP[40Q.RAPC * Jr&ʅT*j(AVEAInDJA %(ܪ((-(R [%EB*5p$h`\HnU L TP­ܢr! JPUQP[40Q.RAPC * Jr&ʅT*j(AVEAAni%5ȯEy >idF[Xr,O!,b36^ѐ\wQKh۟?fd_O5%A_XkMڑ_ןjM|hUTfRρP$@ :B4v`rW@X }جyN6< |?^;$&60FEثӰ OYk [1L58&ZP۟?OQ"i؆P? _l`z{u)T ȘԢ `a(T`dg|1iE<^>/Xi"P NvZ{3-D`w3 >ȘԢ oPm0;ٙdLZj?oL Q6L2&-h۟?o(T` NvZߗрhf\d``-Q ')ULcܞaefʔ^~X<rxG}HU\(h8ݮ%_.mE ůx NeQ$ ׯ~9PO_KgZ"ߌ}vc6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -e .6C5 -{d . Iol|Rs=z$Bz<#2u)B7> ?_so~'^ xsQ0$~_tE)5\7SW,߯0XPqQd5kfG R6FthP˗[; _o{5> I(L>H4?4h!0 22ni۟?ouELO1F86h zoǾŴ:GI< 1x3VO0Q̵ܦiQrDꡫGz:ہLjxG!{y+Dj]MGӢ ~Sprh\;6i1zǯ~?zR֝h+hZr`P݉ԺRE0%ɽèl.Bc`Tc5d[I'k3{XU$y_E C_\RP iyo ȱ.U5 Hǯ?~u~o|Y]"_i)v4Whա. U$㿽f4J 4 OE@bPǟlsvUoI8*Ձ"J\4ܨJMl=b7N lm,l8#n񶘄+vT`ƟFӘ \L>  5pV]uܲ˄L`w^O,3v}0ul9Ǻ\:O@ %|agW_#| KwL0$͞iBӄ>|pc:g0묳ZcTrX Gu/oD럷?o_>.8/Z:ZT:pM7Ǟx" @xᗿ6,m8 Mзo,:$za4H7:Uoǥ QA4lz^BPV/mc37){E%)v|yu6x"=>w+K|'qVU4ptQGQ"~0䓆#?7apV\cxGÎ;{=J~7i0it{y¥]z}䑰;#G~&ߕ|BV? mr55|-Yel'*#-_DC>FǼV>F r ]AJ?)cIB_I%6%-)=H`a).U4dUVY8F@[zOW2[.KVXL|)'b]qᖛo GэƄ5?98wfuv8ȍV|E\ 34S8扎o<=ꫯ`~}k_3s<3j+x=/ by^yMc=6izS0S# f\lt?CP]/|fy癏fYOC9$Hh,Ifqz_qcz{`#́=/ᜳC3/x,=OS&l0`{ -PkB?tч#V[mr0$?G]v-xR_{5y8K}Q_ m閍9$mm6\_fIM9ab:| oћSM5n0Si(?B FlMq}bjm= :|P݌X o >p Q'?qwzW>-{0k4+#I࠺C&'F}4le->ܤtCnЯuXxᅫa8F4K_9ǟ ay+_ @ *'^+.ͪCXϣbXs.{7{yk+^*Üsso%qsꪫ@afL^64GzhK3>+#fZ>5*w Z^S r v[!k{g:? {2x/~ٶ _eTI.5ybi6&Ǜ8ۏf~*YCk=uY'# [uI[o3k6{pe8Wo}:>79 8KZk|pLJhn9ZůS>B-ZrIu3cnxr ΧA$K30` TJ zZxh|_/kZq\-4ìҮοZ!$M#a l|ǟW‹y?L?Se|qR;D+{[or Zn:!#g9f-,Ra'XHzEqZYZޥW?[n323||"g,YX3z=K6O6}isڛ.;a' 3s5gX[֭>qx)g~&<90htO?gqF)Q9wh' ?|xu> |1~;ND4xZ6_/eܳυ'||fdO@F> rXt1G%qA]ube<{SIXktm͠s⊘Ԝ{ ˇIJ,C֭~r뭷#}ޗ*k,;Njʏ9aS}D֚4~Wk`< z% 3~4K⏡aN рTJfYf̗խń4z(9u@nqZL#h/|N8(tf E.-n_Q1G.'SL><+X ֓N>)ǤDtؠ+/=^N>w(V@pD';g3gy:vC`79faF}E|k.ڏEKhv-,e:uE, O?Mkq0LlZ$GZ/JG&d Gy$B|%qc96_̻{7Ak^ɯdn1-/j_{=.}atMa?0~rc4SYgΠ\N'[lA3>0 |봞Z|p[E&zmaoZ6dWOlff~o<3 X+ܢћDŽ,dW>1 . avuׅwU^M3cSzd& i? '5MK`9UZ_NIv*Z#ڧi034V_`v/6/o~K/?~@ */oX~3vs=%{<}x"ʞ3PE1V\1lF_˿nvWN_,~dV=ATԿ{9fSz'=w?f;ll؛oЬQK/ Ol+^7LV_ zJf?䓰=8־\ۋfu0쯽Z[uYq>F1qݱdz?:2;l43<#nZ}\mi? n>){Ϸފ} 0_/M_^wu`R(7D4H˛FF˗_vEOƛnVYyU7'B.V{Bc8qR)^ 0G8HR(%ꫯwse=eFJE_~%M!D s='s=a#ʌ*(P*"{؛aS?[Кj.tLߡERY(%uzRySC\+JXˇӔEeZQd4 7L$}z^?o") ޷O)f[ M B3R$)_#7-[í'iE~5p_loypc/z#ž{A3ߴg! 1C;D>V`38<+4GTdo~ɧa}52w,B68Ly02,aM6bqzœ߮ӟA?^G_$>2LADfB,z]gjm8ɳP솛 N=}yV`Ff;>;CNOSl?@>^vu^p2HyC5ʇyG}h 3g6^a$2)ȕ= e!/8Ɂeם'HMB@kCB.=o=χE_\l-юIiH8~GySOғOz7{ EVyliî^UCO=ǚc2~2 ǸuaAmf:vbD x۠ o@jbOt+Mg0f^m1I\嚎M +xm~~/P cN)?dwa]w SO5uꚫh!{,b*^;D3ZxAZQ֍dX߾kkHEk0gKO>%<ȣa˭yn}7+32cŇ_eqnfYW#f Eh-Yg}/ֈPƍfՔLFe"O?D>kmVajy<aF#FtR01JNy8dk'DEzAY-OdAj`'TIfe Ң2n"}K__g'Xh>L*ҳ›_Cݤ ~YWTd?Tb}QQr-`΄1"=+yc>PF!~=FqN>rzͦ4ۻ0h?U寴Ҋ(?gSq`yfz xŬN>p/[ Ӣ2n}ŹRK[װ 0։ѻ<v}ݛpZwwӅ)R}oBqʯLË'I\} ykZ~SMswPg|H}s&Yˏq*<1,PnD {=yUyt?R6W_E'RKp/z$?}{k[Ҭ4(ƛ-#iRn7FX"ٲ .H _~y<>-,T; qvz#h- dЏh"͡ޢWG+ X@uXUicV܅#Ox}un,0kȻƴf]C  G_R~|_K|+u #83o?߱:tP~17}yzoWGwAշoTMvA~Xѥ@?~.Jiv0/ăfEJq&0{!ېb;?>vEӚZ,fvuO=\t(-~./7iV2zmOCO@yMv4K-"Ҏ:(zﹰ֚k [OL&MѠw [lFE-X?f.oy%3؞bΫpP?|囊s?>:whPonˏy,”~}No8Hiǝ§4Ҋ+M -_?8/D㟺I!n&Į/xtg@`km>)z$IDzԝ 4V?U˫2lB3 rўP+pn- R}(߯Hbjpm?.:kgyz̴\7)z([n|2G-+p8^@Zw禯Y^ffx.mv* ³˷ 7-.W>WV@ߎ,lEi#$*nʝT%_zF]t1YOx4!5c^du5Ҕ4!AVpCV r'x 4% FHUFܐ;k )i0B2:I5^-MId7dNniJ !+wR@pKS`Yet Yj[#$*nʝT5Ҕ4!AVpCV r'x 4% FHUFܐ;k )i0B2:I5^-MId7dNniJ !+wR@pKS`Yet Yj[#$*nʝT5Ҕ4!AVpCV t'JfJ&stF!OfyMC?RF$ZnGaW]uf8ֲ{vyGu͘؟k>egj4vj22?"xp_S—@}tgmfMZ>W.Ws5{MAe,EM\߆o/x/fJ&fx%@!s EܐJ+ F1Ҕ4!AVpCV r'x 4% FHUFܐ;k )i0B2:I5^-MId7dNniJ !+wR@pKSH|ɴc2б^䉴J* F1 qz"EIz%_˼OWYg]s<;gAiV-/O 4 Fp؀8P F@IDAT:u`c^=瞗MG:,I|M9ߝ%}`q 9]?N^B^\0'9^[=蠃 #%i9j̣/TFUV]`5-YWI9 h`z( lZp8([9> L}7ae[.DkC^*B57CaZkY>93iuI[n˷'zaYd+z= ij-Y/dw Ehv$Ff5M&55y:z%sЯ_?aiYf%}4s!E ; -F[/zXJK lLjM4Kg^f(5Ԍ,yJAsVSe͍wy' V]@Yh:0{Q(i}_:lʳ8ҡPS))s'f;5$ ?o!L2ɤ+c`['?!S'G2rN5{Ͻs&WD1G7%e,dOt".FO8񳽙yICP_ yOő{w6wl?}fӍL/̊ĕ4!诺+K,:&g}Vzw퇅Wǫ4c.C3.rfaO%XRxۇ>u1-'ӡf>f,{ӗ=^TMی '>G}tЌ.PLYw٫Wj=B _YfizhˇdqNPy ]wMqqXvm0bᕍh&R|<1U=ejh=ԇ)dʀ0X1jKb^rY|vcw)MiW>+oOD0XpM W5tf2CF>$ژxvG}Lz2U;'~1aIC`vӇM΃L nÌ%Y MT$l,yGH&s)mveJ^,.N/? 2a=w`M/n>F/N͟0WgN%NsL~Gqgx%:pȐWa&y"dLlE4~piʺ /D*.E` WHCʅN>`䩫/`|paohPzbd?H&=̍qFSlm_mhРAt5-q؝f)2_O?38W#ȣNҩ|~ߘ^\=c^?~ة-~9,_S#鏑vQ? ;C@{!:L4tO4ˌ΋$?AliSW]} nwp% BCi؜a` kzkua[m%ůao5֠?. oè/Z@<(ݧ. Kt3A },GT9_W biǃg~?r|͝路."jkC-?I f^>j;Ru7_]>2q2pŠ+Y̸\H;*'F4*?jx[kCy9昋D]wyGQ.dLr&\Q|a#1}56ׯ%X"lK!arl?mn` 3(BPEM׊I*5Y$ztO?=*M*ZkG3ǝp9-ehzrJn)8BO)A狧lUOC^u4MT9:}+zxC5A_. ݴu'1M~{yz7a &QiVmGr! JPUQP[40Q.RAPC * Jr&ʅT*j(AVEAInDJA %(ܪ((-(R [%EB*5p$h`\HnU L TP­ܢr! JPUQP[40Q.RAPC * Jr&ʅT*j(AVEAInDJA %(ܪ((-(R [%EB*5p$h`\HnU L TP­ܢr! JPUQP[40Q.RAPC * JrnF~0\Paks@fsxHv~m^yFs ƻ0kNYX|_>#y4,΄Z䯣{%[6vo ї^xِ!C:8v1Qu^Ay+]n0pt>Uuigz>SD?*~@[?voKxmAMx`iB\08ŗ5F?굉n=\>T%@{`f@xh^ Gzi@PC * Jr&ʅT*j(AVEAInDJA %(ܪ((-(R [%EB*5p$h`\HnU L TPMOpvxCs%K"k>^jfBj) [x REGЇ\$( _Li> s5hzo|g}q7}Kz[⊫yYݻR OTVsxi0|FܗYw=z2{+(^{эH=M ]{8<{T&l_xyzx߄Hj܁[Lǣ'$ޤ pߣi $ؠSF,? R:b ߖ0s6sm零 y-#V: _2ji1zD;^Qq۟? 6jO!?O+Wq }X[2C6^+^z-Oo-`+DO)4O˿"Zl/2p( },.\aB?ZHY2073x>IMAHemyV">4'hti/7{kwǨm윆9C򊶜 yM-fEyŮ>A7|HZrq$`tM'YLiV똷G ǝ\p5~vp?1yE_zcd4{i묷nXP;j ]z̜'p rr_{Xx?ՀYqst[!5E׻2HH8&[ԋ2P4U_45}w|mTMoBB >JS)<ܾTo c?A7ɴ's3)5Rc$ ZC%:^kx x ?Yh: *ռwKLl`LD=^cex j^ǯ'؎(4lSgԨdVAk039h&|G52pGׇ|5x1*|ןG7x#H_uR!:_DY_jK2i?ޅ{#$ /(=$Yɳkv\[n ^~^$z-ǚ,nsr-zKbk9Y300*@~Iv>ȘR6"|q3!6v&!Ґ1a<~} l1u24Sj6?^Badg|1iEȘԢ oPm0;ٙdLZj'xBxK㐊Oh+B:*c*w:>~x(:9IwMd։}|f#Cf'*5`rGfG#W#oȒKIJzqrfDJ_"PTRI3Ga0ݝpbz@ ?lVTR*$ˢ4jeI.~_/<ЃwI?VX!lfۿRioh'Ec R,?-}>0Yz '?Sր#4{_/73ʓh 4S8қa+HHV|!y_럄CMkUB?a Pxh@b z_(_+B/ CBaQvڠXf, KꏭQ"j {ry@ico {޼;Ae!\`7s c>z_A`yϛ?_'@Pcm {޼8x2z_A`yϛ׿A"BYF+V1:y/ HD(~ 6Q=o^bze=֯X 0_׿\O ,+F}/BqHɘ+G#j{c0l|Ϗ"^;؂TF׿yicI 0&Y )yhPJdmoaLI D." ~C$A,?Qo#A4$k{cAhi?y 1>>H4돃D 82R< 1x=:5/# p?^\T@Àȸ6oƯ3=E1xR:r%4X?yVCG1׺rEMl3uZ.`:u6M3 NͣqYب ߯KYw즣iQrDɝAu'RJm:%g@nrL2O$Z9IPEMLnqD':k yb]jT#N݃t s_qI B5婿/ ǺT("yǯ?ǯe!ntixP@єr_Uc`3T#!Ҹ+MF3л Rfwɥ4@C"/HKi2D^&d4 ; M.hzwyA\J 4 4&hAir)MF3л Rfwɥ4@C"/HKi2D^&d4 ; M.hzwyA\J 4 4&hAir)MF3л Rfwɥ4@C"/HKi2D^&d4 ; M.hzwyA\J 4 4&hAir)MF3л Rfwɥ4@C"/HKi2D^&d4 ; M.hzwyA\J 4 4&hAir)MF3л Rfwɥ4@C"/HKi2D^&d4 ; M.hzwyA\JSf z3OPA9Й2^-o˧H\Lp*Sx^H;Lxn hXA-͝8*S$m.׎Eb؍S^Q-ıٽe&{In$@%%&d7166L)e x=Pl=ZB.kgŔycۙԤ IjjyCI-CokH p$55' JT%:~&1֮2 P$ Sar k`ǟb*U+ _v_G3c_izL@~_~m1G ~G~? e"j3h;drBT.+^~El҈WA!=%v",4KALN(0v4?x:Φh29BzKkG>ylF{)(`!*Vۇ0KǬ?d76cJN *&/ O " 1i 5y?pi@ͮ *)&0l`ܗXcEԜaMx?a~v5\\l-k?t@||i&[܁.ӽG(\ [P#EPbhF(L^>=[\45oEbt?~37E5-&ܳG_mam"6 ^`,NI[Lׯ?ŋ'I74[KKd$]k%(_EY,;{+[[YO#a_۫rHt_n${h$?&(z?A:KJ<";/]2lK铮¹,Jί&(w쯿qQ Fm{9%*Jcf̣I fzAo#@:T[$R358ֽnK`A&] 4kpw-wMp .UU_]3swB^HR}w/9ukFSnpE*fϿQ%ղQ;=@JA-mKAڙvxyCKmYNv|x[4i|-)'4+&@rϿ!PlTbkAlċ?E3VZRMG-(?6* 61矢HSl-ئid?4k*3GV#Ժ&lʹ05w0PQ>sF hq6*3Çq)TRga?F_j5uȹh(Qu0PQ><11H)J q6*3Ço %H8 _?i FCC /۟4i#ECI!!@EyfOga<3|xq_ETS] X$lYնt{Q3\) IVfp@a!tJc?W~ǣ`rCit2?O+?=}kTS[z^Ͽ&*LTGkVr 2|xCmv?13 S\)|V岁?P,RΕ|o?$晵}q;$n)hUŒt##Ċ- %ȇ{/݄N$.KK-Ÿ8ot;R??Q?;?'5i`E- %5?2ìp*Z8XQ1Q5 JPQPpt̎VK2Ͽ=wViKd{PG~;O4 0.e|L ЙD(DLiv 吻Df{UkcPhxCbbcZT*S@,[ڄmEy-cPY?$'`2J*SEF_Ͽ%'`2j*S@,/Tf H/ ȴvZPfފ,VQۻmY5"@AnBR{"`ekFZpYDյ|E*ʲ׌ಈk1HYUeYkeUbڳ!(^3ւ"#g-BVQfdET]GjZ,{Z .ԞXEY\Qu-=k5#k-,Z >R{"`ekFZpYDյ|E*ʲ׌ಈk1HYUeYkeUbڳ!(^3ւ"#g-BVQfdET]GjZ,{Z .ԞXEY\Qu-=k5#k-,Z >R{"`ekFZpYDյ|E*ʲ׌ಈk1HYUeYkeUbڳ!(^3ւ"#g-BVQfdET]GjZ,{Z .ԞXEY\Qu-=k5#k-,Z >R{"`ekFZpYDյ|E*ʲ׌ಈk1HYUeYkeUbڳ!(^3ւ"#g-BVQfdET]GjZ,{Z .ԞXEY\Qu-=k5#k-,Z >R{"`ekF3̺(Tu!đ!3 z!FdRlt(<9)/$Y b"4g/ ß(Žۆʘ஛r53rTYbihNJQT\&VΆD^o m7hX?m|8x4j^Xo1r;E2WF 0|_N@L+</ PD(Өz `m#g>8x4j^Xed‰񌹒ĨJXS-o!L$Iӷ~D.9#[N-CڨWv/,VDKј۟?6 h$VDKbN2'@/"B!_9D)ђxCx5 5$Z[y-?y 1::P4FA̘"BVuA*<tsFajuYti۟?o.JC@Ua@edEP?n?Lެ7}f4J 4} R g1D]Rd8y 5"hQ@c7@M-pAjj)E3И .PSK)2ƼouZJ 4} R g1D]Rd8y 5"hQ@c7@M-pAjj)E3И .PSow@IDATK)2ƼouZJ 4} R g1D]Rd8y 5"hQ@c7@M-pAjj)E3И .PSK)2ƼouZJ 4} R g1D]Rd8y 5"hQ@c7@M-pAjj)E3И .PSK)2ƼouZJ 4} R g1D]Rd8y 5"hQ@c7@M-pAjj)E+gilЛHtbj*(:SY hѶ?E@bPǟijrDJ,8YˤhFFPocQ>wQ*THz/\ne3\E$"7J yGm >g2[DQ*T~XGܢmy) Q9uW[-")#rT۟?r(qID4`uOS-nuMX {C8ѳ5YЛG5[ Z (ˁAaۤbXzO]mBfmF_ϿyYmRka1,=x?4ZƭԘ؆mNʌIk&P)X$(,a)ڤZ|q1rXrDZö3m%rXrDZ?o{l?^Q-M?>g^{ n&t3h/$:^T=ZlƺL#J#0wL5,HsS,RmŴ@yk0HVV #ן?bΌdL@_1Gɡ hGoz m~#k3hg!twФ v\"FKPo?GX4Ka`AQ`qh'?<$R &%XPϿϿ:_Ͽ)q6I&HI /?+%5W'I~X'UR"kQX{CRAz{?TJP(X?Z[-ECZICdyҶtt)]a(P ۟?d/(VElLJϿE3VؒR{BRm$k{F%Ć9|xS4i|%t"y= c bc>֒ڌm:j<؞@yQMa1ߝC3̾2#{tma?B(obF \s8 C?gʹ0f|ga<3|r@%5q6*{cV[U8 _ga<3|xq'AHPRxt0PQ>8x mh()->(.?|fz[a LktzÛy5x+ uɔ^KT߮Qpu5 !? B:Z7Kac]fSL>ExK/䒋馟4Մ AQҨկF8̳ÓO?I% /KO 2`boϖoBP PB[~Fk lKQ ҨR'h m)J0VPV-EJjJX5(qXiT@ Zk¶%BP+ A+ub@ؖA cQ5hNR8Aa4*ԉ5Za[!(FԠ:Fk lKQ ҨR'h m)J0VPV-EJjJX5(qXiT@ Zk¶%BP+ A+ub@ؖA cQ5hNR8Aa4*ԉ5Za[!(FԠ:Fk lKQ ҨR'h m)J 7pCxAaРn@s<OQ>FEW]0haQG3~˒yEDO9"=3Gt20Ggu6z[[!,! g}Vx«&h0`:M3MEP'}p% khO>NנSONc‹3LUTA_~v,$IxIpz ^ 3QkNz^2L:$b[MVs Aՠ@ؖA cQ5hNR8Aa4*ԉ5Za[!(FԠ:Fk lKQ ҨR'h m)J0VPV-EJjJX5of_9D駝>6lagK V@ը@ؖA cQ5hNR8Aa4*ԉ5Za[!(FԠ:Fk lKQ ҨR'h m)J0VPV-E. (JhmԔ7x=TsOXhEz"w>2}G‰'(WX1 U:ASSJN9O{ {X7#dZ}ws=/|aF-\!M3Rէ}Nf&݆MM-ɼ"І,&݆MM-ɼ"쮁IaSSK25 IaSSK24khmԒ+mx͂hmԒ+(t65$@^ t65$@&݆MM-ɼ"І,&݆MM-ɼ"쮁IaSSK25 IaSSK24khmԒ+mx͂hmԒ+(t65$@^ t65$@&݆MM-ɼ"І,&#<vi;#Ԙc}Y+ 믿AzS%,!Cþn&ݚp 9⡟-Tc=dFoEp?[3_|pa)5!ss0zi+0ݴΣgF~Cm*D@!C?>\Lom3 r7qWK5\rC/D4c :j8¢TA\m~NK[~=e]&?|28ɤN<)Li%ߨS{QjW8t65$@+&݆MM-ɼ"PѤ۰%WZl46ljjIZ&݆MM-ɼ"ʧeIaSSK2(/?<\׿Ͼ2Btq ^[zkN?U#"\IaSSK25 IaSSK24khmԒ+mx͂hmԒ+(t65$@^ a(i̓\tQAsQF1= 裏AH-#i 7|# a94Z(ϔoBs=a&ZmUWkӆw%|@dLNuӠcU: cǷ69 M: ǀx^-_??sx{Dw=<ԓWl@\_ 7|f4˯>7"lFK3G[2Ã> d6 s9 $}E acZkvig2(:٧RJ}!Ɠࡇ*~RݿjW4Z3l2w w}Oj)͑etׅ#8 3vÏʀٸ<`@9`+aAC> qf8?I'gn,4uImaxG~+Kwwv4 6Pglɀ+#8,va ^xaw|5_pї~P{S;j~8#]aYgu k ??}aץ5-+0\H -:Uk7F9Ҡ?::v HAmfO"@s cK+8qC?^'.\pŗ%X׾\{ ƈ%@bM/BXmM TOyԨXK_ofXyH4c+ nk+^{UV6|;В%v6꫅5XC /8[ʾ?a)%2ÌӓXb7t 1n?hc2owUWF7ϟoN8fm5}V_moK,8.B@TOٮ<7忺Jm_u O _| vۓj5 3s-ux %ڡ0ϵ<ܳ=4Iijox'?aVC7xXRI&0 >K7Cf\sU4K#^wݵ2^N8ͼZ:P0oڊ~"*aY2PYqU]E鿥~y:X?KRSH[<`ٗ_,Ԛt!Xa"~SFA[BKǟA;Fje-,TMaje-,TMaje-,TMaje-,TMaje-,TMaje-,TMaje-,TMaje-,TMaje-,jXyd\믥KB% 7~8s`Sp6h M>Ewq J}݋r̼*_*<| M4DO:`e0 3y+,̛qfM~$JMT>{fmro{/YKn5 첋~|jP+4n` j P+4n` j P+4n` j P+4n` j P+4n` j P+4n` j P+4&@8^ =N^2lEEmEgr7{-Nt.ƦY |k:{4Af0?Z >E?>8S-|@+ 豙 :_/b秲>basAt'w}-Y2/VA)n_{] IR7h#_>yGl<:ܚj)_i]PKwO>6Z"3ۦJQGU>k{>:Iϲ&^Ìgz4<40fN; yQ~&?C +W\~ydɪīg{=i4o zNߵIrŽkf}!?/6Rxo0 }aaË/,S{ܱ4X?Z_*L#giЈסcZGkG'3fm6:Gc|>3?F#܏6qY~Y x҉zkptZck0=x+Aiőh0wWkFc:﫬2m$4 :aUfPrvY-Ŝ{NO8c)_S#?4ȋ᯼#OH/4&fD?3p`=ZapӍ7IcUM3\bIf=܈o<a&d+)[U$c.gW(*W*SSl4])~,9?i$Sنj; ro~4QcPYnxU%o25p`h;Zk=GkZc#?+(?py?Z~/ѫ?o8o;x͓O>Y6$X6?Od,SH#5~ߢX0#afK]dn} rZkg >%tay0S녾FW^f)%SYfi2Eċ _Ͽkzb*MW4v sƒ/h/Ͼg)hkGlG9pmYX[@iFZ44pT4=yEn0`+.˛DwxM96q o&/4dz?OaЏhg)qypqA%B9<%;̩%pp iƒrePVQKgZxqi_Ci A:Ozem̍ji\f Ƿvk~,w\Z[ [Ź&oKʵ"sM@Qۻ l-[gEHEm6%xVdq$Pn[-[gEHEm6%xVdq$Pn[-[gEHEm6іw{Kd-;{>LaesWzޤWAf pGӬel6%<Wu^zEoOMu5Wi~dcѬ}'ަFo|O>zmڸm<Sl杷FId m mgڰ -'pbxrJ$X&O,2vJxVfY'tRx^jh-h l0ͮb-2Gc uGn`;FuIP |g45>6Z"'ЌG =!s zK[j&wT{⁾mq!|vszMum 2Kv;3ibӸa4 udxKQòFZ3ǣ'lfnL?J3 v~0S/8X 7_? 48,ܲk ?b.H6%\vQBm.KJ,2K_񆴆YVBШneK/fU𳱱Hu٦vzzIǹ$^&pz@z9焹ih& _m/e۾5r+mJΖwgy;_aVK.I3~숏 7_/,\u2ӊ7;#d@h>ym1;?f>YГO>!OAXUsa`^$z=x/isÅ:bs8:~B' Gy\^44% xve[chV$Io HpuВeĬ^^Ǽ,LFO:hcZk܆~ih ~BࣔKӀdk.UK* \ZdR(I/_qUo4՛ZT9A ap-ʋlQzbJV2)94A<,4MT:呇53uZp0c!*|]á^PP5ٰ?0֬*0KXZa?{+{1r;RJ ?tQ=2䈫wmv;n~x5^_YgK?,S遞w5r64of;#mvg[lEe3g0*o94xăH5vĕ ktqpi_7_{_24Gi/暴3'K?o6 ϳ6xZ {p9gh GqϿr Dv*-{??5~[-^{5e O?}?AW^}r4jp".7x#xZJv.=]8w=۔ Sя!&QH^ YRC FC[PNY9B%~aF$C9D^D?p>2M=>J}K,{α^y/g!Cڼ/smxLb{=lNם#Y~J喧gs2?ɑI{0Gy_jYI'a "?#蔶י}&C1ǝw8lc9:7n~TV+?_+,!d7uTS֔͢ܞfkSZ;JZ zL뢈w?_tZ2s Q+[]FZpYDյ|E*ʲ׌ಈk1HYUeYkeUbڳ!(^3ւ"#g-BVQfdET]GjZ,{Z .ԞXEY\Qu-=k5#k-,Z >R{"`ekFZpYDյ|E*ʲ׌ಈk1HYUeYkeUbڳ!(^3ւ"#g-BVQfdET 'N=A8cm~mf7 _k^p{ƯjL?&.>2zz4a \} /ϏxM7$׿:?_r)~ )h 'u-M~0Y\'|a-mcaOJ_r=Ug~ u!Z0_fUn&j翶 Z 8V/Å\Ho~| y7ʳGIr77koPٌv['Y.IYh*H1-:3c9b7 h|^g(-Nӄ5ǦO?unoѠٗ)(5X$Dz%az%5FEjϹ k38#?_Q}+}:Csݙs*b}ohaW+% (ћ2녷hֆm3e[^~֞C/~!JOZoMڐyZ\Ï ЌMM+YfYru0g^qci=5ڝrι 'pR#œ +e;#4쬳ṃuFQՀI`ffǓ4иgcQ F?:wSv9G?w қQCNm*\~_|4XW^ 't~4K/<O kcyW#82Ka%rC)j$Y/c)\ux{娔Cy+ Rgv:r> ~ G H&36}f Cn#JlFRuo%ktړ+,a,*^Rkce^,nniPe㝝O w\s m3FfYvSS>iqU AM7f %yWzȽއjmW#W^îxvl'N4c?akn21mӎ;iW衇 hSp9gg\&iӀyG0Zbڑ3d +lM;e*uiP'Y klPf)0YTh}||;ϟoя{cZ\z_iմ aVl?R>oSAFhJϦ7ob;z|4߈[yh-р#4lUgzd4sV@`D hiϹW[73(s@c9j^N@L+</ PD(Өz `m#g>8;?n:I' yg?Bkzdzpn'>SNE]Jӷ,Fђ'pB8gƣUE|4ygezm:Y2K?ӏ ]FJ'7xCg\aFJ0Bg2k8q?7jznG4$ɿO 5xM?ݴaw٪xr뭶{<>VAV|ΨQU,B\ʫG,C PGVJ^32%s( `l#g>P>{Ȕzu*<@5#S29ׁjF 0|׌Lh\ʫ^32%s( `CXGhm5X|\B(fԨ*sXA^|Yr0s›4)HkFð hv]ՠ^Pu'EkNoo < -Gfr.𙏓Ɏw\}U*$ʐA?eP!M!iG=v3/?2O˰!ϵ~\wKj~Id:s}sO,;1oels(_xEaAn{*5$Whi& ~gKcX~3hVʴޖaf/d>lJTP??L|f ;DG*n!LȟNk1[n)"p饗q0Ch(ǃ 8,>??QF5qcTk>48ʯrE3ئhkgVP=-I?<ܜ\Ypehsze] S/Pp9/)7/|07mKyV)d>޶MZuqƦR' ߃>/֢M6᫯/8hӱԧ/^fJ&Yz.#cZ2E #Ӄ)žxP7z.qa=7BȻ/?oH'gh~獶u<-=d,IF%Qwu}ֳ9ϧ T7lqߑñ4#' -z/gy״j` i`u}q?#[+?- j{daƱgqetِK.4,@q?Y(Zͺx /]27M2G͖aРhM3ӌg(sӀ?Gb,z7 =s.S9~Υ3b^!u~v1!]/?r"8?,2qE?Z4ISТ8?tE}G_ kLzm~QZʰ`32Xs@򺟬SN_z(MU\/}>:<ai'u_qo\X&Kk ya5*a440m[o kʢHc=f]@IDATYjiz^mpWv>uɓN>9|A׍7?>sZDzUp~xژvOvj3DPi,,@YdhJ82zg/kGLBzK/$/G¦E:(ʇ|i '|7 G}DeaS^܏5}SNvyп?zv|(@ܑDOx=3-*2A @B2hC4yn@Z:):Mm0Ȩǫ+y-T4%j?9)T'WӦ)Q ?w\SM0R(7̱ ˇ 7ذAc_i{QZli =0(w}HLǺkj3ن^x^~]yeϓ ۭ~+N5? wqgx~]I:ȵo%\xN#!?̳zX_{õa!xY_b?幓JIB0W6(٢xP(F Sw]I[jVSqNT=SO;Uvo´ߛ޲4{n !- V[Ҥ^#1uFeO>d6 /Ƨ7q2Y 9M7͹TvĖ[ozI xВL{%Ye?\~{ uFR9[}}Yg.{gɠ]',"sM4#^cO?l8ƲSO=%o)&oMKuMBm&(5>m¨M%IJ _IE u"4.V(XD!L_|!OKeBt`Uhj0A zZph_k.՛7hcwi>P޵rQGs>G["GE "T?>ܒg/?~֓I-X|*(R2p7SuU5'o?#s@@oxC44 ' _VErk,!Mj5X|jX~Xg)M@7irn塓4Sl]z[sh=~8}AB?ڔj&~XYf+xivWѳh S j[@(JzϿ|z|O1A/{?)õ_ \_Odf0x>JMhL|b؏6d'\I(o?m v vѝ#4ʧ@-/{?z/7AiέРL4kL"4ؗV(FN?u֙Rvg;`9~m< ᜳΖRyoV `Vc_^S9u<<{ꬳ wqGlMep~m_~/qm߅iF_k!<  9fcų`~h0Aֵ^ gy6 >owX-r]SL~uhLn(;fDxk/D;>O~&U.461FЬ駝xp+ugF s`/[?NZRʧ//2~p?}'|W$fXh T;WSNp-ѿӀ4nj^HÉm(_(0hmgka1li{C8ѳ"~kf!Zߒ]~0Da;}?4d<VЮa_ AXY$S|j랻شꫯMxϛ#}ιG _}Ž&0y?H8zl`2#& ?f5k12hg!|\Ф v\zp?"iīAA=%&F{#EnL6`I F{OJM/ ,hRK˭ўfi)V,H#%0b*d9_bۈb ? <6rHԘW%dM91b8J,%C?P;SQܡt1?t)_PRB;)َ?f O%fH4Jl- sh*}'5~.]ҥ)XQDFS@(MQP{MoE;H*;{w)y&~߻{<3$ٝo7jmuWc()|T 61-j wZ[rUJǷ4*2 ky{?4l$٣ck7 oL*U+byFf^WD~Fk|[*I 0hP>ъkWTB ҳ[__*ԑ`.Ѡ*=+E8D u(9<$ a4J oQ4Q2H*JB ҳ[?C? RGCbFOO*ԑ`.Ѡ*=+E8eW29i՜I$NɒmhKQΘaOjx?U-c)*_i W 3fO?'qotZmEWyǣSaJE#yqO\O+<}}oz ϡ TA7Th/D#]o75{P+Nl7_qU.*8zqKkd/> LR'ۏ?90utLar?Rz{KH{VpCZ)[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm Tܐ; )k0BlRpC6:֦ Iu ٸ[#$&7dΪ:nm9?HMZkjGt |ƒLR֚yJ!|3 >HMZkj'ZAdg|Oh\ 1h7ƒLR֚/ڟk! CxiAjZSHMZkj'_KTW<2|pZTNR򋫘X2=Y*)|X"rDG}HU^(X8 ݮ5#.oU %D NeQ:$׌7q9PO_o0s=Dtu6wk- VJ-ȳIݚ{KB,R lusf*ޒKmԂ<[pܭJ$R[) \'1wk- VJ-ȳIݚ{KB,R lusf*ޒKmԂ<[pܭJ$R[) \'1wk- VJ-ȳIݚ{KB,R lusf*ޒKmԂ<[pܭJ$R[) \'1wk- VJ-ȳIݚ{KB,R lusf*ޒKmԂ<[pܭJ$R[) \'1wk- VJ-ȳIݚ{KB,R lusf*ޒKmԂ<[pܭJ$R[) \'1wk- VJ-ȳIݚ{KB,R lusf*ޒKmԂ<[pܭJ$R[) \'1wk- VJ-ȳIݚ{KB,R lusf*ޒKmԂ<[pܭJ$R[) \'1wk- VJ-ȳIݚ{KB,R lusf*ޒKmԂ<[pܭJ$R[) \'1wk- VJ-ȳIݚ{KB,R lusf*ޒKmԂ<[pܭJ$R[) \'1wk- VJ-ȳIݚ{KB,R b aEr}O rZ0'25קn%n|Q(hDןpHbuOR@qxxw/(/Tqcnq0+XPuQd7onr6Nt P!ʗ[; _n{->I(\<4ChO+_%DOꇁ%.nСxCF3C߸JKPx4v( i@% PuVT߫ {ޢ|CDA (3A ' H߫ {"A"BE {ޢiz7llg:yqW $"Tz߰A-!_'@P~v󞷨A"BE {ޢiz7llg:y{'럾BqHɘ+I Z{cpl|GQB/RsrlAk'?_ݼv{uEŔ QQj@%ɲ0fY W$B? "W~ ɸ*! HY"ƒwq`MIW1ZD t2bBzpx:ngAX"B\|)"|qFa}W|鸝!_Կh.&B @q;Chf?b`bECq7߁}k)9 x:ngg2`櫡[ݸ]Gb4Mbj3iuz.@:iuv] RO)ͣsYب /?kvn쮣k1rD)Cm'F:#@?dO$V;:$"y&j&8I'[3{KM*wQE/uɢ{A; TCz֥FAɻ'?q ?qjJ+ªu)f"yoCX jtArMNsч˥69AGD^.4}xyA\jtArMNsч˥69AGD^.4}xyA\jtArMNsч˥69AGD^.4}xyA\jtArMNsч˥69AGD^.4}xyA\jtArMNsч˥69AGD^.4}xyA\jtArMNsч˥69AGD^.4}xyA\jtArMNsч˥69AGD^.4}xyA\jtArMNsч˥69AGD^.4}xyA\jtArMNsч˥69AGD^.4}xyA\jtArMNsч˥6af a( 9|Ǡ?g핈XQ1GiЀ[,QE<(؝Ӡ?E2Jj=p D@i56=&9 r%W1E)QsJW{=&I#v4h _ԿhTJqX&09j%>`nxGi{o!o8hYأͣQvgx fԿhDA׿A}Bڍh;[Av`Hp3<3-ZL["|vǓ4c TkGL-YȖ }Knm_o5>>LӔc"CH7_Ϭۙ}rl@ԿQz|;VRڛ XIKM _hh>eV{ n&O?!ZI?PVĀW2͏$p5/WE2X&g BɾEG)Ri]q5PdԿhD0 7?Ծ"+ b;ZC2+#?P= e"j ;dvB4h.+Q~UlUī ¢]p>EEN}8h` 2&׎N}'rRQBf'T)0rԧ7w]i/,dvB%1On'Yx3CJ*8)ʏGCm}|CFHLzMDO?a~A:PCJJ8); /%ؐqxS?Dw_]M!7$[Ûw_YyHs20zߖu|jD Ff$/_ӳUSWE@dRK7 {pϮ.Go'?qۄ6 _`Βp@j5ԿhrAXJ<ޢR+x5)'T+f@}KChmAlXc[?T@jﴶ:㫎1oiT?>*ZeO?U5Z;-c %E[VĆ5Ƽa6ʍѱ?7&z@ӪW<\AUzVxT+x?\AUzVx5˭$ a4JhE˵Fk쫊R*s!UY-q/AHUQrxH 0hPޢiIe:RU̅0TgRT%s!UY-!T#UE!1\AUzVxq'AHUQrxH 0hPޢiƲ+j $o Qdɶo4ե(Dg0ʧ N5<uݖұf4Å3'߸7?w-"ѩ0t\'?^Dվe ;7yN=Tp͈?*ߠO*W7_כ=`'E/UAAC޸?2WA&G::J0)%Ih$=|M!-MYdqgy6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6e FHMnƝUuڔ5!A6!wVApkS`٤:lYu^MYdqgy6Y[HJLzZK @ RRtC(G*e0i-E7S.LJLzZK @ĮdO0)e0i-E7zRRtC=¤Į$ JLzZK @ RRtC(G*e0i-E7S.LJLzZK @ĮdO0)e0i-E7zRRtC=¤Į$ JLzZK @ RRtC(G*e0i-E7S.LJLzZK @ĮdO0)e0i-E7zRRtC=¤Į$ JLzZK @ RRtC(G*e0i-E7S.LJLzZK @ĮdO0)e0i-E7zRRtC=¤Į$ JLzZK @ RRtC(G*e0i-E7S.LJLzZK @ĮdO0)e0i-E7Y03RepMv7 0ac[ϚZhjm`ƒh.DO{V[W`Z!V-.DcM!rڽyh-.DcM!SZmU_ٛWi?JT_H&3oH+dŒ)u#h}n X!} *#ʏGOt+ltޖjDpm x+H]a+?2H}[+πҧxgdYU)#cF 5ܦ=Q~_>fGBPWPA7rbawU0Eh~3yXM1੽L;H#`TnS  L iTPmܣr! jPM1P{40Q.QA0C *)jr&ʅ4*fA6@MDF 5ܦ=(Ҩ 5GB3Ԡrb&h`\H`TnS  L iTPmܣr! jPM1P{40Q.QA0C *)jr&ʅ4*fA6@MDF 5ܦ=(Ҩ 5GB3Ԡrb&h`\H`TnS  L iTPmܣr! jPM1P{40Q.QA0C *)jr&ʅ4*fA6@E\:GSףΞd4LQ-ۢў VKASEUbƞ/_5RN?*uIEgR T˶ZK[D'?d܎ן7^kn7DO3`VN.8M cLb(D.w$w;:tl3h ʧhD!1q5JNv<絈ğR'|p5*G`h9AZh>w GQ8ӱϠ(>Fo' t:4 AvIkMmD`A>`ٙ&5Gs-Ġ`3 >HMZkj'_h4 AvIkMmDϵ|!<4 5i hbЀo0ٙ&5/рHn\Vf``-S*')ULc,UҞafQv,@U9E>__P/APU,no|cruqE'ɲ(}kF\߸fZ"^߂:}vc5CW)tM[nIwq{zŗs̑k4OL< #︓rŨ-G::lsf!ssNb _F7&ytM󶕯vpj+Q/ȳIݚ{KB,R lusf*ޒKmԂ<[pܭJ$R[) \'1wk- VJ-ȳIݚ{KB,R lusf*ޒKmԂ<[pܭJ$R[) \'1wk- VJ-ȳIݚ{KB,R lusf*ޒKmԂ<[pܭJ$R[) \'1wk- VJ-ȳIݚ{KB,R lusf*ޒKmԂ<[pܭJ$R[) \'1wk- VJ-ȳIݚ{KB,R lusf*ޒKmԂ<[pܭJ$R[) \'1wk- VJ-ȳIݚ{KB,R lusf*ޒKmԂ<[pܭJ$R[) \'1wk- VJ-ȳIݚ{KB,R lusf*ޒKmԂ<[pܭJ$R[) \'1wk- VJ-ȳIݚ{KB,R lusf*ޒKmԂ<[pܭJ$R[) \'1wk- VJ-ȳIݚ{KB,R lusf*\ P@IDATޒKmԂ#fuQ\z_`瓂DLJ{2 ISN9%}%|cgJoqdIIϜR/tP?O)h⤉w+bZb%߶7pʫi?uY'}a޶W?#Gu\w5_I}?be?g?{FX?j*bCo"±:gqO\o\sg鮱 Kx7tsQkp CeހadT5JyCڽɒnr6'9I⋧Z(M_?&+i4lM$Lr/K.M{L1θC5uRΨi%L_B΁b!6oV[m^}US%a?*G/F|3m'>q5/ٷsn0"$W[p;oS"э*B.4J@M"_?{o  ŭ7<޹[nM[ L2iԧ?"_0tŗo>M0D鳟7-b铟G_>ݖ|)!?*&|SyK'ݤR\VJ`ptکLG}%e٤tŖ[>lnt}ly?_a4k:9o[+Ӵps锓NNojk:py?t~Mȷ>i4"O3IC b4΅K{gk%9= SzӡN9&p! "R9@yߟ-R@*KHo\;@yG%N@)W63TE5î{y4D7)2=:HFgb.s+dޣQc _i3B DWI'=4) ZiqN.[ p{AƩ8M.K/K1:`һڡ@dx6g؏nv5xwW}QPE#׿w _Zk7x=֚iJ2G}G׾jzZҺ:/c<~4ok3iuKut-F.H$O>vu q~>nks`]GR5S=$fF:#@(%8 )_JF:#@QO4Սut-F.Hf ,rR>;ʿ{J8fy4lh1[iM5^>4)}J7=3vFaG(}t =󿜾!}(jYf?PGl]vYh;]/p.ۭM{NZ}&lbnd¶K.$i /~B뮝fuV_0}c[oMs9zN!nV[K76ffa0CsZHfC& m%nu#w] [<{'za߱oKh{.yhL|MX9)̞g*xӍ_ꩧ4Lfe ǟpK;y陧_) i//Bk+N\P3t|W Rz饗E_~z44ӥW^1?.և^}t4.K L7ti>>Ci,8ےk)>CDz%[oپf+nmldbWŞQフ5O3]YT7#8vc4ӈwPvyhz~}6z3ɠU$hy1Ǧ ' LSM4SMԴV˟)px\xh/hZeXD54{d@fT"y&jr8#@?{Q"@Կh/L^̨n}ij0c~C>~]Kt/|-I_K?g,g^{g'sZ{$Dn6OU\+zD3:eɯGL??Ff -:}0w8Ӟt_:쳥N3H^4~(9gv44`v yC$'i2x㦼Jz^s)|̝PEq3j\nDOMNM N7.? ֟Hs3o:d>4KuAn-2|?K??:Ge ~gNclrs^M9= /H69AGD^.4}xyA\jtArMNsч˥69AGD^.4}xyA\jtArMNsч˥69AGD^.4}xyA\jtArMNsч˥69AGD^.4}xyA\jtArMNsч˥69AGAH L3N9y4u|Z˧mVu1ҏtuצ64j%B??쮹 Dzfx㍲6ټlP#Ajfq&3.02}Tf9\>ϒum<Igf?9%t&9à R栣"/HKmr>< ].i: t&9à R栣"/HKmr#:2]O}w⋻Tc -$%nzmeʹiDo=ׯ~i꾘x]|23ɧaǙ4;+/OS$wۍ _uUg$s&[UW\n4ŤGVv3MQ(g:[le:b" $-Aq9`Z:`F;N_54h7_:3Zq>Hʫ VofiR[A9`KeOٔ>ȳynͶ~\]w%Zwu|Ejx־暫K/oQgyvh ꫭ.q^7$z`ÓV^e%zHE-*oq ]vh 3KPC'T7hΑ- ajٟwDJчh=w؞f{M g+< j4RV!f]EDF ľ+K-EFOxhD6O2#;AU ;_y$M_n6~zdK\Q$#$gq]bwNb},"mzcTbwNQuٺ6x{LRiЀV,%l1E A S͕ڑW%z=&I"v4h={:;2p].i{_^|f?]JM<$i痧[nE:}mgdmK3=~E8h?tOwءSQi]vMuxiZu{_]v?~_DfBlJk}j ̪+z2WӇz(]s2[mիҠoW43@j4mhfp<-4`F0qG_蛂^6bwNb閏Tzf#v4h ʧ@D'Ƿ=Sğ" qq1h-?y>LoW W?kLh#ֻmnq>` ςڒkHk|}$eZzkl'y+oQl@Њ+}'-ؠ>zlӫ[À.?MȲ _n>@`xlq6X}y}}7&1aOe{/=H^~{׌1Ar~W堰|tu럴'fءǥ/}R%c~pSad;0$]ҟt\袋dA5F2JӺ |cq]LHRes*Wѕ_yޓO>MiWf5䩈'0)ʅra =|nvv D~k/RD*A6T˹Emo/_w'wyGi&Jȣ~>/w@kKOoJ?,pUvi4ӌ3u_ &݋vڟӇ!>;Nf,~Gc.Gz9N/K /pW_֧' d[}4ͬʏ?q4s~QX1T0 )S5|Q/5+yC*H6Cە1wkZugx fw=46 /Kx/WQUz`ugyf<ʹ!pE*wqgHI4{Pä!+ywuJ)4*~_^?Ƕ1k+bZOx;#h }^FI; m6jI~_#فb68>5yƙTzeӟT`ɐӶm/k_D&Wf.z5*L:>42@ /Hdـ|43<sgR2ŬVқCC*K.z׿-&`tMOR}o ZkEEkaGeD/;S>$;.Xj}Y< i?x9B]:)'pcl?tm"sM7۔>}(d` lKM=rƊ#TZ0o'5+G1GFE|TIBXj?r^IZRꛙ E+TKM ;[V8]R\ZnYvoNoIM{E_4ų&d4݇ra0/WPi҉'D-RZm4)_Brˤ%I&8{y_cO<9Y)fрlZ 0WR7 oJ_g>FwLMw&s Ky8=Cq{2یgڲ~<6&z]i+Z$~_Ь+U@k]p/VX;g>i{pOt@og7x&zʟBh|2ED]fK-p:]siZwNLV.R!;FR`s 2Cb_2㊨I}aRod>I~/⭹֚~J8y:-H_YkJ[D@jvp*OJ4pM =jR'w(crrQ;R#xCZA@y1ؼoԿEG?N=宴״6@u aWp_NK+Ӛ^>lM]q駴Lǚki+2ؗIr饗́F zeg..Lݤ. _v}tιiIA[8Q5J+1QOp&⃼~}+Ziz+?2/dΞg8rBffi&CsǓ+>N: ^_V7+UW iSĿSbj 4[jI__hgЛh ,Y{mٽi}J;|/k"{wyɴq_}UyHSL>EZK_JL7-=84K`rAoRY8pam$7{vz=뮧un;2;eDC{DND=.@kmLר7t97w!=Bj7u*g>aNo@KI-?..k PQEMB^ )AtQ@Ҳe?ͮk *8F5Qh !bS*{v_c*7 UiWZO =펿0e7EooH=-D$_[Z_/EW笳Ϣu`vHO1isds9sBo~ow+z`x}_yE>h53}٬D< z Ċ7W^y\ΎR[W_Ck0I{f,oQ40я~|8ڂ>v0 3~zo ӜˋffP',?Ipfl=fM0{FW>x,=7ʏo\!vq0X7ƾߠWmFڒ'7mJ5<_3nI~ӌgC:Cqרps=TSP;Ax| ɫ?cg1mV!coˀYJ?#~I3̮Qf-Ē(〉WPO^wi#kIKWQlHcШBcu\Kkk-e[nez=֓Uc~NfKxYv1#oo)7Ӫ&lNڃb*z7_>%z3=W|ɦ14j8b'˼y*g{cN{gGY 1}yaǕ}]w&\=<* p6OϿ<-F7Klj|05}I?07Wek3oοy~(~ާouT]Q\nP[qh*hO}Koޡ|"c_$}qIÇut-/>1ɗ,oVZEhO=J H&<O?KSӬz,_>FcA_1=?"h5X#BXl ㆴZSNcɌs̭Z=^״ưE+4!`GӁx_jXÐ q5{LVymoC^l|@,޾s=hʹ? }Jɋ?cvP+;Z/$8ǩ3Uh?r-k G)i!I9ah5gM?7dP>hhΟ /4?Ir '1Ֆ̈́^Ɲ`Ϧ)?8%}f :$}zQ עޢzC3()C5(4geᕃp)0'g_IυA*2.F1ϼx]{1zɦ<P+zR;s>0S)va(W\qy~KPrE,'وGs`٧ܚ>CyI>ʑ}S{iЗ/qDo-ш49뮥A#vMOGozO̸tl54hkOrzΗGοhD(?/_?'c{_MF QG?=lz}r=Lf UҮw.Ѻ^H |_(ZShqc3mSҽܓV^eUIGP˓{7+z+A1ᅚ{t`o>̾mEy6ɒvfJS߿=@sG}+} _KXV>'}nu0bOCkx@LMyY)bsyw~:bZ|%N4PƓLϓLQxg?֓A:1,6=G3VWuf?u7+R{2Ì(_qa3<sE / oN[[:auQ@>XZgN)?<|hrsY{~_ȴ2_6[|6x4{p?ZOn"[΀%I;SJjwEoK>?R,;7]x P!7IR)jW^}5mE^Hgq٦Al'vxQG4Uh4p'1+;7-P'[H7 ~#C&>*]zeҬ6z='\9={î&7$=s4Ĺa~Oll_WwAbj*Ȁ]? ? pƱd.;[@7 4"rU|=S:鍄QS\@O_P?'Nc;D74Î?hAfn2vġZo t?ZxY+g?@m}.-Ik4rL.J Z3H_uqʿ޻*+JJkL34K/tC[nAl'sy晴nI^'avG>O]Os ZP`dl~|=fL/ʧ(xFߝ'Aovy /;'YWjizPRz~K H3VY)vwS xgh`+X׾5YC?BKT<")+BkyCr^%ϳpo4۬Ұ3猿! _WҪ"Q>G_nwVWVc{.C +Wf5dh{&/C0K 4nU2K8otތG34~I&|h iǝvd}Xf IB -$3&B⍢LFצDMTã~v]wKd!]{ߧqW_}>x̀ uYʣU,OvTJq3ZŒ'MRgݕ$8+GQE\8䠃ҋ/"[~1MW8ӭ\9q+}E3‹,L_kX%tֽ#34#5;='q҆,בt:p:}{DkXpl\|ScDii:ķE%t`W'* cϟ=i|Rvb#{GG^QoDy; 5Z9f>tPR?!PhAlXc[?4<:-`40N5T:&f|Ci-ZkNM!z}q $BGK--0 =Ʀ<*qƙivl5WzGU_x1mIM@;-Sr)feg^7_뮴[44%}S2qZ?P̚fZti"z ]4/T^Imy>>7mpc?!q8{}ifz2;HCWGћU?c>*?x,ū4묳]7y5_fEMAkG_,kcju'z2q,fi&yנoN3mECi:mw~;fyVy3q yMipjJ7Gs![d?GvM/cSO5}[o_S*,  `jjq'у +|妊(sY+M35= :*~ǝ4xh2?ѹd}M^*'OR]?ƲL獔Vwi9`zBl&3yJ ot w_:䐃i LFY[t U5mŖ;ywy5?yUWӔ3GDZ>_;RO){RgAq}3|QT~i@O^|/#T`vaM׿_9e(_T%v*}?[?h}UQJ`.Ѡ*=+E5C=$Q|W~W==6̛m)XNn4{R7 ?uxlK.Mz `K/)EC>WzH_ siU1=eh&G:LyOgT|# 7㞐^u;v/"Hǡ4n4-2-<]pr=ZguROo6?y :t)OpT}+ˉr"40hPޢ|CĨ Tv`.Ѡ*=+E5J8qߴNG}wY?g2x+˨O?N~◿۳_jo?Fg?;x-?ohO_?iAG}Mg~BME\}ܞ0K^zd^_.{auvkB붝gYo񁡟ԧb|Ah I>qm曱[zԞ,/tL_jt~ma :[A'}k8+Wz%T_cݮP_5WO1'/>}ן^{%sifv?i7'۷}t^_|_'/7fʗƗh_90~Oc*ic.PojZOo|e ~sUfԞپ!=i*WWǟ^k:y[ cG>N3u/Oo'oWo я'~ {_ޖwf_Q>oz~Wãէm x[2?fgMw&cٺПf8_Ϳ1jy1[Oa#ӌke?uiumE?E8;~ldQOMm1_qٺA=p3^W6ϕ|yC{bl^p1}il}XaeE8HFf-Y^]Y<ٕUA@:;`DWgWV-"E>xuvebٕUACH^]YF>xuveb/RDWgWV-^]Y<ٕUA@:;`DWgWV-"E>xuvebٕUACH^]YF>xuveb/RDWgWV-^]Y<ٕUA@:;`DWgWV-"E>xuvebٕUACH^]YF>xuveb/RDWgWV-^]Y<ٕUA@:;`DWgWV-"E>xuvebٕUACH^]YF>xuveb/RDWgWV-^]Yo0Y>|{O[)#JxuvebzZ)^]YToWٕUAkR"7?8{o1iwԿ|}[KhYA@v%^]Yv;f Тc46kCb!wUD 5XtX'T`Q ,ֱ?jks֟B)rQ V@7Sjis-bgȻ(wUCB?Z {mk퉘ͭыh p5ʱw>Ϣ?ݾWĿ 3<־$+!@6lT$TLB$I% !dCE~AE H$*DrP_PQ2I >T$TLB$I% !dCE~AE H$*DrP_PQ2I >T$TLB$I% !dCE~AE H$*DrP_PQ2I >T$TLB$I% !dCE~AE H$*DrP_PQ2I >T$TLB$I% !dCE~AE H$*DrP_PQ2I >T$TLB$I% !dCE~AE H$*DrP_PQ2I >T$TLB$I% !dCE~AE H$*DrP_PQ2I >T$TLB$I% !dCE~AE H$*DrP_PQ2I >T$TLB$I% !dCE~AE H$*DR̈p.?M:ߡXj#QMg%cwX5Zc#IWo0yҚKCZk6g^3SO?۪yC{^3Z3#IO]s^jg 1؎YҖ9jƞ(xvpl,'*2r^[o=7Q>kZr"g{,oGgVȭ`T% |FyXVK  @1nsIXg2WzU*sD}>pP͖VsD}>pͿ65ll(.9W@$3 kCQo͖VsD}>pͿ65ll(.9W@$3 kCQo͖VsD}>pͿ65ll(.9W@$3 ?=av+-!*Ff;x`4Uh8q=F\SkN1<0*4BDE|4~MsNZliN1<0*4Zj cx`4Uh8j"* ;hpj{Y.t"v<6Sl|./]JVrgeK49jk{\n e&J?5Tˉk7v&G+_Oui[A]$;M&D][ߺ8mm^af;.vٳ-{& mMd2uդR^้]4B*b<7ԁ~TFHz]Ӄ&w:ЏjVyzD.SQM!u1Oe@?I#B[.sٻLG5iTh<=xn"{& mMd2uդR^้]4B*b<7ԁ~TFHz]Ӄ&w:ЏjVyzD.SQM!u1Oe@?I#B[.sٻLG5iTh<=xn"{& mMd2uդR^้]4B*b<7ԁ~TFHz]Ӄ&w:ЏjVyzD.SQM!u1Oe@?I#B[.sٻLG5iTh<=xn"{& mMd2uդR^้]4B*b<7ԁ~TFHz]Ӄ&w:ЏjVyzD.SQM!u1Oe@?I#B[.sٻLG5iTh<=xn"{& mMd2uդR^้]4B*b<7ԁ~TFHz]Ӄ&w:ЏjVyzD.SQM!u'xEw1yQ?3Fqls_ 1խFds)ͫcGjO]dkT+ͫ6c<%]kܨO [^a&`S;.=#_dj%B?n|H4|5CayKąZ|JhSoHc(l m^"-nzwZ/d.QiW/6}kEUQxKp\oո*v^h_#f7ѽVj\i)7Vj\iG8QEiYGl?]Pzr`?t-c#j|'6(CͿZ6ɲ=!6KJ mp̥mFQ쇺?uiA]Ӡ_.߱4x/BSm)&tr`?G=H5mƸkTyY#V\>܃4 LQ5j9VDyʓӝR{^+Q5w^;EW55b=W )ʺ~_Ϳla1kAWs5jSOwO8Ƌ:t[u`a^IShiϖYs2FW?̍kWm0m R&$ꃿ6N[71>>Ʈ{UjHP<|i4t/ZQWיVZoDhJ֍W3WZ\5$" +Z7RO?|URO?mU2[23n&t`{uf?%u]M_bN+6ck_°A%фuTߺG왱Wڎ X_uU_\7|;\6?yT?^avoDvK~YiRe_3"mJ#p5ڰ|Oj?´Dq/)I kSώ|yzI6Xp`m`j2j߹q^^R &%XoZ3WgS;6_ u'xK?6}ۄF`a`\j cۄ-v0\j -pjo/VsVC;.o>GoC:٬= wއΫjF5 JV;o$aW׳}yZj8XO?qfIփ~lpgk_ASן5 } _gx2n JL?CԬDʎa;'im`<]o<yӗ55jy?@zjѐ8?u]Y-5ձ,g91XOCѰjAYj'vY6ZqI߼dJym^cJC]mP_CEژ`m@so sfI*rW 9/9v%5IŞ/Ӆ>^:v%5IŞw.PЗM](#T\_ZJ QuQҞkAV:yn4Rqmp554}j]'ύT* .?^ka_miSv19km7dR88{tYW돝nmSYŢ+eG?i0fE?Li%w+UQO?iY1[Dj@SUQO?iY1[Dj@SU+̾~*{fl 2ujocm\gW,E8`F^ԾQ8j nxKkcjYcDYF^ԾQPL1GDF^ԾQ/ơߘ c2/`}/_CͿ1IeOy^R^GͿc29&7 菚15ds$M9< nxK{5b^q[2{4\2%vuӳbMomhU_3l@8i?[ןuqCUmEze¬r%euO]~ן[2zIxel>[?Ts5L[oLZj[oTu"qkm?uiE1[m=L3js3HuSom9#90yṯ}d6&k|G0A7 V%Y!a`=KsҬA0͞FfiV aaf\d4+D0 lpgiQY"HX6ٳ4(, $, Yklf n,5J6KB 7{%Y!a`=KsҬA0͞FfiV aaf\d4+D0 lpgiQY"HX6ٳ4(, $, Yklf n,5J6KB 7{%Y!a`=KsҬA0͞FfiV aaf\d4+D0 lpgiQY"HX6ٳ4(, $, Yklf n,5J6KB 7{%Y!a`=KsҬA0͞FfiV aaf\d4+D0 lpgiQY"HX6ٳ4(, $, Yklf n,5J6KB 7{%Y!a`=KsҬA0͞FfiV aaf\d4+D0 lpgiQY"HX6ٳ4(,Cq@Z0"+~"r:j1Hg}ʪ _ήZ #r:j1x)"+tvήZ E}ʪ 0"+~"r:j1Hg}ʪ _ήZ #r:j1x)"+tvήZ E}ʪ 0"+~"r:j1Hg}ʪ _ήZ #r:j1x)"+tvήZ E}ʪ 0"+~"r:j1Hg}ʪ _ήZ #r:j1x)"+tvήZ E}ʪ 0"+~"r:j1Hg}ʪ _ήZ #r:j1x)"+t$֤mIENDB`source-map-js-1.0.2/package.json000066400000000000000000000047641417156454300165120ustar00rootroot00000000000000{ "name": "source-map-js", "description": "Generates and consumes source maps", "version": "1.0.2", "homepage": "https://github.com/7rulnik/source-map-js", "author": "Valentin 7rulnik Semirulnik ", "contributors": [ "Nick Fitzgerald ", "Tobias Koppers ", "Duncan Beevers ", "Stephen Crane ", "Ryan Seddon ", "Miles Elam ", "Mihai Bazon ", "Michael Ficarra ", "Todd Wolfson ", "Alexander Solovyov ", "Felix Gnass ", "Conrad Irwin ", "usrbincc ", "David Glasser ", "Chase Douglas ", "Evan Wallace ", "Heather Arthur ", "Hugh Kennedy ", "David Glasser ", "Simon Lydell ", "Jmeas Smith ", "Michael Z Goddard ", "azu ", "John Gozde ", "Adam Kirkton ", "Chris Montgomery ", "J. Ryan Stinnett ", "Jack Herrington ", "Chris Truter ", "Daniel Espeset ", "Jamie Wong ", "Eddy Bruël ", "Hawken Rives ", "Gilad Peleg ", "djchie ", "Gary Ye ", "Nicolas Lalevée " ], "repository": "7rulnik/source-map-js", "main": "./source-map.js", "files": [ "source-map.js", "source-map.d.ts", "lib/" ], "engines": { "node": ">=0.10.0" }, "license": "BSD-3-Clause", "scripts": { "test": "npm run build && node test/run-tests.js", "build": "webpack --color", "toc": "doctoc --title '## Table of Contents' README.md && doctoc --title '## Table of Contents' CONTRIBUTING.md" }, "devDependencies": { "clean-publish": "^3.1.0", "doctoc": "^0.15.0", "webpack": "^1.12.0" }, "clean-publish": { "cleanDocs": true }, "typings": "source-map.d.ts" } source-map-js-1.0.2/source-map.d.ts000066400000000000000000000074161417156454300170660ustar00rootroot00000000000000declare module 'source-map-js' { export interface StartOfSourceMap { file?: string; sourceRoot?: string; } export interface RawSourceMap extends StartOfSourceMap { version: string; sources: string[]; names: string[]; sourcesContent?: string[]; mappings: string; } export interface Position { line: number; column: number; } export interface LineRange extends Position { lastColumn: number; } export interface FindPosition extends Position { // SourceMapConsumer.GREATEST_LOWER_BOUND or SourceMapConsumer.LEAST_UPPER_BOUND bias?: number; } export interface SourceFindPosition extends FindPosition { source: string; } export interface MappedPosition extends Position { source: string; name?: string; } export interface MappingItem { source: string; generatedLine: number; generatedColumn: number; originalLine: number; originalColumn: number; name: string; } export class SourceMapConsumer { static GENERATED_ORDER: number; static ORIGINAL_ORDER: number; static GREATEST_LOWER_BOUND: number; static LEAST_UPPER_BOUND: number; constructor(rawSourceMap: RawSourceMap); computeColumnSpans(): void; originalPositionFor(generatedPosition: FindPosition): MappedPosition; generatedPositionFor(originalPosition: SourceFindPosition): LineRange; allGeneratedPositionsFor(originalPosition: MappedPosition): Position[]; hasContentsOfAllSources(): boolean; sourceContentFor(source: string, returnNullOnMissing?: boolean): string; eachMapping(callback: (mapping: MappingItem) => void, context?: any, order?: number): void; } export interface Mapping { generated: Position; original: Position; source: string; name?: string; } export class SourceMapGenerator { constructor(startOfSourceMap?: StartOfSourceMap); static fromSourceMap(sourceMapConsumer: SourceMapConsumer): SourceMapGenerator; addMapping(mapping: Mapping): void; setSourceContent(sourceFile: string, sourceContent: string): void; applySourceMap(sourceMapConsumer: SourceMapConsumer, sourceFile?: string, sourceMapPath?: string): void; toString(): string; } export interface CodeWithSourceMap { code: string; map: SourceMapGenerator; } export class SourceNode { constructor(); constructor(line: number, column: number, source: string); constructor(line: number, column: number, source: string, chunk?: string, name?: string); static fromStringWithSourceMap(code: string, sourceMapConsumer: SourceMapConsumer, relativePath?: string): SourceNode; add(chunk: string): void; prepend(chunk: string): void; setSourceContent(sourceFile: string, sourceContent: string): void; walk(fn: (chunk: string, mapping: MappedPosition) => void): void; walkSourceContents(fn: (file: string, content: string) => void): void; join(sep: string): SourceNode; replaceRight(pattern: string, replacement: string): SourceNode; toString(): string; toStringWithSourceMap(startOfSourceMap?: StartOfSourceMap): CodeWithSourceMap; } } declare module 'source-map-js/lib/source-map-generator' { import { SourceMapGenerator } from 'source-map-js' export { SourceMapGenerator } } declare module 'source-map-js/lib/source-map-consumer' { import { SourceMapConsumer } from 'source-map-js' export { SourceMapConsumer } } declare module 'source-map-js/lib/source-node' { import { SourceNode } from 'source-map-js' export { SourceNode } } source-map-js-1.0.2/source-map.js000066400000000000000000000006251417156454300166250ustar00rootroot00000000000000/* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ exports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator; exports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer; exports.SourceNode = require('./lib/source-node').SourceNode; source-map-js-1.0.2/test/000077500000000000000000000000001417156454300151705ustar00rootroot00000000000000source-map-js-1.0.2/test/run-tests.js000077500000000000000000000024421417156454300174770ustar00rootroot00000000000000#!/usr/bin/env node /* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var assert = require('assert'); var fs = require('fs'); var path = require('path'); function run(tests) { var total = 0; var passed = 0; for (var i = 0; i < tests.length; i++) { for (var k in tests[i].testCase) { if (/^test/.test(k)) { total++; try { tests[i].testCase[k](assert); passed++; } catch (e) { console.log('FAILED ' + tests[i].name + ': ' + k + '!'); console.log(e.stack); } } } } console.log(''); console.log(passed + ' / ' + total + ' tests passed.'); console.log(''); return total - passed; } function isTestFile(f) { var testToRun = process.argv[2]; return testToRun ? path.basename(testToRun) === f : /^test\-.*?\.js/.test(f); } function toRelativeModule(f) { return './' + f.replace(/\.js$/, ''); } var requires = fs.readdirSync(__dirname) .filter(isTestFile) .map(toRelativeModule); var code = run(requires.map(require).map(function (mod, i) { return { name: requires[i], testCase: mod }; })); process.exit(code); source-map-js-1.0.2/test/test-api.js000066400000000000000000000010201417156454300172450ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2012 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var sourceMap = require('../source-map'); exports['test that the api is properly exposed in the top level'] = function (assert) { assert.equal(typeof sourceMap.SourceMapGenerator, "function"); assert.equal(typeof sourceMap.SourceMapConsumer, "function"); assert.equal(typeof sourceMap.SourceNode, "function"); }; source-map-js-1.0.2/test/test-array-set.js000066400000000000000000000067531417156454300204250ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var ArraySet = require('../lib/array-set').ArraySet; function makeTestSet() { var set = new ArraySet(); for (var i = 0; i < 100; i++) { set.add(String(i)); } return set; } exports['test .has() membership'] = function (assert) { var set = makeTestSet(); for (var i = 0; i < 100; i++) { assert.ok(set.has(String(i))); } }; exports['test .indexOf() elements'] = function (assert) { var set = makeTestSet(); for (var i = 0; i < 100; i++) { assert.strictEqual(set.indexOf(String(i)), i); } }; exports['test .at() indexing'] = function (assert) { var set = makeTestSet(); for (var i = 0; i < 100; i++) { assert.strictEqual(set.at(i), String(i)); } }; exports['test creating from an array'] = function (assert) { var set = ArraySet.fromArray(['foo', 'bar', 'baz', 'quux', 'hasOwnProperty']); assert.ok(set.has('foo')); assert.ok(set.has('bar')); assert.ok(set.has('baz')); assert.ok(set.has('quux')); assert.ok(set.has('hasOwnProperty')); assert.strictEqual(set.indexOf('foo'), 0); assert.strictEqual(set.indexOf('bar'), 1); assert.strictEqual(set.indexOf('baz'), 2); assert.strictEqual(set.indexOf('quux'), 3); assert.strictEqual(set.at(0), 'foo'); assert.strictEqual(set.at(1), 'bar'); assert.strictEqual(set.at(2), 'baz'); assert.strictEqual(set.at(3), 'quux'); }; exports['test that you can add __proto__; see github issue #30'] = function (assert) { var set = new ArraySet(); set.add('__proto__'); assert.ok(set.has('__proto__')); assert.strictEqual(set.at(0), '__proto__'); assert.strictEqual(set.indexOf('__proto__'), 0); }; exports['test .fromArray() with duplicates'] = function (assert) { var set = ArraySet.fromArray(['foo', 'foo']); assert.ok(set.has('foo')); assert.strictEqual(set.at(0), 'foo'); assert.strictEqual(set.indexOf('foo'), 0); assert.strictEqual(set.toArray().length, 1); set = ArraySet.fromArray(['foo', 'foo'], true); assert.ok(set.has('foo')); assert.strictEqual(set.at(0), 'foo'); assert.strictEqual(set.at(1), 'foo'); assert.strictEqual(set.indexOf('foo'), 0); assert.strictEqual(set.toArray().length, 2); }; exports['test .add() with duplicates'] = function (assert) { var set = new ArraySet(); set.add('foo'); set.add('foo'); assert.ok(set.has('foo')); assert.strictEqual(set.at(0), 'foo'); assert.strictEqual(set.indexOf('foo'), 0); assert.strictEqual(set.toArray().length, 1); set.add('foo', true); assert.ok(set.has('foo')); assert.strictEqual(set.at(0), 'foo'); assert.strictEqual(set.at(1), 'foo'); assert.strictEqual(set.indexOf('foo'), 0); assert.strictEqual(set.toArray().length, 2); }; exports['test .size()'] = function (assert) { var set = new ArraySet(); set.add('foo'); set.add('bar'); set.add('baz'); assert.strictEqual(set.size(), 3); }; exports['test .size() with disallowed duplicates'] = function (assert) { var set = new ArraySet(); set.add('foo'); set.add('foo'); set.add('bar'); set.add('bar'); set.add('baz'); set.add('baz'); assert.strictEqual(set.size(), 3); }; exports['test .size() with allowed duplicates'] = function (assert) { var set = new ArraySet(); set.add('foo'); set.add('foo', true); set.add('bar'); set.add('bar', true); set.add('baz'); set.add('baz', true); assert.strictEqual(set.size(), 3); }; source-map-js-1.0.2/test/test-base64-vlq.js000066400000000000000000000010301417156454300203610ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var base64VLQ = require('../lib/base64-vlq'); exports['test normal encoding and decoding'] = function (assert) { var result = {}; for (var i = -255; i < 256; i++) { var str = base64VLQ.encode(i); base64VLQ.decode(str, 0, result); assert.equal(result.value, i); assert.equal(result.rest, str.length); } }; source-map-js-1.0.2/test/test-base64.js000066400000000000000000000013231417156454300175660ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var base64 = require('../lib/base64'); exports['test out of range encoding'] = function (assert) { assert.throws(function () { base64.encode(-1); }); assert.throws(function () { base64.encode(64); }); }; exports['test out of range decoding'] = function (assert) { assert.equal(base64.decode('='.charCodeAt(0)), -1); }; exports['test normal encoding and decoding'] = function (assert) { for (var i = 0; i < 64; i++) { assert.equal(base64.decode(base64.encode(i).charCodeAt(0)), i); } }; source-map-js-1.0.2/test/test-binary-search.js000066400000000000000000000056461417156454300212450ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var binarySearch = require('../lib/binary-search'); function numberCompare(a, b) { return a - b; } exports['test too high with default (glb) bias'] = function (assert) { var needle = 30; var haystack = [2,4,6,8,10,12,14,16,18,20]; assert.doesNotThrow(function () { binarySearch.search(needle, haystack, numberCompare); }); assert.equal(haystack[binarySearch.search(needle, haystack, numberCompare)], 20); }; exports['test too low with default (glb) bias'] = function (assert) { var needle = 1; var haystack = [2,4,6,8,10,12,14,16,18,20]; assert.doesNotThrow(function () { binarySearch.search(needle, haystack, numberCompare); }); assert.equal(binarySearch.search(needle, haystack, numberCompare), -1); }; exports['test too high with lub bias'] = function (assert) { var needle = 30; var haystack = [2,4,6,8,10,12,14,16,18,20]; assert.doesNotThrow(function () { binarySearch.search(needle, haystack, numberCompare); }); assert.equal(binarySearch.search(needle, haystack, numberCompare, binarySearch.LEAST_UPPER_BOUND), -1); }; exports['test too low with lub bias'] = function (assert) { var needle = 1; var haystack = [2,4,6,8,10,12,14,16,18,20]; assert.doesNotThrow(function () { binarySearch.search(needle, haystack, numberCompare); }); assert.equal(haystack[binarySearch.search(needle, haystack, numberCompare, binarySearch.LEAST_UPPER_BOUND)], 2); }; exports['test exact search'] = function (assert) { var needle = 4; var haystack = [2,4,6,8,10,12,14,16,18,20]; assert.equal(haystack[binarySearch.search(needle, haystack, numberCompare)], 4); }; exports['test fuzzy search with default (glb) bias'] = function (assert) { var needle = 19; var haystack = [2,4,6,8,10,12,14,16,18,20]; assert.equal(haystack[binarySearch.search(needle, haystack, numberCompare)], 18); }; exports['test fuzzy search with lub bias'] = function (assert) { var needle = 19; var haystack = [2,4,6,8,10,12,14,16,18,20]; assert.equal(haystack[binarySearch.search(needle, haystack, numberCompare, binarySearch.LEAST_UPPER_BOUND)], 20); }; exports['test multiple matches'] = function (assert) { var needle = 5; var haystack = [1, 1, 2, 5, 5, 5, 13, 21]; assert.equal(binarySearch.search(needle, haystack, numberCompare, binarySearch.LEAST_UPPER_BOUND), 3); }; exports['test multiple matches at the beginning'] = function (assert) { var needle = 1; var haystack = [1, 1, 2, 5, 5, 5, 13, 21]; assert.equal(binarySearch.search(needle, haystack, numberCompare, binarySearch.LEAST_UPPER_BOUND), 0); }; source-map-js-1.0.2/test/test-dog-fooding.js000066400000000000000000000123721417156454300207040ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var util = require("./util"); var SourceMapConsumer = require('../lib/source-map-consumer').SourceMapConsumer; var SourceMapGenerator = require('../lib/source-map-generator').SourceMapGenerator; exports['test eating our own dog food'] = function (assert) { var smg = new SourceMapGenerator({ file: 'testing.js', sourceRoot: '/wu/tang' }); smg.addMapping({ source: 'gza.coffee', original: { line: 1, column: 0 }, generated: { line: 2, column: 2 } }); smg.addMapping({ source: 'gza.coffee', original: { line: 2, column: 0 }, generated: { line: 3, column: 2 } }); smg.addMapping({ source: 'gza.coffee', original: { line: 3, column: 0 }, generated: { line: 4, column: 2 } }); smg.addMapping({ source: 'gza.coffee', original: { line: 4, column: 0 }, generated: { line: 5, column: 2 } }); smg.addMapping({ source: 'gza.coffee', original: { line: 5, column: 10 }, generated: { line: 6, column: 12 } }); var smc = new SourceMapConsumer(smg.toString()); // Exact util.assertMapping(2, 2, '/wu/tang/gza.coffee', 1, 0, null, null, smc, assert); util.assertMapping(3, 2, '/wu/tang/gza.coffee', 2, 0, null, null, smc, assert); util.assertMapping(4, 2, '/wu/tang/gza.coffee', 3, 0, null, null, smc, assert); util.assertMapping(5, 2, '/wu/tang/gza.coffee', 4, 0, null, null, smc, assert); util.assertMapping(6, 12, '/wu/tang/gza.coffee', 5, 10, null, null, smc, assert); // Fuzzy // Generated to original with default (glb) bias. util.assertMapping(2, 0, null, null, null, null, null, smc, assert, true); util.assertMapping(2, 9, '/wu/tang/gza.coffee', 1, 0, null, null, smc, assert, true); util.assertMapping(3, 0, null, null, null, null, null, smc, assert, true); util.assertMapping(3, 9, '/wu/tang/gza.coffee', 2, 0, null, null, smc, assert, true); util.assertMapping(4, 0, null, null, null, null, null, smc, assert, true); util.assertMapping(4, 9, '/wu/tang/gza.coffee', 3, 0, null, null, smc, assert, true); util.assertMapping(5, 0, null, null, null, null, null, smc, assert, true); util.assertMapping(5, 9, '/wu/tang/gza.coffee', 4, 0, null, null, smc, assert, true); util.assertMapping(6, 0, null, null, null, null, null, smc, assert, true); util.assertMapping(6, 9, null, null, null, null, null, smc, assert, true); util.assertMapping(6, 13, '/wu/tang/gza.coffee', 5, 10, null, null, smc, assert, true); // Generated to original with lub bias. util.assertMapping(2, 0, '/wu/tang/gza.coffee', 1, 0, null, SourceMapConsumer.LEAST_UPPER_BOUND, smc, assert, true); util.assertMapping(2, 9, null, null, null, null, SourceMapConsumer.LEAST_UPPER_BOUND, smc, assert, true); util.assertMapping(3, 0, '/wu/tang/gza.coffee', 2, 0, null, SourceMapConsumer.LEAST_UPPER_BOUND, smc, assert, true); util.assertMapping(3, 9, null, null, null, null, SourceMapConsumer.LEAST_UPPER_BOUND, smc, assert, true); util.assertMapping(4, 0, '/wu/tang/gza.coffee', 3, 0, null, SourceMapConsumer.LEAST_UPPER_BOUND, smc, assert, true); util.assertMapping(4, 9, null, null, null, null, SourceMapConsumer.LEAST_UPPER_BOUND, smc, assert, true); util.assertMapping(5, 0, '/wu/tang/gza.coffee', 4, 0, null, SourceMapConsumer.LEAST_UPPER_BOUND, smc, assert, true); util.assertMapping(5, 9, null, null, null, null, SourceMapConsumer.LEAST_UPPER_BOUND, smc, assert, true); util.assertMapping(6, 0, '/wu/tang/gza.coffee', 5, 10, null, SourceMapConsumer.LEAST_UPPER_BOUND, smc, assert, true); util.assertMapping(6, 9, '/wu/tang/gza.coffee', 5, 10, null, SourceMapConsumer.LEAST_UPPER_BOUND, smc, assert, true); util.assertMapping(6, 13, null, null, null, null, SourceMapConsumer.LEAST_UPPER_BOUND, smc, assert, true); // Original to generated with default (glb) bias util.assertMapping(2, 2, '/wu/tang/gza.coffee', 1, 1, null, null, smc, assert, null, true); util.assertMapping(3, 2, '/wu/tang/gza.coffee', 2, 3, null, null, smc, assert, null, true); util.assertMapping(4, 2, '/wu/tang/gza.coffee', 3, 6, null, null, smc, assert, null, true); util.assertMapping(5, 2, '/wu/tang/gza.coffee', 4, 9, null, null, smc, assert, null, true); util.assertMapping(5, 2, '/wu/tang/gza.coffee', 5, 9, null, null, smc, assert, null, true); util.assertMapping(6, 12, '/wu/tang/gza.coffee', 6, 19, null, null, smc, assert, null, true); // Original to generated with lub bias. util.assertMapping(3, 2, '/wu/tang/gza.coffee', 1, 1, null, SourceMapConsumer.LEAST_UPPER_BOUND, smc, assert, null, true); util.assertMapping(4, 2, '/wu/tang/gza.coffee', 2, 3, null, SourceMapConsumer.LEAST_UPPER_BOUND, smc, assert, null, true); util.assertMapping(5, 2, '/wu/tang/gza.coffee', 3, 6, null, SourceMapConsumer.LEAST_UPPER_BOUND, smc, assert, null, true); util.assertMapping(6, 12, '/wu/tang/gza.coffee', 4, 9, null, SourceMapConsumer.LEAST_UPPER_BOUND, smc, assert, null, true); util.assertMapping(6, 12, '/wu/tang/gza.coffee', 5, 9, null, SourceMapConsumer.LEAST_UPPER_BOUND, smc, assert, null, true); util.assertMapping(null, null, '/wu/tang/gza.coffee', 6, 19, null, SourceMapConsumer.LEAST_UPPER_BOUND, smc, assert, null, true); }; source-map-js-1.0.2/test/test-quick-sort.js000066400000000000000000000022301417156454300206010ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var quickSort = require('../lib/quick-sort').quickSort; function numberCompare(a, b) { return a - b; } exports['test sorting sorted array'] = function (assert) { var ary = [0,1,2,3,4,5,6,7,8,9]; var quickSorted = ary.slice(); quickSort(quickSorted, numberCompare); assert.equal(JSON.stringify(ary), JSON.stringify(quickSorted)); }; exports['test sorting reverse-sorted array'] = function (assert) { var ary = [9,8,7,6,5,4,3,2,1,0]; var quickSorted = ary.slice(); quickSort(quickSorted, numberCompare); assert.equal(JSON.stringify(ary.sort(numberCompare)), JSON.stringify(quickSorted)); }; exports['test sorting unsorted array'] = function (assert) { var ary = []; for (var i = 0; i < 10; i++) { ary.push(Math.random()); } var quickSorted = ary.slice(); quickSort(quickSorted, numberCompare); assert.equal(JSON.stringify(ary.sort(numberCompare)), JSON.stringify(quickSorted)); }; source-map-js-1.0.2/test/test-source-map-consumer.js000066400000000000000000001175231417156454300224200ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var util = require("./util"); var SourceMapConsumer = require('../lib/source-map-consumer').SourceMapConsumer; var IndexedSourceMapConsumer = require('../lib/source-map-consumer').IndexedSourceMapConsumer; var BasicSourceMapConsumer = require('../lib/source-map-consumer').BasicSourceMapConsumer; var SourceMapGenerator = require('../lib/source-map-generator').SourceMapGenerator; exports['test that we can instantiate with a string or an object'] = function (assert) { assert.doesNotThrow(function () { var map = new SourceMapConsumer(util.testMap); }); assert.doesNotThrow(function () { var map = new SourceMapConsumer(JSON.stringify(util.testMap)); }); }; exports['test that the object returned from new SourceMapConsumer inherits from SourceMapConsumer'] = function (assert) { assert.ok(new SourceMapConsumer(util.testMap) instanceof SourceMapConsumer); } exports['test that a BasicSourceMapConsumer is returned for sourcemaps without sections'] = function(assert) { assert.ok(new SourceMapConsumer(util.testMap) instanceof BasicSourceMapConsumer); }; exports['test that an IndexedSourceMapConsumer is returned for sourcemaps with sections'] = function(assert) { assert.ok(new SourceMapConsumer(util.indexedTestMap) instanceof IndexedSourceMapConsumer); }; exports['test that the `sources` field has the original sources'] = function (assert) { var map; var sources; map = new SourceMapConsumer(util.testMap); sources = map.sources; assert.equal(sources[0], '/the/root/one.js'); assert.equal(sources[1], '/the/root/two.js'); assert.equal(sources.length, 2); map = new SourceMapConsumer(util.indexedTestMap); sources = map.sources; assert.equal(sources[0], '/the/root/one.js'); assert.equal(sources[1], '/the/root/two.js'); assert.equal(sources.length, 2); map = new SourceMapConsumer(util.indexedTestMapDifferentSourceRoots); sources = map.sources; assert.equal(sources[0], '/the/root/one.js'); assert.equal(sources[1], '/different/root/two.js'); assert.equal(sources.length, 2); map = new SourceMapConsumer(util.testMapNoSourceRoot); sources = map.sources; assert.equal(sources[0], 'one.js'); assert.equal(sources[1], 'two.js'); assert.equal(sources.length, 2); map = new SourceMapConsumer(util.testMapEmptySourceRoot); sources = map.sources; assert.equal(sources[0], 'one.js'); assert.equal(sources[1], 'two.js'); assert.equal(sources.length, 2); }; exports['test that the source root is reflected in a mapping\'s source field'] = function (assert) { var map; var mapping; map = new SourceMapConsumer(util.testMap); mapping = map.originalPositionFor({ line: 2, column: 1 }); assert.equal(mapping.source, '/the/root/two.js'); mapping = map.originalPositionFor({ line: 1, column: 1 }); assert.equal(mapping.source, '/the/root/one.js'); map = new SourceMapConsumer(util.testMapNoSourceRoot); mapping = map.originalPositionFor({ line: 2, column: 1 }); assert.equal(mapping.source, 'two.js'); mapping = map.originalPositionFor({ line: 1, column: 1 }); assert.equal(mapping.source, 'one.js'); map = new SourceMapConsumer(util.testMapEmptySourceRoot); mapping = map.originalPositionFor({ line: 2, column: 1 }); assert.equal(mapping.source, 'two.js'); mapping = map.originalPositionFor({ line: 1, column: 1 }); assert.equal(mapping.source, 'one.js'); }; exports['test mapping tokens back exactly'] = function (assert) { var map = new SourceMapConsumer(util.testMap); util.assertMapping(1, 1, '/the/root/one.js', 1, 1, null, null, map, assert); util.assertMapping(1, 5, '/the/root/one.js', 1, 5, null, null, map, assert); util.assertMapping(1, 9, '/the/root/one.js', 1, 11, null, null, map, assert); util.assertMapping(1, 18, '/the/root/one.js', 1, 21, 'bar', null, map, assert); util.assertMapping(1, 21, '/the/root/one.js', 2, 3, null, null, map, assert); util.assertMapping(1, 28, '/the/root/one.js', 2, 10, 'baz', null, map, assert); util.assertMapping(1, 32, '/the/root/one.js', 2, 14, 'bar', null, map, assert); util.assertMapping(2, 1, '/the/root/two.js', 1, 1, null, null, map, assert); util.assertMapping(2, 5, '/the/root/two.js', 1, 5, null, null, map, assert); util.assertMapping(2, 9, '/the/root/two.js', 1, 11, null, null, map, assert); util.assertMapping(2, 18, '/the/root/two.js', 1, 21, 'n', null, map, assert); util.assertMapping(2, 21, '/the/root/two.js', 2, 3, null, null, map, assert); util.assertMapping(2, 28, '/the/root/two.js', 2, 10, 'n', null, map, assert); }; exports['test mapping tokens back exactly in indexed source map'] = function (assert) { var map = new SourceMapConsumer(util.indexedTestMap); util.assertMapping(1, 1, '/the/root/one.js', 1, 1, null, null, map, assert); util.assertMapping(1, 5, '/the/root/one.js', 1, 5, null, null, map, assert); util.assertMapping(1, 9, '/the/root/one.js', 1, 11, null, null, map, assert); util.assertMapping(1, 18, '/the/root/one.js', 1, 21, 'bar', null, map, assert); util.assertMapping(1, 21, '/the/root/one.js', 2, 3, null, null, map, assert); util.assertMapping(1, 28, '/the/root/one.js', 2, 10, 'baz', null, map, assert); util.assertMapping(1, 32, '/the/root/one.js', 2, 14, 'bar', null, map, assert); util.assertMapping(2, 1, '/the/root/two.js', 1, 1, null, null, map, assert); util.assertMapping(2, 5, '/the/root/two.js', 1, 5, null, null, map, assert); util.assertMapping(2, 9, '/the/root/two.js', 1, 11, null, null, map, assert); util.assertMapping(2, 18, '/the/root/two.js', 1, 21, 'n', null, map, assert); util.assertMapping(2, 21, '/the/root/two.js', 2, 3, null, null, map, assert); util.assertMapping(2, 28, '/the/root/two.js', 2, 10, 'n', null, map, assert); }; exports['test mapping tokens fuzzy'] = function (assert) { var map = new SourceMapConsumer(util.testMap); // Finding original positions with default (glb) bias. util.assertMapping(1, 20, '/the/root/one.js', 1, 21, 'bar', null, map, assert, true); util.assertMapping(1, 30, '/the/root/one.js', 2, 10, 'baz', null, map, assert, true); util.assertMapping(2, 12, '/the/root/two.js', 1, 11, null, null, map, assert, true); // Finding original positions with lub bias. util.assertMapping(1, 16, '/the/root/one.js', 1, 21, 'bar', SourceMapConsumer.LEAST_UPPER_BOUND, map, assert, true); util.assertMapping(1, 26, '/the/root/one.js', 2, 10, 'baz', SourceMapConsumer.LEAST_UPPER_BOUND, map, assert, true); util.assertMapping(2, 6, '/the/root/two.js', 1, 11, null, SourceMapConsumer.LEAST_UPPER_BOUND, map, assert, true); // Finding generated positions with default (glb) bias. util.assertMapping(1, 18, '/the/root/one.js', 1, 22, 'bar', null, map, assert, null, true); util.assertMapping(1, 28, '/the/root/one.js', 2, 13, 'baz', null, map, assert, null, true); util.assertMapping(2, 9, '/the/root/two.js', 1, 16, null, null, map, assert, null, true); // Finding generated positions with lub bias. util.assertMapping(1, 18, '/the/root/one.js', 1, 20, 'bar', SourceMapConsumer.LEAST_UPPER_BOUND, map, assert, null, true); util.assertMapping(1, 28, '/the/root/one.js', 2, 7, 'baz', SourceMapConsumer.LEAST_UPPER_BOUND, map, assert, null, true); util.assertMapping(2, 9, '/the/root/two.js', 1, 6, null, SourceMapConsumer.LEAST_UPPER_BOUND, map, assert, null, true); }; exports['test mapping tokens fuzzy in indexed source map'] = function (assert) { var map = new SourceMapConsumer(util.indexedTestMap); // Finding original positions with default (glb) bias. util.assertMapping(1, 20, '/the/root/one.js', 1, 21, 'bar', null, map, assert, true); util.assertMapping(1, 30, '/the/root/one.js', 2, 10, 'baz', null, map, assert, true); util.assertMapping(2, 12, '/the/root/two.js', 1, 11, null, null, map, assert, true); // Finding original positions with lub bias. util.assertMapping(1, 16, '/the/root/one.js', 1, 21, 'bar', SourceMapConsumer.LEAST_UPPER_BOUND, map, assert, true); util.assertMapping(1, 26, '/the/root/one.js', 2, 10, 'baz', SourceMapConsumer.LEAST_UPPER_BOUND, map, assert, true); util.assertMapping(2, 6, '/the/root/two.js', 1, 11, null, SourceMapConsumer.LEAST_UPPER_BOUND, map, assert, true); // Finding generated positions with default (glb) bias. util.assertMapping(1, 18, '/the/root/one.js', 1, 22, 'bar', null, map, assert, null, true); util.assertMapping(1, 28, '/the/root/one.js', 2, 13, 'baz', null, map, assert, null, true); util.assertMapping(2, 9, '/the/root/two.js', 1, 16, null, null, map, assert, null, true); // Finding generated positions with lub bias. util.assertMapping(1, 18, '/the/root/one.js', 1, 20, 'bar', SourceMapConsumer.LEAST_UPPER_BOUND, map, assert, null, true); util.assertMapping(1, 28, '/the/root/one.js', 2, 7, 'baz', SourceMapConsumer.LEAST_UPPER_BOUND, map, assert, null, true); util.assertMapping(2, 9, '/the/root/two.js', 1, 6, null, SourceMapConsumer.LEAST_UPPER_BOUND, map, assert, null, true); }; exports['test mappings and end of lines'] = function (assert) { var smg = new SourceMapGenerator({ file: 'foo.js' }); smg.addMapping({ original: { line: 1, column: 1 }, generated: { line: 1, column: 1 }, source: 'bar.js' }); smg.addMapping({ original: { line: 2, column: 2 }, generated: { line: 2, column: 2 }, source: 'bar.js' }); smg.addMapping({ original: { line: 1, column: 1 }, generated: { line: 1, column: 1 }, source: 'baz.js' }); var map = SourceMapConsumer.fromSourceMap(smg); // When finding original positions, mappings end at the end of the line. util.assertMapping(2, 1, null, null, null, null, null, map, assert, true) // When finding generated positions, mappings do not end at the end of the line. util.assertMapping(1, 1, 'bar.js', 2, 1, null, null, map, assert, null, true); // When finding generated positions with, mappings end at the end of the source. util.assertMapping(null, null, 'bar.js', 3, 1, null, SourceMapConsumer.LEAST_UPPER_BOUND, map, assert, null, true); }; exports['test creating source map consumers with )]}\' prefix'] = function (assert) { assert.doesNotThrow(function () { var map = new SourceMapConsumer(")]}'\n" + JSON.stringify(util.testMap)); }); }; exports['test eachMapping'] = function (assert) { var map; map = new SourceMapConsumer(util.testMap); var previousLine = -Infinity; var previousColumn = -Infinity; map.eachMapping(function (mapping) { assert.ok(mapping.generatedLine >= previousLine); assert.ok(mapping.source === '/the/root/one.js' || mapping.source === '/the/root/two.js'); if (mapping.generatedLine === previousLine) { assert.ok(mapping.generatedColumn >= previousColumn); previousColumn = mapping.generatedColumn; } else { previousLine = mapping.generatedLine; previousColumn = -Infinity; } }); map = new SourceMapConsumer(util.testMapNoSourceRoot); map.eachMapping(function (mapping) { assert.ok(mapping.source === 'one.js' || mapping.source === 'two.js'); }); map = new SourceMapConsumer(util.testMapEmptySourceRoot); map.eachMapping(function (mapping) { assert.ok(mapping.source === 'one.js' || mapping.source === 'two.js'); }); }; exports['test eachMapping for indexed source maps'] = function(assert) { var map = new SourceMapConsumer(util.indexedTestMap); var previousLine = -Infinity; var previousColumn = -Infinity; map.eachMapping(function (mapping) { assert.ok(mapping.generatedLine >= previousLine); if (mapping.source) { assert.equal(mapping.source.indexOf(util.testMap.sourceRoot), 0); } if (mapping.generatedLine === previousLine) { assert.ok(mapping.generatedColumn >= previousColumn); previousColumn = mapping.generatedColumn; } else { previousLine = mapping.generatedLine; previousColumn = -Infinity; } }); }; exports['test iterating over mappings in a different order'] = function (assert) { var map = new SourceMapConsumer(util.testMap); var previousLine = -Infinity; var previousColumn = -Infinity; var previousSource = ""; map.eachMapping(function (mapping) { assert.ok(mapping.source >= previousSource); if (mapping.source === previousSource) { assert.ok(mapping.originalLine >= previousLine); if (mapping.originalLine === previousLine) { assert.ok(mapping.originalColumn >= previousColumn); previousColumn = mapping.originalColumn; } else { previousLine = mapping.originalLine; previousColumn = -Infinity; } } else { previousSource = mapping.source; previousLine = -Infinity; previousColumn = -Infinity; } }, null, SourceMapConsumer.ORIGINAL_ORDER); }; exports['test iterating over mappings in a different order in indexed source maps'] = function (assert) { var map = new SourceMapConsumer(util.indexedTestMap); var previousLine = -Infinity; var previousColumn = -Infinity; var previousSource = ""; map.eachMapping(function (mapping) { assert.ok(mapping.source >= previousSource); if (mapping.source === previousSource) { assert.ok(mapping.originalLine >= previousLine); if (mapping.originalLine === previousLine) { assert.ok(mapping.originalColumn >= previousColumn); previousColumn = mapping.originalColumn; } else { previousLine = mapping.originalLine; previousColumn = -Infinity; } } else { previousSource = mapping.source; previousLine = -Infinity; previousColumn = -Infinity; } }, null, SourceMapConsumer.ORIGINAL_ORDER); }; exports['test that we can set the context for `this` in eachMapping'] = function (assert) { var map = new SourceMapConsumer(util.testMap); var context = {}; map.eachMapping(function () { assert.equal(this, context); }, context); }; exports['test that we can set the context for `this` in eachMapping in indexed source maps'] = function (assert) { var map = new SourceMapConsumer(util.indexedTestMap); var context = {}; map.eachMapping(function () { assert.equal(this, context); }, context); }; exports['test that the `sourcesContent` field has the original sources'] = function (assert) { var map = new SourceMapConsumer(util.testMapWithSourcesContent); var sourcesContent = map.sourcesContent; assert.equal(sourcesContent[0], ' ONE.foo = function (bar) {\n return baz(bar);\n };'); assert.equal(sourcesContent[1], ' TWO.inc = function (n) {\n return n + 1;\n };'); assert.equal(sourcesContent.length, 2); }; exports['test that we can get the original sources for the sources'] = function (assert) { var map = new SourceMapConsumer(util.testMapWithSourcesContent); var sources = map.sources; assert.equal(map.sourceContentFor(sources[0]), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); assert.equal(map.sourceContentFor(sources[1]), ' TWO.inc = function (n) {\n return n + 1;\n };'); assert.equal(map.sourceContentFor("one.js"), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); assert.equal(map.sourceContentFor("two.js"), ' TWO.inc = function (n) {\n return n + 1;\n };'); assert.throws(function () { map.sourceContentFor(""); }, Error); assert.throws(function () { map.sourceContentFor("/the/root/three.js"); }, Error); assert.throws(function () { map.sourceContentFor("three.js"); }, Error); }; exports['test that we can get the original source content with relative source paths'] = function (assert) { var map = new SourceMapConsumer(util.testMapRelativeSources); var sources = map.sources; assert.equal(map.sourceContentFor(sources[0]), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); assert.equal(map.sourceContentFor(sources[1]), ' TWO.inc = function (n) {\n return n + 1;\n };'); assert.equal(map.sourceContentFor("one.js"), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); assert.equal(map.sourceContentFor("two.js"), ' TWO.inc = function (n) {\n return n + 1;\n };'); assert.throws(function () { map.sourceContentFor(""); }, Error); assert.throws(function () { map.sourceContentFor("/the/root/three.js"); }, Error); assert.throws(function () { map.sourceContentFor("three.js"); }, Error); }; exports['test that we can get the original source content for the sources on an indexed source map'] = function (assert) { var map = new SourceMapConsumer(util.indexedTestMap); var sources = map.sources; assert.equal(map.sourceContentFor(sources[0]), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); assert.equal(map.sourceContentFor(sources[1]), ' TWO.inc = function (n) {\n return n + 1;\n };'); assert.equal(map.sourceContentFor("one.js"), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); assert.equal(map.sourceContentFor("two.js"), ' TWO.inc = function (n) {\n return n + 1;\n };'); assert.throws(function () { map.sourceContentFor(""); }, Error); assert.throws(function () { map.sourceContentFor("/the/root/three.js"); }, Error); assert.throws(function () { map.sourceContentFor("three.js"); }, Error); }; exports['test hasContentsOfAllSources, single source with contents'] = function (assert) { // Has one source: foo.js (with contents). var mapWithContents = new SourceMapGenerator(); mapWithContents.addMapping({ source: 'foo.js', original: { line: 1, column: 10 }, generated: { line: 1, column: 10 } }); mapWithContents.setSourceContent('foo.js', 'content of foo.js'); var consumer = new SourceMapConsumer(mapWithContents.toJSON()); assert.ok(consumer.hasContentsOfAllSources()); }; exports['test hasContentsOfAllSources, single source without contents'] = function (assert) { // Has one source: foo.js (without contents). var mapWithoutContents = new SourceMapGenerator(); mapWithoutContents.addMapping({ source: 'foo.js', original: { line: 1, column: 10 }, generated: { line: 1, column: 10 } }); var consumer = new SourceMapConsumer(mapWithoutContents.toJSON()); assert.ok(!consumer.hasContentsOfAllSources()); }; exports['test hasContentsOfAllSources, two sources with contents'] = function (assert) { // Has two sources: foo.js (with contents) and bar.js (with contents). var mapWithBothContents = new SourceMapGenerator(); mapWithBothContents.addMapping({ source: 'foo.js', original: { line: 1, column: 10 }, generated: { line: 1, column: 10 } }); mapWithBothContents.addMapping({ source: 'bar.js', original: { line: 1, column: 10 }, generated: { line: 1, column: 10 } }); mapWithBothContents.setSourceContent('foo.js', 'content of foo.js'); mapWithBothContents.setSourceContent('bar.js', 'content of bar.js'); var consumer = new SourceMapConsumer(mapWithBothContents.toJSON()); assert.ok(consumer.hasContentsOfAllSources()); }; exports['test hasContentsOfAllSources, two sources one with and one without contents'] = function (assert) { // Has two sources: foo.js (with contents) and bar.js (without contents). var mapWithoutSomeContents = new SourceMapGenerator(); mapWithoutSomeContents.addMapping({ source: 'foo.js', original: { line: 1, column: 10 }, generated: { line: 1, column: 10 } }); mapWithoutSomeContents.addMapping({ source: 'bar.js', original: { line: 1, column: 10 }, generated: { line: 1, column: 10 } }); mapWithoutSomeContents.setSourceContent('foo.js', 'content of foo.js'); var consumer = new SourceMapConsumer(mapWithoutSomeContents.toJSON()); assert.ok(!consumer.hasContentsOfAllSources()); }; exports['test sourceRoot + generatedPositionFor'] = function (assert) { var map = new SourceMapGenerator({ sourceRoot: 'foo/bar', file: 'baz.js' }); map.addMapping({ original: { line: 1, column: 1 }, generated: { line: 2, column: 2 }, source: 'bang.coffee' }); map.addMapping({ original: { line: 5, column: 5 }, generated: { line: 6, column: 6 }, source: 'bang.coffee' }); map = new SourceMapConsumer(map.toString(), 'http://example.com/'); // Should handle without sourceRoot. var pos = map.generatedPositionFor({ line: 1, column: 1, source: 'bang.coffee' }); assert.equal(pos.line, 2); assert.equal(pos.column, 2); // Should handle with sourceRoot. var pos = map.generatedPositionFor({ line: 1, column: 1, source: 'foo/bar/bang.coffee' }); assert.equal(pos.line, 2); assert.equal(pos.column, 2); // Should handle absolute case. var pos = map.generatedPositionFor({ line: 1, column: 1, source: 'http://example.com/foo/bar/bang.coffee' }); assert.equal(pos.line, 2); assert.equal(pos.column, 2); }; exports['test sourceRoot + generatedPositionFor for path above the root'] = function (assert) { var map = new SourceMapGenerator({ sourceRoot: 'foo/bar', file: 'baz.js' }); map.addMapping({ original: { line: 1, column: 1 }, generated: { line: 2, column: 2 }, source: '../bang.coffee' }); map = new SourceMapConsumer(map.toString()); // Should handle with sourceRoot. var pos = map.generatedPositionFor({ line: 1, column: 1, source: 'foo/bang.coffee' }); assert.equal(pos.line, 2); assert.equal(pos.column, 2); }; exports['test allGeneratedPositionsFor for line'] = function (assert) { var map = new SourceMapGenerator({ file: 'generated.js' }); map.addMapping({ original: { line: 1, column: 1 }, generated: { line: 2, column: 2 }, source: 'foo.coffee' }); map.addMapping({ original: { line: 1, column: 1 }, generated: { line: 2, column: 2 }, source: 'bar.coffee' }); map.addMapping({ original: { line: 2, column: 1 }, generated: { line: 3, column: 2 }, source: 'bar.coffee' }); map.addMapping({ original: { line: 2, column: 2 }, generated: { line: 3, column: 3 }, source: 'bar.coffee' }); map.addMapping({ original: { line: 3, column: 1 }, generated: { line: 4, column: 2 }, source: 'bar.coffee' }); map = new SourceMapConsumer(map.toString(), 'http://example.com/'); var mappings = map.allGeneratedPositionsFor({ line: 2, source: 'bar.coffee' }); assert.equal(mappings.length, 2); assert.equal(mappings[0].line, 3); assert.equal(mappings[0].column, 2); assert.equal(mappings[1].line, 3); assert.equal(mappings[1].column, 3); mappings = map.allGeneratedPositionsFor({ line: 2, source: 'http://example.com/bar.coffee' }); assert.equal(mappings.length, 2); assert.equal(mappings[0].line, 3); assert.equal(mappings[0].column, 2); assert.equal(mappings[1].line, 3); assert.equal(mappings[1].column, 3); }; exports['test allGeneratedPositionsFor for line fuzzy'] = function (assert) { var map = new SourceMapGenerator({ file: 'generated.js' }); map.addMapping({ original: { line: 1, column: 1 }, generated: { line: 2, column: 2 }, source: 'foo.coffee' }); map.addMapping({ original: { line: 1, column: 1 }, generated: { line: 2, column: 2 }, source: 'bar.coffee' }); map.addMapping({ original: { line: 3, column: 1 }, generated: { line: 4, column: 2 }, source: 'bar.coffee' }); map = new SourceMapConsumer(map.toString()); var mappings = map.allGeneratedPositionsFor({ line: 2, source: 'bar.coffee' }); assert.equal(mappings.length, 1); assert.equal(mappings[0].line, 4); assert.equal(mappings[0].column, 2); }; exports['test allGeneratedPositionsFor for empty source map'] = function (assert) { var map = new SourceMapGenerator({ file: 'generated.js' }); map = new SourceMapConsumer(map.toString()); var mappings = map.allGeneratedPositionsFor({ line: 2, source: 'bar.coffee' }); assert.equal(mappings.length, 0); }; exports['test allGeneratedPositionsFor for column'] = function (assert) { var map = new SourceMapGenerator({ file: 'generated.js' }); map.addMapping({ original: { line: 1, column: 1 }, generated: { line: 1, column: 2 }, source: 'foo.coffee' }); map.addMapping({ original: { line: 1, column: 1 }, generated: { line: 1, column: 3 }, source: 'foo.coffee' }); map = new SourceMapConsumer(map.toString()); var mappings = map.allGeneratedPositionsFor({ line: 1, column: 1, source: 'foo.coffee' }); assert.equal(mappings.length, 2); assert.equal(mappings[0].line, 1); assert.equal(mappings[0].column, 2); assert.equal(mappings[1].line, 1); assert.equal(mappings[1].column, 3); }; exports['test allGeneratedPositionsFor for column fuzzy'] = function (assert) { var map = new SourceMapGenerator({ file: 'generated.js' }); map.addMapping({ original: { line: 1, column: 1 }, generated: { line: 1, column: 2 }, source: 'foo.coffee' }); map.addMapping({ original: { line: 1, column: 1 }, generated: { line: 1, column: 3 }, source: 'foo.coffee' }); map = new SourceMapConsumer(map.toString()); var mappings = map.allGeneratedPositionsFor({ line: 1, column: 0, source: 'foo.coffee' }); assert.equal(mappings.length, 2); assert.equal(mappings[0].line, 1); assert.equal(mappings[0].column, 2); assert.equal(mappings[1].line, 1); assert.equal(mappings[1].column, 3); }; exports['test allGeneratedPositionsFor for column on different line fuzzy'] = function (assert) { var map = new SourceMapGenerator({ file: 'generated.js' }); map.addMapping({ original: { line: 2, column: 1 }, generated: { line: 2, column: 2 }, source: 'foo.coffee' }); map.addMapping({ original: { line: 2, column: 1 }, generated: { line: 2, column: 3 }, source: 'foo.coffee' }); map = new SourceMapConsumer(map.toString()); var mappings = map.allGeneratedPositionsFor({ line: 1, column: 0, source: 'foo.coffee' }); assert.equal(mappings.length, 0); }; exports['test computeColumnSpans'] = function (assert) { var map = new SourceMapGenerator({ file: 'generated.js' }); map.addMapping({ original: { line: 1, column: 1 }, generated: { line: 1, column: 1 }, source: 'foo.coffee' }); map.addMapping({ original: { line: 2, column: 1 }, generated: { line: 2, column: 1 }, source: 'foo.coffee' }); map.addMapping({ original: { line: 2, column: 2 }, generated: { line: 2, column: 10 }, source: 'foo.coffee' }); map.addMapping({ original: { line: 2, column: 3 }, generated: { line: 2, column: 20 }, source: 'foo.coffee' }); map.addMapping({ original: { line: 3, column: 1 }, generated: { line: 3, column: 1 }, source: 'foo.coffee' }); map.addMapping({ original: { line: 3, column: 2 }, generated: { line: 3, column: 2 }, source: 'foo.coffee' }); map = new SourceMapConsumer(map.toString()); map.computeColumnSpans(); var mappings = map.allGeneratedPositionsFor({ line: 1, source: 'foo.coffee' }); assert.equal(mappings.length, 1); assert.equal(mappings[0].lastColumn, Infinity); var mappings = map.allGeneratedPositionsFor({ line: 2, source: 'foo.coffee' }); assert.equal(mappings.length, 3); assert.equal(mappings[0].lastColumn, 9); assert.equal(mappings[1].lastColumn, 19); assert.equal(mappings[2].lastColumn, Infinity); var mappings = map.allGeneratedPositionsFor({ line: 3, source: 'foo.coffee' }); assert.equal(mappings.length, 2); assert.equal(mappings[0].lastColumn, 1); assert.equal(mappings[1].lastColumn, Infinity); }; exports['test sourceRoot + originalPositionFor'] = function (assert) { var map = new SourceMapGenerator({ sourceRoot: 'foo/bar', file: 'baz.js' }); map.addMapping({ original: { line: 1, column: 1 }, generated: { line: 2, column: 2 }, source: 'bang.coffee' }); map = new SourceMapConsumer(map.toString()); var pos = map.originalPositionFor({ line: 2, column: 2, }); // Should always have the prepended source root assert.equal(pos.source, 'foo/bar/bang.coffee'); assert.equal(pos.line, 1); assert.equal(pos.column, 1); }; exports['test github issue #56'] = function (assert) { var map = new SourceMapGenerator({ sourceRoot: 'http://', file: 'www.example.com/foo.js' }); map.addMapping({ original: { line: 1, column: 1 }, generated: { line: 2, column: 2 }, source: 'www.example.com/original.js' }); map = new SourceMapConsumer(map.toString()); var sources = map.sources; assert.equal(sources.length, 1); assert.equal(sources[0], 'http://www.example.com/original.js'); }; // Was github issue #43, but that's no longer valid. exports['test source resolution with sourceMapURL'] = function (assert) { var map = new SourceMapGenerator({ sourceRoot: '', file: 'foo.js' }); map.addMapping({ original: { line: 1, column: 1 }, generated: { line: 2, column: 2 }, source: 'original.js', }); map = new SourceMapConsumer(map.toString(), 'http://cdn.example.com'); var sources = map.sources; assert.equal(sources.length, 1, 'Should only be one source.'); assert.equal(sources[0], 'http://cdn.example.com/original.js', 'Should be joined with the source map URL.'); }; exports['test sourceRoot prepending'] = function (assert) { var map = new SourceMapGenerator({ sourceRoot: 'http://example.com/foo/bar', file: 'foo.js' }); map.addMapping({ original: { line: 1, column: 1 }, generated: { line: 2, column: 2 }, source: '/original.js' }); map = new SourceMapConsumer(map.toString()); var sources = map.sources; assert.equal(sources.length, 1, 'Should only be one source.'); assert.equal(sources[0], 'http://example.com/foo/bar/original.js', 'Source include the source root.'); }; exports['test indexed source map errors when sections are out of order by line'] = function(assert) { // Make a deep copy of the indexedTestMap var misorderedIndexedTestMap = JSON.parse(JSON.stringify(util.indexedTestMap)); misorderedIndexedTestMap.sections[0].offset = { line: 2, column: 0 }; assert.throws(function() { new SourceMapConsumer(misorderedIndexedTestMap); }, Error); }; exports['test github issue #64'] = function (assert) { var map = new SourceMapConsumer({ "version": 3, "file": "foo.js", "sourceRoot": "http://example.com/", "sources": ["/a"], "names": [], "mappings": "AACA", "sourcesContent": ["foo"] }); assert.equal(map.sourceContentFor("a"), "foo"); assert.equal(map.sourceContentFor("/a"), "foo"); }; exports['test full source content with sourceMapURL'] = function (assert) { var map = new SourceMapConsumer({ 'version': 3, 'file': 'foo.js', 'sourceRoot': '', 'sources': ['original.js'], 'names': [], 'mappings': 'AACA', 'sourcesContent': ['yellow warbler'] }, 'http://cdn.example.com'); var sources = map.sources; assert.equal(map.sourceContentFor('http://cdn.example.com/original.js'), 'yellow warbler', 'Source content should be found using full URL'); }; exports['test bug 885597'] = function (assert) { var map = new SourceMapConsumer({ "version": 3, "file": "foo.js", "sourceRoot": "file:///Users/AlGore/Invented/The/Internet/", "sources": ["/a"], "names": [], "mappings": "AACA", "sourcesContent": ["foo"] }); var s = map.sources[0]; assert.equal(map.sourceContentFor(s), "foo"); }; exports['test github issue #72, duplicate sources'] = function (assert) { var map = new SourceMapConsumer({ "version": 3, "file": "foo.js", "sources": ["source1.js", "source1.js", "source3.js"], "names": [], "mappings": ";EAAC;;IAEE;;MEEE", "sourceRoot": "http://example.com" }); var pos = map.originalPositionFor({ line: 2, column: 2 }); assert.equal(pos.source, 'http://example.com/source1.js'); assert.equal(pos.line, 1); assert.equal(pos.column, 1); var pos = map.originalPositionFor({ line: 4, column: 4 }); assert.equal(pos.source, 'http://example.com/source1.js'); assert.equal(pos.line, 3); assert.equal(pos.column, 3); var pos = map.originalPositionFor({ line: 6, column: 6 }); assert.equal(pos.source, 'http://example.com/source3.js'); assert.equal(pos.line, 5); assert.equal(pos.column, 5); }; exports['test github issue #72, duplicate names'] = function (assert) { var map = new SourceMapConsumer({ "version": 3, "file": "foo.js", "sources": ["source.js"], "names": ["name1", "name1", "name3"], "mappings": ";EAACA;;IAEEA;;MAEEE", "sourceRoot": "http://example.com" }); var pos = map.originalPositionFor({ line: 2, column: 2 }); assert.equal(pos.name, 'name1'); assert.equal(pos.line, 1); assert.equal(pos.column, 1); var pos = map.originalPositionFor({ line: 4, column: 4 }); assert.equal(pos.name, 'name1'); assert.equal(pos.line, 3); assert.equal(pos.column, 3); var pos = map.originalPositionFor({ line: 6, column: 6 }); assert.equal(pos.name, 'name3'); assert.equal(pos.line, 5); assert.equal(pos.column, 5); }; exports['test SourceMapConsumer.fromSourceMap'] = function (assert) { var smg = new SourceMapGenerator({ sourceRoot: 'http://example.com/', file: 'foo.js' }); smg.addMapping({ original: { line: 1, column: 1 }, generated: { line: 2, column: 2 }, source: 'bar.js' }); smg.addMapping({ original: { line: 2, column: 2 }, generated: { line: 4, column: 4 }, source: 'baz.js', name: 'dirtMcGirt' }); smg.setSourceContent('baz.js', 'baz.js content'); var smc = SourceMapConsumer.fromSourceMap(smg); assert.equal(smc.file, 'foo.js'); assert.equal(smc.sourceRoot, 'http://example.com/'); assert.equal(smc.sources.length, 2); assert.equal(smc.sources[0], 'http://example.com/bar.js'); assert.equal(smc.sources[1], 'http://example.com/baz.js'); assert.equal(smc.sourceContentFor('baz.js'), 'baz.js content'); var pos = smc.originalPositionFor({ line: 2, column: 2 }); assert.equal(pos.line, 1); assert.equal(pos.column, 1); assert.equal(pos.source, 'http://example.com/bar.js'); assert.equal(pos.name, null); pos = smc.generatedPositionFor({ line: 1, column: 1, source: 'http://example.com/bar.js' }); assert.equal(pos.line, 2); assert.equal(pos.column, 2); pos = smc.originalPositionFor({ line: 4, column: 4 }); assert.equal(pos.line, 2); assert.equal(pos.column, 2); assert.equal(pos.source, 'http://example.com/baz.js'); assert.equal(pos.name, 'dirtMcGirt'); pos = smc.generatedPositionFor({ line: 2, column: 2, source: 'http://example.com/baz.js' }); assert.equal(pos.line, 4); assert.equal(pos.column, 4); }; exports['test issue #191'] = function (assert) { var generator = new SourceMapGenerator({ file: 'a.css' }); generator.addMapping({ source: 'b.css', original: { line: 1, column: 0 }, generated: { line: 1, column: 0 } }); // Create a SourceMapConsumer from the SourceMapGenerator, ... var consumer = SourceMapConsumer.fromSourceMap(generator); // ... and then try and use the SourceMapGenerator again. This should not // throw. generator.toJSON(); assert.ok(true, "Using a SourceMapGenerator again after creating a " + "SourceMapConsumer from it should not throw"); }; exports['test sources where their prefix is the source root: issue #199'] = function (assert) { var testSourceMap = { "version": 3, "sources": ["/source/app/app/app.js"], "names": ["System"], "mappings": "AAAAA", "file": "app/app.js", "sourcesContent": ["'use strict';"], "sourceRoot":"/source/" }; var consumer = new SourceMapConsumer(testSourceMap); function consumerHasSource(s) { assert.ok(consumer.sourceContentFor(s)); } consumer.sources.forEach(consumerHasSource); testSourceMap.sources.forEach(consumerHasSource); }; exports['test sources where their prefix is the source root and the source root is a url: issue #199'] = function (assert) { var testSourceMap = { "version": 3, "sources": ["http://example.com/source/app/app/app.js"], "names": ["System"], "mappings": "AAAAA", "sourcesContent": ["'use strict';"], "sourceRoot":"http://example.com/source/" }; var consumer = new SourceMapConsumer(testSourceMap); function consumerHasSource(s) { assert.ok(consumer.sourceContentFor(s)); } consumer.sources.forEach(consumerHasSource); testSourceMap.sources.forEach(consumerHasSource); }; exports['test consuming names and sources that are numbers'] = function (assert) { var testSourceMap = { "version": 3, "sources": [0], "names": [1], "mappings": "AAAAA", }; var consumer = new SourceMapConsumer(testSourceMap); assert.equal(consumer.sources.length, 1); assert.equal(consumer.sources[0], "0"); var i = 0; consumer.eachMapping(function (m) { i++; assert.equal(m.name, "1"); }); assert.equal(i, 1); }; exports['test non-normalized sourceRoot (from issue #227)'] = function (assert) { var consumer = new SourceMapConsumer({ version: 3, sources: [ 'index.js' ], names: [], mappings: ';;AAAA,IAAI,OAAO,MAAP', file: 'index.js', sourceRoot: './src/', sourcesContent: [ 'var name = "Mark"\n' ] }); assert.equal(consumer.sourceRoot, 'src/', 'sourceRoot was normalized'); // Before the fix, this threw an exception. consumer.sourceContentFor(consumer.sources[0]); }; exports['test webpack URL resolution'] = function (assert) { var map = { version: 3, sources: ["webpack:///webpack/bootstrap 67e184f9679733298d44"], names: [], mappings: "CAAS", file: "static/js/manifest.b7cf97680f7a50fa150f.js", sourceRoot: "" }; var consumer = new SourceMapConsumer(map); assert.equal(consumer.sources.length, 1); assert.equal(consumer.sources[0], "webpack:///webpack/bootstrap 67e184f9679733298d44"); }; exports['test webpack URL resolution with sourceMapURL'] = function (assert) { var map = { version: 3, sources: ["webpack:///webpack/bootstrap 67e184f9679733298d44"], names: [], mappings: "CAAS", file: "static/js/manifest.b7cf97680f7a50fa150f.js", sourceRoot: "" }; var consumer = new SourceMapConsumer(map, 'http://www.example.com/q.js.map'); assert.equal(consumer.sources.length, 1); assert.equal(consumer.sources[0], "webpack:///webpack/bootstrap 67e184f9679733298d44"); }; exports['test relative webpack URL resolution with sourceMapURL'] = function (assert) { var map = { version: 3, sources: ["webpack/bootstrap.js"], names: [], mappings: "CAAS", file: "static/js/manifest.b7cf97680f7a50fa150f.js", sourceRoot: "webpack:///" }; var consumer = new SourceMapConsumer(map, 'http://www.example.com/q.js.map'); assert.equal(consumer.sources.length, 1); assert.equal(consumer.sources[0], "webpack:///webpack/bootstrap.js"); }; exports['test basic URL resolution with sourceMapURL'] = function (assert) { var map = { version: 3, sources: ["something.js"], names: [], mappings: "CAAS", file: "static/js/manifest.b7cf97680f7a50fa150f.js", sourceRoot: "src" }; var consumer = new SourceMapConsumer(map, 'http://www.example.com/x/q.js.map'); assert.equal(consumer.sources.length, 1); assert.equal(consumer.sources[0], 'http://www.example.com/x/src/something.js'); }; exports['test absolute sourceURL resolution with sourceMapURL'] = function (assert) { var map = { version: 3, sources: ["something.js"], names: [], mappings: "CAAS", file: "static/js/manifest.b7cf97680f7a50fa150f.js", sourceRoot: "http://www.example.com/src" }; var consumer = new SourceMapConsumer(map, 'http://www.example.com/x/q.js.map'); assert.equal(consumer.sources.length, 1); assert.equal(consumer.sources[0], 'http://www.example.com/src/something.js'); }; source-map-js-1.0.2/test/test-source-map-generator.js000066400000000000000000000526471417156454300225600ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var SourceMapGenerator = require('../lib/source-map-generator').SourceMapGenerator; var SourceMapConsumer = require('../lib/source-map-consumer').SourceMapConsumer; var SourceNode = require('../lib/source-node').SourceNode; var util = require('./util'); exports['test some simple stuff'] = function (assert) { var map = new SourceMapGenerator({ file: 'foo.js', sourceRoot: '.' }).toJSON(); assert.ok('file' in map); assert.ok('sourceRoot' in map); var map = new SourceMapGenerator().toJSON(); assert.ok(!('file' in map)); assert.ok(!('sourceRoot' in map)); }; exports['test JSON serialization'] = function (assert) { var map = new SourceMapGenerator({ file: 'foo.js', sourceRoot: '.' }); assert.equal(map.toString(), JSON.stringify(map)); }; exports['test adding mappings (case 1)'] = function (assert) { var map = new SourceMapGenerator({ file: 'generated-foo.js', sourceRoot: '.' }); assert.doesNotThrow(function () { map.addMapping({ generated: { line: 1, column: 1 } }); }); }; exports['test adding mappings (case 2)'] = function (assert) { var map = new SourceMapGenerator({ file: 'generated-foo.js', sourceRoot: '.' }); assert.doesNotThrow(function () { map.addMapping({ generated: { line: 1, column: 1 }, source: 'bar.js', original: { line: 1, column: 1 } }); }); }; exports['test adding mappings (case 3)'] = function (assert) { var map = new SourceMapGenerator({ file: 'generated-foo.js', sourceRoot: '.' }); assert.doesNotThrow(function () { map.addMapping({ generated: { line: 1, column: 1 }, source: 'bar.js', original: { line: 1, column: 1 }, name: 'someToken' }); }); }; exports['test adding mappings (invalid)'] = function (assert) { var map = new SourceMapGenerator({ file: 'generated-foo.js', sourceRoot: '.' }); // Not enough info. assert.throws(function () { map.addMapping({}); }); // Original file position, but no source. assert.throws(function () { map.addMapping({ generated: { line: 1, column: 1 }, original: { line: 1, column: 1 } }); }); }; exports['test adding mappings with skipValidation'] = function (assert) { var map = new SourceMapGenerator({ file: 'generated-foo.js', sourceRoot: '.', skipValidation: true }); // Not enough info, caught by `util.getArgs` assert.throws(function () { map.addMapping({}); }); // Original file position, but no source. Not checked. assert.doesNotThrow(function () { map.addMapping({ generated: { line: 1, column: 1 }, original: { line: 1, column: 1 } }); }); }; exports['test that the correct mappings are being generated'] = function (assert) { var map = new SourceMapGenerator({ file: 'min.js', sourceRoot: '/the/root' }); map.addMapping({ generated: { line: 1, column: 1 }, original: { line: 1, column: 1 }, source: 'one.js' }); map.addMapping({ generated: { line: 1, column: 5 }, original: { line: 1, column: 5 }, source: 'one.js' }); map.addMapping({ generated: { line: 1, column: 9 }, original: { line: 1, column: 11 }, source: 'one.js' }); map.addMapping({ generated: { line: 1, column: 18 }, original: { line: 1, column: 21 }, source: 'one.js', name: 'bar' }); map.addMapping({ generated: { line: 1, column: 21 }, original: { line: 2, column: 3 }, source: 'one.js' }); map.addMapping({ generated: { line: 1, column: 28 }, original: { line: 2, column: 10 }, source: 'one.js', name: 'baz' }); map.addMapping({ generated: { line: 1, column: 32 }, original: { line: 2, column: 14 }, source: 'one.js', name: 'bar' }); map.addMapping({ generated: { line: 2, column: 1 }, original: { line: 1, column: 1 }, source: 'two.js' }); map.addMapping({ generated: { line: 2, column: 5 }, original: { line: 1, column: 5 }, source: 'two.js' }); map.addMapping({ generated: { line: 2, column: 9 }, original: { line: 1, column: 11 }, source: 'two.js' }); map.addMapping({ generated: { line: 2, column: 18 }, original: { line: 1, column: 21 }, source: 'two.js', name: 'n' }); map.addMapping({ generated: { line: 2, column: 21 }, original: { line: 2, column: 3 }, source: 'two.js' }); map.addMapping({ generated: { line: 2, column: 28 }, original: { line: 2, column: 10 }, source: 'two.js', name: 'n' }); map = JSON.parse(map.toString()); util.assertEqualMaps(assert, map, util.testMap); }; exports['test that adding a mapping with an empty string name does not break generation'] = function (assert) { var map = new SourceMapGenerator({ file: 'generated-foo.js', sourceRoot: '.' }); map.addMapping({ generated: { line: 1, column: 1 }, source: 'bar.js', original: { line: 1, column: 1 }, name: '' }); assert.doesNotThrow(function () { JSON.parse(map.toString()); }); }; exports['test that source content can be set'] = function (assert) { var map = new SourceMapGenerator({ file: 'min.js', sourceRoot: '/the/root' }); map.addMapping({ generated: { line: 1, column: 1 }, original: { line: 1, column: 1 }, source: 'one.js' }); map.addMapping({ generated: { line: 2, column: 1 }, original: { line: 1, column: 1 }, source: 'two.js' }); map.setSourceContent('one.js', 'one file content'); map = JSON.parse(map.toString()); assert.equal(map.sources[0], 'one.js'); assert.equal(map.sources[1], 'two.js'); assert.equal(map.sourcesContent[0], 'one file content'); assert.equal(map.sourcesContent[1], null); }; exports['test .fromSourceMap'] = function (assert) { var map = SourceMapGenerator.fromSourceMap(new SourceMapConsumer(util.testMap)); util.assertEqualMaps(assert, map.toJSON(), util.testMap); }; exports['test .fromSourceMap with sourcesContent'] = function (assert) { var map = SourceMapGenerator.fromSourceMap( new SourceMapConsumer(util.testMapWithSourcesContent)); util.assertEqualMaps(assert, map.toJSON(), util.testMapWithSourcesContent); }; exports['test .fromSourceMap with single source'] = function (assert) { var map = SourceMapGenerator.fromSourceMap( new SourceMapConsumer(util.testMapSingleSource)); util.assertEqualMaps(assert, map.toJSON(), util.testMapSingleSource); }; exports['test .fromSourceMap with empty mappings'] = function (assert) { var map = SourceMapGenerator.fromSourceMap( new SourceMapConsumer(util.testMapEmptyMappings)); util.assertEqualMaps(assert, map.toJSON(), util.testMapEmptyMappings); }; exports['test .fromSourceMap with empty mappings and relative sources'] = function (assert) { var map = SourceMapGenerator.fromSourceMap( new SourceMapConsumer(util.testMapEmptyMappingsRelativeSources)); util.assertEqualMaps(assert, map.toJSON(), util.testMapEmptyMappingsRelativeSources_generatedExpected); }; exports['test .fromSourceMap with multiple sources where mappings refers only to single source'] = function (assert) { var map = SourceMapGenerator.fromSourceMap( new SourceMapConsumer(util.testMapMultiSourcesMappingRefersSingleSourceOnly)); util.assertEqualMaps(assert, map.toJSON(), util.testMapMultiSourcesMappingRefersSingleSourceOnly); }; exports['test applySourceMap'] = function (assert) { var node = new SourceNode(null, null, null, [ new SourceNode(2, 0, 'fileX', 'lineX2\n'), 'genA1\n', new SourceNode(2, 0, 'fileY', 'lineY2\n'), 'genA2\n', new SourceNode(1, 0, 'fileX', 'lineX1\n'), 'genA3\n', new SourceNode(1, 0, 'fileY', 'lineY1\n') ]); var mapStep1 = node.toStringWithSourceMap({ file: 'fileA' }).map; mapStep1.setSourceContent('fileX', 'lineX1\nlineX2\n'); mapStep1 = mapStep1.toJSON(); node = new SourceNode(null, null, null, [ 'gen1\n', new SourceNode(1, 0, 'fileA', 'lineA1\n'), new SourceNode(2, 0, 'fileA', 'lineA2\n'), new SourceNode(3, 0, 'fileA', 'lineA3\n'), new SourceNode(4, 0, 'fileA', 'lineA4\n'), new SourceNode(1, 0, 'fileB', 'lineB1\n'), new SourceNode(2, 0, 'fileB', 'lineB2\n'), 'gen2\n' ]); var mapStep2 = node.toStringWithSourceMap({ file: 'fileGen' }).map; mapStep2.setSourceContent('fileB', 'lineB1\nlineB2\n'); mapStep2 = mapStep2.toJSON(); node = new SourceNode(null, null, null, [ 'gen1\n', new SourceNode(2, 0, 'fileX', 'lineA1\n'), new SourceNode(2, 0, 'fileA', 'lineA2\n'), new SourceNode(2, 0, 'fileY', 'lineA3\n'), new SourceNode(4, 0, 'fileA', 'lineA4\n'), new SourceNode(1, 0, 'fileB', 'lineB1\n'), new SourceNode(2, 0, 'fileB', 'lineB2\n'), 'gen2\n' ]); var expectedMap = node.toStringWithSourceMap({ file: 'fileGen' }).map; expectedMap.setSourceContent('fileX', 'lineX1\nlineX2\n'); expectedMap.setSourceContent('fileB', 'lineB1\nlineB2\n'); expectedMap = expectedMap.toJSON(); // apply source map "mapStep1" to "mapStep2" var generator = SourceMapGenerator.fromSourceMap(new SourceMapConsumer(mapStep2)); generator.applySourceMap(new SourceMapConsumer(mapStep1)); var actualMap = generator.toJSON(); util.assertEqualMaps(assert, actualMap, expectedMap); }; exports['test applySourceMap throws when file is missing'] = function (assert) { var map = new SourceMapGenerator({ file: 'test.js' }); var map2 = new SourceMapGenerator(); assert.throws(function() { map.applySourceMap(new SourceMapConsumer(map2.toJSON())); }); }; exports['test the two additional parameters of applySourceMap'] = function (assert) { // Assume the following directory structure: // // http://foo.org/ // bar.coffee // app/ // coffee/ // foo.coffee // temp/ // bundle.js // temp_maps/ // bundle.js.map // public/ // bundle.min.js // bundle.min.js.map // // http://www.example.com/ // baz.coffee var bundleMap = new SourceMapGenerator({ file: 'bundle.js' }); bundleMap.addMapping({ generated: { line: 3, column: 3 }, original: { line: 2, column: 2 }, source: '../../coffee/foo.coffee' }); bundleMap.setSourceContent('../../coffee/foo.coffee', 'foo coffee'); bundleMap.addMapping({ generated: { line: 13, column: 13 }, original: { line: 12, column: 12 }, source: '/bar.coffee' }); bundleMap.setSourceContent('/bar.coffee', 'bar coffee'); bundleMap.addMapping({ generated: { line: 23, column: 23 }, original: { line: 22, column: 22 }, source: 'http://www.example.com/baz.coffee' }); bundleMap.setSourceContent( 'http://www.example.com/baz.coffee', 'baz coffee' ); bundleMap = new SourceMapConsumer(bundleMap.toJSON()); var minifiedMap = new SourceMapGenerator({ file: 'bundle.min.js', sourceRoot: '..' }); minifiedMap.addMapping({ generated: { line: 1, column: 1 }, original: { line: 3, column: 3 }, source: 'temp/bundle.js' }); minifiedMap.addMapping({ generated: { line: 11, column: 11 }, original: { line: 13, column: 13 }, source: 'temp/bundle.js' }); minifiedMap.addMapping({ generated: { line: 21, column: 21 }, original: { line: 23, column: 23 }, source: 'temp/bundle.js' }); minifiedMap = new SourceMapConsumer(minifiedMap.toJSON()); var expectedMap = function (sources) { var map = new SourceMapGenerator({ file: 'bundle.min.js', sourceRoot: '..' }); map.addMapping({ generated: { line: 1, column: 1 }, original: { line: 2, column: 2 }, source: sources[0] }); map.setSourceContent(sources[0], 'foo coffee'); map.addMapping({ generated: { line: 11, column: 11 }, original: { line: 12, column: 12 }, source: sources[1] }); map.setSourceContent(sources[1], 'bar coffee'); map.addMapping({ generated: { line: 21, column: 21 }, original: { line: 22, column: 22 }, source: sources[2] }); map.setSourceContent(sources[2], 'baz coffee'); return map.toJSON(); } var actualMap = function (aSourceMapPath) { var map = SourceMapGenerator.fromSourceMap(minifiedMap); // Note that relying on `bundleMap.file` (which is simply 'bundle.js') // instead of supplying the second parameter wouldn't work here. map.applySourceMap(bundleMap, '../temp/bundle.js', aSourceMapPath); return map.toJSON(); } util.assertEqualMaps(assert, actualMap('../temp/temp_maps'), expectedMap([ 'coffee/foo.coffee', '/bar.coffee', 'http://www.example.com/baz.coffee' ])); util.assertEqualMaps(assert, actualMap('/app/temp/temp_maps'), expectedMap([ '/app/coffee/foo.coffee', '/bar.coffee', 'http://www.example.com/baz.coffee' ])); util.assertEqualMaps(assert, actualMap('http://foo.org/app/temp/temp_maps'), expectedMap([ 'http://foo.org/app/coffee/foo.coffee', 'http://foo.org/bar.coffee', 'http://www.example.com/baz.coffee' ])); // If the third parameter is omitted or set to the current working // directory we get incorrect source paths: util.assertEqualMaps(assert, actualMap(), expectedMap([ '../coffee/foo.coffee', '/bar.coffee', 'http://www.example.com/baz.coffee' ])); util.assertEqualMaps(assert, actualMap(''), expectedMap([ '../coffee/foo.coffee', '/bar.coffee', 'http://www.example.com/baz.coffee' ])); util.assertEqualMaps(assert, actualMap('.'), expectedMap([ '../coffee/foo.coffee', '/bar.coffee', 'http://www.example.com/baz.coffee' ])); util.assertEqualMaps(assert, actualMap('./'), expectedMap([ '../coffee/foo.coffee', '/bar.coffee', 'http://www.example.com/baz.coffee' ])); }; exports['test applySourceMap name handling'] = function (assert) { // Imagine some CoffeeScript code being compiled into JavaScript and then // minified. var assertName = function(coffeeName, jsName, expectedName) { var minifiedMap = new SourceMapGenerator({ file: 'test.js.min' }); minifiedMap.addMapping({ generated: { line: 1, column: 4 }, original: { line: 1, column: 4 }, source: 'test.js', name: jsName }); var coffeeMap = new SourceMapGenerator({ file: 'test.js' }); coffeeMap.addMapping({ generated: { line: 1, column: 4 }, original: { line: 1, column: 0 }, source: 'test.coffee', name: coffeeName }); minifiedMap.applySourceMap(new SourceMapConsumer(coffeeMap.toJSON())); new SourceMapConsumer(minifiedMap.toJSON()).eachMapping(function(mapping) { assert.equal(mapping.name, expectedName); }); }; // `foo = 1` -> `var foo = 1;` -> `var a=1` // CoffeeScript doesn’t rename variables, so there’s no need for it to // provide names in its source maps. Minifiers do rename variables and // therefore do provide names in their source maps. So that name should be // retained if the original map lacks names. assertName(null, 'foo', 'foo'); // `foo = 1` -> `var coffee$foo = 1;` -> `var a=1` // Imagine that CoffeeScript prefixed all variables with `coffee$`. Even // though the minifier then also provides a name, the original name is // what corresponds to the source. assertName('foo', 'coffee$foo', 'foo'); // `foo = 1` -> `var coffee$foo = 1;` -> `var coffee$foo=1` // Minifiers can turn off variable mangling. Then there’s no need to // provide names in the source map, but the names from the original map are // still needed. assertName('foo', null, 'foo'); // `foo = 1` -> `var foo = 1;` -> `var foo=1` // No renaming at all. assertName(null, null, null); }; exports['test sorting with duplicate generated mappings'] = function (assert) { var map = new SourceMapGenerator({ file: 'test.js' }); map.addMapping({ generated: { line: 3, column: 0 }, original: { line: 2, column: 0 }, source: 'a.js' }); map.addMapping({ generated: { line: 2, column: 0 } }); map.addMapping({ generated: { line: 2, column: 0 } }); map.addMapping({ generated: { line: 1, column: 0 }, original: { line: 1, column: 0 }, source: 'a.js' }); util.assertEqualMaps(assert, map.toJSON(), { version: 3, file: 'test.js', sources: ['a.js'], names: [], mappings: 'AAAA;A;AACA' }); }; exports['test ignore duplicate mappings.'] = function (assert) { var init = { file: 'min.js', sourceRoot: '/the/root' }; var map1, map2; // null original source location var nullMapping1 = { generated: { line: 1, column: 0 } }; var nullMapping2 = { generated: { line: 2, column: 2 } }; map1 = new SourceMapGenerator(init); map2 = new SourceMapGenerator(init); map1.addMapping(nullMapping1); map1.addMapping(nullMapping1); map2.addMapping(nullMapping1); util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); map1.addMapping(nullMapping2); map1.addMapping(nullMapping1); map2.addMapping(nullMapping2); util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); // original source location var srcMapping1 = { generated: { line: 1, column: 0 }, original: { line: 11, column: 0 }, source: 'srcMapping1.js' }; var srcMapping2 = { generated: { line: 2, column: 2 }, original: { line: 11, column: 0 }, source: 'srcMapping2.js' }; map1 = new SourceMapGenerator(init); map2 = new SourceMapGenerator(init); map1.addMapping(srcMapping1); map1.addMapping(srcMapping1); map2.addMapping(srcMapping1); util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); map1.addMapping(srcMapping2); map1.addMapping(srcMapping1); map2.addMapping(srcMapping2); util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); // full original source and name information var fullMapping1 = { generated: { line: 1, column: 0 }, original: { line: 11, column: 0 }, source: 'fullMapping1.js', name: 'fullMapping1' }; var fullMapping2 = { generated: { line: 2, column: 2 }, original: { line: 11, column: 0 }, source: 'fullMapping2.js', name: 'fullMapping2' }; map1 = new SourceMapGenerator(init); map2 = new SourceMapGenerator(init); map1.addMapping(fullMapping1); map1.addMapping(fullMapping1); map2.addMapping(fullMapping1); util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); map1.addMapping(fullMapping2); map1.addMapping(fullMapping1); map2.addMapping(fullMapping2); util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); }; exports['test github issue #72, check for duplicate names or sources'] = function (assert) { var map = new SourceMapGenerator({ file: 'test.js' }); map.addMapping({ generated: { line: 1, column: 1 }, original: { line: 2, column: 2 }, source: 'a.js', name: 'foo' }); map.addMapping({ generated: { line: 3, column: 3 }, original: { line: 4, column: 4 }, source: 'a.js', name: 'foo' }); util.assertEqualMaps(assert, map.toJSON(), { version: 3, file: 'test.js', sources: ['a.js'], names: ['foo'], mappings: 'CACEA;;GAEEA' }); }; exports['test setting sourcesContent to null when already null'] = function (assert) { var smg = new SourceMapGenerator({ file: "foo.js" }); assert.doesNotThrow(function() { smg.setSourceContent("bar.js", null); }); }; exports['test applySourceMap with unexact match'] = function (assert) { var map1 = new SourceMapGenerator({ file: 'bundled-source' }); map1.addMapping({ generated: { line: 1, column: 4 }, original: { line: 1, column: 4 }, source: 'transformed-source' }); map1.addMapping({ generated: { line: 2, column: 4 }, original: { line: 2, column: 4 }, source: 'transformed-source' }); var map2 = new SourceMapGenerator({ file: 'transformed-source' }); map2.addMapping({ generated: { line: 2, column: 0 }, original: { line: 1, column: 0 }, source: 'original-source' }); var expectedMap = new SourceMapGenerator({ file: 'bundled-source' }); expectedMap.addMapping({ generated: { line: 1, column: 4 }, original: { line: 1, column: 4 }, source: 'transformed-source' }); expectedMap.addMapping({ generated: { line: 2, column: 4 }, original: { line: 1, column: 0 }, source: 'original-source' }); map1.applySourceMap(new SourceMapConsumer(map2.toJSON())); util.assertEqualMaps(assert, map1.toJSON(), expectedMap.toJSON()); }; exports['test issue #192'] = function (assert) { var generator = new SourceMapGenerator(); generator.addMapping({ source: 'a.js', generated: { line: 1, column: 10 }, original: { line: 1, column: 10 }, }); generator.addMapping({ source: 'b.js', generated: { line: 1, column: 10 }, original: { line: 2, column: 20 }, }); var consumer = new SourceMapConsumer(generator.toJSON()); var n = 0; consumer.eachMapping(function () { n++ }); assert.equal(n, 2, "Should not de-duplicate mappings that have the same " + "generated positions, but different original positions."); }; exports['test numeric names #231'] = function (assert) { var generator = new SourceMapGenerator(); generator.addMapping({ source: 'a.js', generated: { line: 1, column: 10 }, original: { line: 1, column: 10 }, name: 8 }); var map = generator.toJSON(); assert.ok(map, "Adding a mapping with a numeric name did not throw"); assert.equal(map.names.length, 1, "Should have one name"); assert.equal(map.names[0], "8", "Should have the right name"); }; source-map-js-1.0.2/test/test-source-node.js000066400000000000000000000451041417156454300207320ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var util = require("./util"); var SourceMapGenerator = require('../lib/source-map-generator').SourceMapGenerator; var SourceMapConsumer = require('../lib/source-map-consumer').SourceMapConsumer; var SourceNode = require('../lib/source-node').SourceNode; function forEachNewline(fn) { return function (assert) { ['\n', '\r\n'].forEach(fn.bind(null, assert)); } } exports['test .add()'] = function (assert) { var node = new SourceNode(null, null, null); // Adding a string works. node.add('function noop() {}'); // Adding another source node works. node.add(new SourceNode(null, null, null)); // Adding an array works. node.add(['function foo() {', new SourceNode(null, null, null, 'return 10;'), '}']); // Adding other stuff doesn't. assert.throws(function () { node.add({}); }); assert.throws(function () { node.add(function () {}); }); }; exports['test .prepend()'] = function (assert) { var node = new SourceNode(null, null, null); // Prepending a string works. node.prepend('function noop() {}'); assert.equal(node.children[0], 'function noop() {}'); assert.equal(node.children.length, 1); // Prepending another source node works. node.prepend(new SourceNode(null, null, null)); assert.equal(node.children[0], ''); assert.equal(node.children[1], 'function noop() {}'); assert.equal(node.children.length, 2); // Prepending an array works. node.prepend(['function foo() {', new SourceNode(null, null, null, 'return 10;'), '}']); assert.equal(node.children[0], 'function foo() {'); assert.equal(node.children[1], 'return 10;'); assert.equal(node.children[2], '}'); assert.equal(node.children[3], ''); assert.equal(node.children[4], 'function noop() {}'); assert.equal(node.children.length, 5); // Prepending other stuff doesn't. assert.throws(function () { node.prepend({}); }); assert.throws(function () { node.prepend(function () {}); }); }; exports['test .toString()'] = function (assert) { assert.equal((new SourceNode(null, null, null, ['function foo() {', new SourceNode(null, null, null, 'return 10;'), '}'])).toString(), 'function foo() {return 10;}'); }; exports['test .join()'] = function (assert) { assert.equal((new SourceNode(null, null, null, ['a', 'b', 'c', 'd'])).join(', ').toString(), 'a, b, c, d'); }; exports['test .walk()'] = function (assert) { var node = new SourceNode(null, null, null, ['(function () {\n', ' ', new SourceNode(1, 0, 'a.js', ['someCall()']), ';\n', ' ', new SourceNode(2, 0, 'b.js', ['if (foo) bar()']), ';\n', '}());']); var expected = [ { str: '(function () {\n', source: null, line: null, column: null }, { str: ' ', source: null, line: null, column: null }, { str: 'someCall()', source: 'a.js', line: 1, column: 0 }, { str: ';\n', source: null, line: null, column: null }, { str: ' ', source: null, line: null, column: null }, { str: 'if (foo) bar()', source: 'b.js', line: 2, column: 0 }, { str: ';\n', source: null, line: null, column: null }, { str: '}());', source: null, line: null, column: null }, ]; var i = 0; node.walk(function (chunk, loc) { assert.equal(expected[i].str, chunk); assert.equal(expected[i].source, loc.source); assert.equal(expected[i].line, loc.line); assert.equal(expected[i].column, loc.column); i++; }); }; exports['test .replaceRight'] = function (assert) { var node; // Not nested node = new SourceNode(null, null, null, 'hello world'); node.replaceRight(/world/, 'universe'); assert.equal(node.toString(), 'hello universe'); // Nested node = new SourceNode(null, null, null, [new SourceNode(null, null, null, 'hey sexy mama, '), new SourceNode(null, null, null, 'want to kill all humans?')]); node.replaceRight(/kill all humans/, 'watch Futurama'); assert.equal(node.toString(), 'hey sexy mama, want to watch Futurama?'); }; exports['test .toStringWithSourceMap()'] = forEachNewline(function (assert, nl) { var node = new SourceNode(null, null, null, ['(function () {' + nl, ' ', new SourceNode(1, 0, 'a.js', 'someCall', 'originalCall'), new SourceNode(1, 8, 'a.js', '()'), ';' + nl, ' ', new SourceNode(2, 0, 'b.js', ['if (foo) bar()']), ';' + nl, '}());']); var result = node.toStringWithSourceMap({ file: 'foo.js' }); assert.equal(result.code, [ '(function () {', ' someCall();', ' if (foo) bar();', '}());' ].join(nl)); var map = result.map; var mapWithoutOptions = node.toStringWithSourceMap().map; assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); assert.ok(mapWithoutOptions instanceof SourceMapGenerator, 'mapWithoutOptions instanceof SourceMapGenerator'); assert.ok(!('file' in mapWithoutOptions)); mapWithoutOptions._file = 'foo.js'; util.assertEqualMaps(assert, map.toJSON(), mapWithoutOptions.toJSON()); map = new SourceMapConsumer(map.toString()); var actual; actual = map.originalPositionFor({ line: 1, column: 4 }); assert.equal(actual.source, null); assert.equal(actual.line, null); assert.equal(actual.column, null); actual = map.originalPositionFor({ line: 2, column: 2 }); assert.equal(actual.source, 'a.js'); assert.equal(actual.line, 1); assert.equal(actual.column, 0); assert.equal(actual.name, 'originalCall'); actual = map.originalPositionFor({ line: 3, column: 2 }); assert.equal(actual.source, 'b.js'); assert.equal(actual.line, 2); assert.equal(actual.column, 0); actual = map.originalPositionFor({ line: 3, column: 16 }); assert.equal(actual.source, null); assert.equal(actual.line, null); assert.equal(actual.column, null); actual = map.originalPositionFor({ line: 4, column: 2 }); assert.equal(actual.source, null); assert.equal(actual.line, null); assert.equal(actual.column, null); }); exports['test .fromStringWithSourceMap()'] = forEachNewline(function (assert, nl) { var testCode = util.testGeneratedCode.replace(/\n/g, nl); var node = SourceNode.fromStringWithSourceMap( testCode, new SourceMapConsumer(util.testMap)); var result = node.toStringWithSourceMap({ file: 'min.js' }); var map = result.map; var code = result.code; assert.equal(code, testCode); assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); map = map.toJSON(); assert.equal(map.version, util.testMap.version); assert.equal(map.file, util.testMap.file); assert.equal(map.mappings, util.testMap.mappings); }); exports['test .fromStringWithSourceMap() empty map'] = forEachNewline(function (assert, nl) { var node = SourceNode.fromStringWithSourceMap( util.testGeneratedCode.replace(/\n/g, nl), new SourceMapConsumer(util.emptyMap)); var result = node.toStringWithSourceMap({ file: 'min.js' }); var map = result.map; var code = result.code; assert.equal(code, util.testGeneratedCode.replace(/\n/g, nl)); assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); map = map.toJSON(); assert.equal(map.version, util.emptyMap.version); assert.equal(map.file, util.emptyMap.file); assert.equal(map.mappings.length, util.emptyMap.mappings.length); assert.equal(map.mappings, util.emptyMap.mappings); }); exports['test .fromStringWithSourceMap() complex version'] = forEachNewline(function (assert, nl) { var input = new SourceNode(null, null, null, [ "(function() {" + nl, " var Test = {};" + nl, " ", new SourceNode(1, 0, "a.js", "Test.A = { value: 1234 };" + nl), " ", new SourceNode(2, 0, "a.js", "Test.A.x = 'xyz';"), nl, "}());" + nl, "/* Generated Source */"]); input = input.toStringWithSourceMap({ file: 'foo.js' }); var node = SourceNode.fromStringWithSourceMap( input.code, new SourceMapConsumer(input.map.toString())); var result = node.toStringWithSourceMap({ file: 'foo.js' }); var map = result.map; var code = result.code; assert.equal(code, input.code); assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); map = map.toJSON(); var inputMap = input.map.toJSON(); util.assertEqualMaps(assert, map, inputMap); }); exports['test .fromStringWithSourceMap() third argument'] = function (assert) { // Assume the following directory structure: // // http://foo.org/ // app/ // coffee/ // foo.coffee // coffeeBundle.js # Made from {foo,bar,baz}.coffee // maps/ // coffeeBundle.js.map // js/ // foo.js // public/ // app.js # Made from {foo,coffeeBundle}.js // app.js.map var coffeeBundle = new SourceNode(1, 0, 'foo.coffee', 'foo(coffee);\n'); coffeeBundle.setSourceContent('foo.coffee', 'foo coffee'); coffeeBundle = coffeeBundle.toStringWithSourceMap({ file: 'foo.js', sourceRoot: '..' }); var foo = new SourceNode(1, 0, 'foo.js', 'foo(js);'); var test = function(relativePath, expectedSources) { var app = new SourceNode(); app.add(SourceNode.fromStringWithSourceMap( coffeeBundle.code, new SourceMapConsumer(coffeeBundle.map.toString()), relativePath)); app.add(foo); var i = 0; app.walk(function (chunk, loc) { assert.equal(loc.source, expectedSources[i]); i++; }); app.walkSourceContents(function (sourceFile, sourceContent) { assert.equal(sourceFile, expectedSources[0]); assert.equal(sourceContent, 'foo coffee'); }) }; test('../coffee/maps', [ '../coffee/foo.coffee', 'foo.js' ]); // If the third parameter is omitted or set to the current working // directory we get incorrect source paths: test(undefined, [ '../foo.coffee', 'foo.js' ]); test('', [ '../foo.coffee', 'foo.js' ]); test('.', [ '../foo.coffee', 'foo.js' ]); test('./', [ '../foo.coffee', 'foo.js' ]); }; exports['test .toStringWithSourceMap() merging duplicate mappings'] = forEachNewline(function (assert, nl) { var input = new SourceNode(null, null, null, [ new SourceNode(1, 0, "a.js", "(function"), new SourceNode(1, 0, "a.js", "() {" + nl), " ", new SourceNode(1, 0, "a.js", "var Test = "), new SourceNode(1, 0, "b.js", "{};" + nl), new SourceNode(2, 0, "b.js", "Test"), new SourceNode(2, 0, "b.js", ".A", "A"), new SourceNode(2, 20, "b.js", " = { value: ", "A"), "1234", new SourceNode(2, 40, "b.js", " };" + nl, "A"), "}());" + nl, "/* Generated Source */" ]); input = input.toStringWithSourceMap({ file: 'foo.js' }); assert.equal(input.code, [ "(function() {", " var Test = {};", "Test.A = { value: 1234 };", "}());", "/* Generated Source */" ].join(nl)) var correctMap = new SourceMapGenerator({ file: 'foo.js' }); correctMap.addMapping({ generated: { line: 1, column: 0 }, source: 'a.js', original: { line: 1, column: 0 } }); // Here is no need for a empty mapping, // because mappings ends at eol correctMap.addMapping({ generated: { line: 2, column: 2 }, source: 'a.js', original: { line: 1, column: 0 } }); correctMap.addMapping({ generated: { line: 2, column: 13 }, source: 'b.js', original: { line: 1, column: 0 } }); correctMap.addMapping({ generated: { line: 3, column: 0 }, source: 'b.js', original: { line: 2, column: 0 } }); correctMap.addMapping({ generated: { line: 3, column: 4 }, source: 'b.js', name: 'A', original: { line: 2, column: 0 } }); correctMap.addMapping({ generated: { line: 3, column: 6 }, source: 'b.js', name: 'A', original: { line: 2, column: 20 } }); // This empty mapping is required, // because there is a hole in the middle of the line correctMap.addMapping({ generated: { line: 3, column: 18 } }); correctMap.addMapping({ generated: { line: 3, column: 22 }, source: 'b.js', name: 'A', original: { line: 2, column: 40 } }); // Here is no need for a empty mapping, // because mappings ends at eol var inputMap = input.map.toJSON(); correctMap = correctMap.toJSON(); util.assertEqualMaps(assert, inputMap, correctMap); }); exports['test .toStringWithSourceMap() multi-line SourceNodes'] = forEachNewline(function (assert, nl) { var input = new SourceNode(null, null, null, [ new SourceNode(1, 0, "a.js", "(function() {" + nl + "var nextLine = 1;" + nl + "anotherLine();" + nl), new SourceNode(2, 2, "b.js", "Test.call(this, 123);" + nl), new SourceNode(2, 2, "b.js", "this['stuff'] = 'v';" + nl), new SourceNode(2, 2, "b.js", "anotherLine();" + nl), "/*" + nl + "Generated" + nl + "Source" + nl + "*/" + nl, new SourceNode(3, 4, "c.js", "anotherLine();" + nl), "/*" + nl + "Generated" + nl + "Source" + nl + "*/" ]); input = input.toStringWithSourceMap({ file: 'foo.js' }); assert.equal(input.code, [ "(function() {", "var nextLine = 1;", "anotherLine();", "Test.call(this, 123);", "this['stuff'] = 'v';", "anotherLine();", "/*", "Generated", "Source", "*/", "anotherLine();", "/*", "Generated", "Source", "*/" ].join(nl)); var correctMap = new SourceMapGenerator({ file: 'foo.js' }); correctMap.addMapping({ generated: { line: 1, column: 0 }, source: 'a.js', original: { line: 1, column: 0 } }); correctMap.addMapping({ generated: { line: 2, column: 0 }, source: 'a.js', original: { line: 1, column: 0 } }); correctMap.addMapping({ generated: { line: 3, column: 0 }, source: 'a.js', original: { line: 1, column: 0 } }); correctMap.addMapping({ generated: { line: 4, column: 0 }, source: 'b.js', original: { line: 2, column: 2 } }); correctMap.addMapping({ generated: { line: 5, column: 0 }, source: 'b.js', original: { line: 2, column: 2 } }); correctMap.addMapping({ generated: { line: 6, column: 0 }, source: 'b.js', original: { line: 2, column: 2 } }); correctMap.addMapping({ generated: { line: 11, column: 0 }, source: 'c.js', original: { line: 3, column: 4 } }); var inputMap = input.map.toJSON(); correctMap = correctMap.toJSON(); util.assertEqualMaps(assert, inputMap, correctMap); }); exports['test .toStringWithSourceMap() with empty string'] = function (assert) { var node = new SourceNode(1, 0, 'empty.js', ''); var result = node.toStringWithSourceMap(); assert.equal(result.code, ''); }; exports['test .toStringWithSourceMap() with consecutive newlines'] = forEachNewline(function (assert, nl) { var input = new SourceNode(null, null, null, [ "/***/" + nl + nl, new SourceNode(1, 0, "a.js", "'use strict';" + nl), new SourceNode(2, 0, "a.js", "a();"), ]); input = input.toStringWithSourceMap({ file: 'foo.js' }); assert.equal(input.code, [ "/***/", "", "'use strict';", "a();", ].join(nl)); var correctMap = new SourceMapGenerator({ file: 'foo.js' }); correctMap.addMapping({ generated: { line: 3, column: 0 }, source: 'a.js', original: { line: 1, column: 0 } }); correctMap.addMapping({ generated: { line: 4, column: 0 }, source: 'a.js', original: { line: 2, column: 0 } }); var inputMap = input.map.toJSON(); correctMap = correctMap.toJSON(); util.assertEqualMaps(assert, inputMap, correctMap); }); exports['test setSourceContent with toStringWithSourceMap'] = function (assert) { var aNode = new SourceNode(1, 1, 'a.js', 'a'); aNode.setSourceContent('a.js', 'someContent'); var node = new SourceNode(null, null, null, ['(function () {\n', ' ', aNode, ' ', new SourceNode(1, 1, 'b.js', 'b'), '}());']); node.setSourceContent('b.js', 'otherContent'); var map = node.toStringWithSourceMap({ file: 'foo.js' }).map; assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); map = new SourceMapConsumer(map.toString()); assert.equal(map.sources.length, 2); assert.equal(map.sources[0], 'a.js'); assert.equal(map.sources[1], 'b.js'); assert.equal(map.sourcesContent.length, 2); assert.equal(map.sourcesContent[0], 'someContent'); assert.equal(map.sourcesContent[1], 'otherContent'); }; exports['test walkSourceContents'] = function (assert) { var aNode = new SourceNode(1, 1, 'a.js', 'a'); aNode.setSourceContent('a.js', 'someContent'); var node = new SourceNode(null, null, null, ['(function () {\n', ' ', aNode, ' ', new SourceNode(1, 1, 'b.js', 'b'), '}());']); node.setSourceContent('b.js', 'otherContent'); var results = []; node.walkSourceContents(function (sourceFile, sourceContent) { results.push([sourceFile, sourceContent]); }); assert.equal(results.length, 2); assert.equal(results[0][0], 'a.js'); assert.equal(results[0][1], 'someContent'); assert.equal(results[1][0], 'b.js'); assert.equal(results[1][1], 'otherContent'); }; exports['test from issue 258'] = function (assert) { var node = new SourceNode(); var reactCode = ";require(0);\n//# sourceMappingURL=/index.ios.map?platform=ios&dev=false&minify=true"; var reactMap = "{\"version\":3,\"file\":\"/index.ios.bundle?platform=ios&dev=false&minify=true\",\"sections\":[{\"offset\":{\"line\":0,\"column\":0},\"map\":{\"version\":3,\"sources\":[\"require-0.js\"],\"names\":[],\"mappings\":\"AAAA;\",\"file\":\"require-0.js\",\"sourcesContent\":[\";require(0);\"]}}]}"; node.add(SourceNode.fromStringWithSourceMap( reactCode, new SourceMapConsumer(reactMap) )); } source-map-js-1.0.2/test/test-util.js000066400000000000000000000303401417156454300174600ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2014 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var libUtil = require('../lib/util'); exports['test urls'] = function (assert) { var assertUrl = function (url) { assert.equal(url, libUtil.urlGenerate(libUtil.urlParse(url))); }; assertUrl('http://'); assertUrl('http://www.example.com'); assertUrl('http://user:pass@www.example.com'); assertUrl('http://www.example.com:80'); assertUrl('http://www.example.com/'); assertUrl('http://www.example.com/foo/bar'); assertUrl('http://www.example.com/foo/bar/'); assertUrl('http://user:pass@www.example.com:80/foo/bar/'); assertUrl('//'); assertUrl('//www.example.com'); assertUrl('file:///www.example.com'); assert.equal(libUtil.urlParse(''), null); assert.equal(libUtil.urlParse('.'), null); assert.equal(libUtil.urlParse('..'), null); assert.equal(libUtil.urlParse('a'), null); assert.equal(libUtil.urlParse('a/b'), null); assert.equal(libUtil.urlParse('a//b'), null); assert.equal(libUtil.urlParse('/a'), null); assert.equal(libUtil.urlParse('data:foo,bar'), null); var parsed = libUtil.urlParse('http://x-y.com/bar'); assert.equal(parsed.scheme, 'http'); assert.equal(parsed.host, 'x-y.com'); assert.equal(parsed.path, '/bar'); var webpackURL = 'webpack:///webpack/bootstrap 67e184f9679733298d44' parsed = libUtil.urlParse(webpackURL); assert.equal(parsed.scheme, 'webpack'); assert.equal(parsed.host, ''); assert.equal(parsed.path, '/webpack/bootstrap 67e184f9679733298d44'); assert.equal(webpackURL, libUtil.urlGenerate(parsed)); }; exports['test normalize()'] = function (assert) { assert.equal(libUtil.normalize('/..'), '/'); assert.equal(libUtil.normalize('/../'), '/'); assert.equal(libUtil.normalize('/../../../..'), '/'); assert.equal(libUtil.normalize('/../../../../a/b/c'), '/a/b/c'); assert.equal(libUtil.normalize('/a/b/c/../../../d/../../e'), '/e'); assert.equal(libUtil.normalize('..'), '..'); assert.equal(libUtil.normalize('../'), '../'); assert.equal(libUtil.normalize('../../a/'), '../../a/'); assert.equal(libUtil.normalize('a/..'), '.'); assert.equal(libUtil.normalize('a/../../..'), '../..'); assert.equal(libUtil.normalize('/.'), '/'); assert.equal(libUtil.normalize('/./'), '/'); assert.equal(libUtil.normalize('/./././.'), '/'); assert.equal(libUtil.normalize('/././././a/b/c'), '/a/b/c'); assert.equal(libUtil.normalize('/a/b/c/./././d/././e'), '/a/b/c/d/e'); assert.equal(libUtil.normalize(''), '.'); assert.equal(libUtil.normalize('.'), '.'); assert.equal(libUtil.normalize('./'), '.'); assert.equal(libUtil.normalize('././a'), 'a'); assert.equal(libUtil.normalize('a/./'), 'a/'); assert.equal(libUtil.normalize('a/././.'), 'a'); assert.equal(libUtil.normalize('/a/b//c////d/////'), '/a/b/c/d/'); assert.equal(libUtil.normalize('///a/b//c////d/////'), '///a/b/c/d/'); assert.equal(libUtil.normalize('a/b//c////d'), 'a/b/c/d'); assert.equal(libUtil.normalize('.///.././../a/b//./..'), '../../a') assert.equal(libUtil.normalize('http://www.example.com'), 'http://www.example.com'); assert.equal(libUtil.normalize('http://www.example.com/'), 'http://www.example.com/'); assert.equal(libUtil.normalize('http://www.example.com/./..//a/b/c/.././d//'), 'http://www.example.com/a/b/d/'); }; exports['test join()'] = function (assert) { assert.equal(libUtil.join('a', 'b'), 'a/b'); assert.equal(libUtil.join('a/', 'b'), 'a/b'); assert.equal(libUtil.join('a//', 'b'), 'a/b'); assert.equal(libUtil.join('a', 'b/'), 'a/b/'); assert.equal(libUtil.join('a', 'b//'), 'a/b/'); assert.equal(libUtil.join('a/', '/b'), '/b'); assert.equal(libUtil.join('a//', '//b'), '//b'); assert.equal(libUtil.join('a', '..'), '.'); assert.equal(libUtil.join('a', '../b'), 'b'); assert.equal(libUtil.join('a/b', '../c'), 'a/c'); assert.equal(libUtil.join('a', '.'), 'a'); assert.equal(libUtil.join('a', './b'), 'a/b'); assert.equal(libUtil.join('a/b', './c'), 'a/b/c'); assert.equal(libUtil.join('a', 'http://www.example.com'), 'http://www.example.com'); assert.equal(libUtil.join('a', 'data:foo,bar'), 'data:foo,bar'); assert.equal(libUtil.join('', 'b'), 'b'); assert.equal(libUtil.join('.', 'b'), 'b'); assert.equal(libUtil.join('', 'b/'), 'b/'); assert.equal(libUtil.join('.', 'b/'), 'b/'); assert.equal(libUtil.join('', 'b//'), 'b/'); assert.equal(libUtil.join('.', 'b//'), 'b/'); assert.equal(libUtil.join('', '..'), '..'); assert.equal(libUtil.join('.', '..'), '..'); assert.equal(libUtil.join('', '../b'), '../b'); assert.equal(libUtil.join('.', '../b'), '../b'); assert.equal(libUtil.join('', '.'), '.'); assert.equal(libUtil.join('.', '.'), '.'); assert.equal(libUtil.join('', './b'), 'b'); assert.equal(libUtil.join('.', './b'), 'b'); assert.equal(libUtil.join('', 'http://www.example.com'), 'http://www.example.com'); assert.equal(libUtil.join('.', 'http://www.example.com'), 'http://www.example.com'); assert.equal(libUtil.join('', 'data:foo,bar'), 'data:foo,bar'); assert.equal(libUtil.join('.', 'data:foo,bar'), 'data:foo,bar'); assert.equal(libUtil.join('..', 'b'), '../b'); assert.equal(libUtil.join('..', 'b/'), '../b/'); assert.equal(libUtil.join('..', 'b//'), '../b/'); assert.equal(libUtil.join('..', '..'), '../..'); assert.equal(libUtil.join('..', '../b'), '../../b'); assert.equal(libUtil.join('..', '.'), '..'); assert.equal(libUtil.join('..', './b'), '../b'); assert.equal(libUtil.join('..', 'http://www.example.com'), 'http://www.example.com'); assert.equal(libUtil.join('..', 'data:foo,bar'), 'data:foo,bar'); assert.equal(libUtil.join('a', ''), 'a'); assert.equal(libUtil.join('a', '.'), 'a'); assert.equal(libUtil.join('a/', ''), 'a'); assert.equal(libUtil.join('a/', '.'), 'a'); assert.equal(libUtil.join('a//', ''), 'a'); assert.equal(libUtil.join('a//', '.'), 'a'); assert.equal(libUtil.join('/a', ''), '/a'); assert.equal(libUtil.join('/a', '.'), '/a'); assert.equal(libUtil.join('', ''), '.'); assert.equal(libUtil.join('.', ''), '.'); assert.equal(libUtil.join('.', ''), '.'); assert.equal(libUtil.join('.', '.'), '.'); assert.equal(libUtil.join('..', ''), '..'); assert.equal(libUtil.join('..', '.'), '..'); assert.equal(libUtil.join('http://foo.org/a', ''), 'http://foo.org/a'); assert.equal(libUtil.join('http://foo.org/a', '.'), 'http://foo.org/a'); assert.equal(libUtil.join('http://foo.org/a/', ''), 'http://foo.org/a'); assert.equal(libUtil.join('http://foo.org/a/', '.'), 'http://foo.org/a'); assert.equal(libUtil.join('http://foo.org/a//', ''), 'http://foo.org/a'); assert.equal(libUtil.join('http://foo.org/a//', '.'), 'http://foo.org/a'); assert.equal(libUtil.join('http://foo.org', ''), 'http://foo.org/'); assert.equal(libUtil.join('http://foo.org', '.'), 'http://foo.org/'); assert.equal(libUtil.join('http://foo.org/', ''), 'http://foo.org/'); assert.equal(libUtil.join('http://foo.org/', '.'), 'http://foo.org/'); assert.equal(libUtil.join('http://foo.org//', ''), 'http://foo.org/'); assert.equal(libUtil.join('http://foo.org//', '.'), 'http://foo.org/'); assert.equal(libUtil.join('//www.example.com', ''), '//www.example.com/'); assert.equal(libUtil.join('//www.example.com', '.'), '//www.example.com/'); assert.equal(libUtil.join('http://foo.org/a', 'b'), 'http://foo.org/a/b'); assert.equal(libUtil.join('http://foo.org/a/', 'b'), 'http://foo.org/a/b'); assert.equal(libUtil.join('http://foo.org/a//', 'b'), 'http://foo.org/a/b'); assert.equal(libUtil.join('http://foo.org/a', 'b/'), 'http://foo.org/a/b/'); assert.equal(libUtil.join('http://foo.org/a', 'b//'), 'http://foo.org/a/b/'); assert.equal(libUtil.join('http://foo.org/a/', '/b'), 'http://foo.org/b'); assert.equal(libUtil.join('http://foo.org/a//', '//b'), 'http://b'); assert.equal(libUtil.join('http://foo.org/a', '..'), 'http://foo.org/'); assert.equal(libUtil.join('http://foo.org/a', '../b'), 'http://foo.org/b'); assert.equal(libUtil.join('http://foo.org/a/b', '../c'), 'http://foo.org/a/c'); assert.equal(libUtil.join('http://foo.org/a', '.'), 'http://foo.org/a'); assert.equal(libUtil.join('http://foo.org/a', './b'), 'http://foo.org/a/b'); assert.equal(libUtil.join('http://foo.org/a/b', './c'), 'http://foo.org/a/b/c'); assert.equal(libUtil.join('http://foo.org/a', 'http://www.example.com'), 'http://www.example.com'); assert.equal(libUtil.join('http://foo.org/a', 'data:foo,bar'), 'data:foo,bar'); assert.equal(libUtil.join('http://foo.org', 'a'), 'http://foo.org/a'); assert.equal(libUtil.join('http://foo.org/', 'a'), 'http://foo.org/a'); assert.equal(libUtil.join('http://foo.org//', 'a'), 'http://foo.org/a'); assert.equal(libUtil.join('http://foo.org', '/a'), 'http://foo.org/a'); assert.equal(libUtil.join('http://foo.org/', '/a'), 'http://foo.org/a'); assert.equal(libUtil.join('http://foo.org//', '/a'), 'http://foo.org/a'); assert.equal(libUtil.join('http://', 'www.example.com'), 'http://www.example.com'); assert.equal(libUtil.join('file:///', 'www.example.com'), 'file:///www.example.com'); assert.equal(libUtil.join('http://', 'ftp://example.com'), 'ftp://example.com'); assert.equal(libUtil.join('http://www.example.com', '//foo.org/bar'), 'http://foo.org/bar'); assert.equal(libUtil.join('//www.example.com', '//foo.org/bar'), '//foo.org/bar'); }; // TODO Issue #128: Define and test this function properly. exports['test relative()'] = function (assert) { assert.equal(libUtil.relative('/the/root', '/the/root/one.js'), 'one.js'); assert.equal(libUtil.relative('http://the/root', 'http://the/root/one.js'), 'one.js'); assert.equal(libUtil.relative('/the/root', '/the/rootone.js'), '../rootone.js'); assert.equal(libUtil.relative('http://the/root', 'http://the/rootone.js'), '../rootone.js'); assert.equal(libUtil.relative('/the/root', '/therootone.js'), '/therootone.js'); assert.equal(libUtil.relative('http://the/root', '/therootone.js'), '/therootone.js'); assert.equal(libUtil.relative('', '/the/root/one.js'), '/the/root/one.js'); assert.equal(libUtil.relative('.', '/the/root/one.js'), '/the/root/one.js'); assert.equal(libUtil.relative('', 'the/root/one.js'), 'the/root/one.js'); assert.equal(libUtil.relative('.', 'the/root/one.js'), 'the/root/one.js'); assert.equal(libUtil.relative('/', '/the/root/one.js'), 'the/root/one.js'); assert.equal(libUtil.relative('/', 'the/root/one.js'), 'the/root/one.js'); }; exports['test computeSourceURL'] = function (assert) { // Tests with sourceMapURL. assert.equal(libUtil.computeSourceURL('', 'src/test.js', 'http://example.com'), 'http://example.com/src/test.js'); assert.equal(libUtil.computeSourceURL(undefined, 'src/test.js', 'http://example.com'), 'http://example.com/src/test.js'); assert.equal(libUtil.computeSourceURL('src', 'test.js', 'http://example.com'), 'http://example.com/src/test.js'); assert.equal(libUtil.computeSourceURL('src/', 'test.js', 'http://example.com'), 'http://example.com/src/test.js'); assert.equal(libUtil.computeSourceURL('src', '/test.js', 'http://example.com'), 'http://example.com/src/test.js'); assert.equal(libUtil.computeSourceURL('http://mozilla.com', 'src/test.js', 'http://example.com'), 'http://mozilla.com/src/test.js'); assert.equal(libUtil.computeSourceURL('', 'test.js', 'http://example.com/src/test.js.map'), 'http://example.com/src/test.js'); // Legacy code won't pass in the sourceMapURL. assert.equal(libUtil.computeSourceURL('', 'src/test.js'), 'src/test.js'); assert.equal(libUtil.computeSourceURL(undefined, 'src/test.js'), 'src/test.js'); assert.equal(libUtil.computeSourceURL('src', 'test.js'), 'src/test.js'); assert.equal(libUtil.computeSourceURL('src/', 'test.js'), 'src/test.js'); assert.equal(libUtil.computeSourceURL('src', '/test.js'), 'src/test.js'); assert.equal(libUtil.computeSourceURL('src', '../test.js'), 'test.js'); assert.equal(libUtil.computeSourceURL('src/dir', '../././../test.js'), 'test.js'); // This gives different results with the old algorithm and the new // spec-compliant algorithm. assert.equal(libUtil.computeSourceURL('http://example.com/dir', '/test.js'), 'http://example.com/dir/test.js'); }; source-map-js-1.0.2/test/util.js000066400000000000000000000231251417156454300165060ustar00rootroot00000000000000/* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var util = require('../lib/util'); // This is a test mapping which maps functions from two different files // (one.js and two.js) to a minified generated source. // // Here is one.js: // // ONE.foo = function (bar) { // return baz(bar); // }; // // Here is two.js: // // TWO.inc = function (n) { // return n + 1; // }; // // And here is the generated code (min.js): // // ONE.foo=function(a){return baz(a);}; // TWO.inc=function(a){return a+1;}; exports.testGeneratedCode = " ONE.foo=function(a){return baz(a);};\n"+ " TWO.inc=function(a){return a+1;};"; exports.testMap = { version: 3, file: 'min.js', names: ['bar', 'baz', 'n'], sources: ['one.js', 'two.js'], sourceRoot: '/the/root', mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' }; exports.testMapNoSourceRoot = { version: 3, file: 'min.js', names: ['bar', 'baz', 'n'], sources: ['one.js', 'two.js'], mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' }; exports.testMapEmptySourceRoot = { version: 3, file: 'min.js', names: ['bar', 'baz', 'n'], sources: ['one.js', 'two.js'], sourceRoot: '', mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' }; exports.testMapSingleSource = { version: 3, file: 'min.js', names: ['bar', 'baz'], sources: ['one.js'], sourceRoot: '', mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID' }; exports.testMapEmptyMappings = { version: 3, file: 'min.js', names: [], sources: ['one.js', 'two.js'], sourcesContent: [ ' ONE.foo = 1;', ' TWO.inc = 2;' ], sourceRoot: '', mappings: '' }; exports.testMapEmptyMappingsRelativeSources = { version: 3, file: 'min.js', names: [], sources: ['./one.js', './two.js'], sourcesContent: [ ' ONE.foo = 1;', ' TWO.inc = 2;' ], sourceRoot: '/the/root', mappings: '' }; exports.testMapEmptyMappingsRelativeSources_generatedExpected = { version: 3, file: 'min.js', names: [], sources: ['one.js', 'two.js'], sourcesContent: [ ' ONE.foo = 1;', ' TWO.inc = 2;' ], sourceRoot: '/the/root', mappings: '' }; exports.testMapMultiSourcesMappingRefersSingleSourceOnly = { version: 3, file: 'min.js', names: ['bar', 'baz'], sources: ['one.js', 'withoutMappings.js'], sourceRoot: '', mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID' }; // This mapping is identical to above, but uses the indexed format instead. exports.indexedTestMap = { version: 3, file: 'min.js', sections: [ { offset: { line: 0, column: 0 }, map: { version: 3, sources: [ "one.js" ], sourcesContent: [ ' ONE.foo = function (bar) {\n' + ' return baz(bar);\n' + ' };', ], names: [ "bar", "baz" ], mappings: "CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID", file: "min.js", sourceRoot: "/the/root" } }, { offset: { line: 1, column: 0 }, map: { version: 3, sources: [ "two.js" ], sourcesContent: [ ' TWO.inc = function (n) {\n' + ' return n + 1;\n' + ' };' ], names: [ "n" ], mappings: "CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOA", file: "min.js", sourceRoot: "/the/root" } } ] }; exports.indexedTestMapDifferentSourceRoots = { version: 3, file: 'min.js', sections: [ { offset: { line: 0, column: 0 }, map: { version: 3, sources: [ "one.js" ], sourcesContent: [ ' ONE.foo = function (bar) {\n' + ' return baz(bar);\n' + ' };', ], names: [ "bar", "baz" ], mappings: "CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID", file: "min.js", sourceRoot: "/the/root" } }, { offset: { line: 1, column: 0 }, map: { version: 3, sources: [ "two.js" ], sourcesContent: [ ' TWO.inc = function (n) {\n' + ' return n + 1;\n' + ' };' ], names: [ "n" ], mappings: "CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOA", file: "min.js", sourceRoot: "/different/root" } } ] }; exports.testMapWithSourcesContent = { version: 3, file: 'min.js', names: ['bar', 'baz', 'n'], sources: ['one.js', 'two.js'], sourcesContent: [ ' ONE.foo = function (bar) {\n' + ' return baz(bar);\n' + ' };', ' TWO.inc = function (n) {\n' + ' return n + 1;\n' + ' };' ], sourceRoot: '/the/root', mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' }; exports.testMapRelativeSources = { version: 3, file: 'min.js', names: ['bar', 'baz', 'n'], sources: ['./one.js', './two.js'], sourcesContent: [ ' ONE.foo = function (bar) {\n' + ' return baz(bar);\n' + ' };', ' TWO.inc = function (n) {\n' + ' return n + 1;\n' + ' };' ], sourceRoot: '/the/root', mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' }; exports.emptyMap = { version: 3, file: 'min.js', names: [], sources: [], mappings: '' }; function assertMapping(generatedLine, generatedColumn, originalSource, originalLine, originalColumn, name, bias, map, assert, dontTestGenerated, dontTestOriginal) { if (!dontTestOriginal) { var origMapping = map.originalPositionFor({ line: generatedLine, column: generatedColumn, bias: bias }); assert.equal(origMapping.name, name, 'Incorrect name, expected ' + JSON.stringify(name) + ', got ' + JSON.stringify(origMapping.name)); assert.equal(origMapping.line, originalLine, 'Incorrect line, expected ' + JSON.stringify(originalLine) + ', got ' + JSON.stringify(origMapping.line)); assert.equal(origMapping.column, originalColumn, 'Incorrect column, expected ' + JSON.stringify(originalColumn) + ', got ' + JSON.stringify(origMapping.column)); var expectedSource; if (originalSource && map.sourceRoot && originalSource.indexOf(map.sourceRoot) === 0) { expectedSource = originalSource; } else if (originalSource) { expectedSource = map.sourceRoot ? util.join(map.sourceRoot, originalSource) : originalSource; } else { expectedSource = null; } assert.equal(origMapping.source, expectedSource, 'Incorrect source, expected ' + JSON.stringify(expectedSource) + ', got ' + JSON.stringify(origMapping.source)); } if (!dontTestGenerated) { var genMapping = map.generatedPositionFor({ source: originalSource, line: originalLine, column: originalColumn, bias: bias }); assert.equal(genMapping.line, generatedLine, 'Incorrect line, expected ' + JSON.stringify(generatedLine) + ', got ' + JSON.stringify(genMapping.line)); assert.equal(genMapping.column, generatedColumn, 'Incorrect column, expected ' + JSON.stringify(generatedColumn) + ', got ' + JSON.stringify(genMapping.column)); } } exports.assertMapping = assertMapping; function assertEqualMaps(assert, actualMap, expectedMap) { assert.equal(actualMap.version, expectedMap.version, "version mismatch"); assert.equal(actualMap.file, expectedMap.file, "file mismatch"); assert.equal(actualMap.names.length, expectedMap.names.length, "names length mismatch: " + actualMap.names.join(", ") + " != " + expectedMap.names.join(", ")); for (var i = 0; i < actualMap.names.length; i++) { assert.equal(actualMap.names[i], expectedMap.names[i], "names[" + i + "] mismatch: " + actualMap.names.join(", ") + " != " + expectedMap.names.join(", ")); } assert.equal(actualMap.sources.length, expectedMap.sources.length, "sources length mismatch: " + actualMap.sources.join(", ") + " != " + expectedMap.sources.join(", ")); for (var i = 0; i < actualMap.sources.length; i++) { assert.equal(actualMap.sources[i], expectedMap.sources[i], "sources[" + i + "] length mismatch: " + actualMap.sources.join(", ") + " != " + expectedMap.sources.join(", ")); } assert.equal(actualMap.sourceRoot, expectedMap.sourceRoot, "sourceRoot mismatch: " + actualMap.sourceRoot + " != " + expectedMap.sourceRoot); assert.equal(actualMap.mappings, expectedMap.mappings, "mappings mismatch:\nActual: " + actualMap.mappings + "\nExpected: " + expectedMap.mappings); if (actualMap.sourcesContent) { assert.equal(actualMap.sourcesContent.length, expectedMap.sourcesContent.length, "sourcesContent length mismatch"); for (var i = 0; i < actualMap.sourcesContent.length; i++) { assert.equal(actualMap.sourcesContent[i], expectedMap.sourcesContent[i], "sourcesContent[" + i + "] mismatch"); } } } exports.assertEqualMaps = assertEqualMaps; source-map-js-1.0.2/webpack.config.js000066400000000000000000000035561417156454300174400ustar00rootroot00000000000000var BannerPlugin = require("webpack/lib/BannerPlugin"); var fs = require("fs"); var path = require("path"); var webpack = require("webpack"); var distDir = path.join(__dirname, "dist"); module.exports = [ // Plain build. { entry: "./source-map.js", output: { path: distDir, filename: "source-map.js", library: "sourceMap", libraryTarget: "umd", }, }, // Debug build. { entry: "./source-map.js", output: { path: distDir, filename: "source-map.debug.js", library: "sourceMap", libraryTarget: "umd", }, devtool: "#inline-source-map" }, // Minified build. { entry: "./source-map.js", output: { path: distDir, filename: "source-map.min.js", library: "sourceMap", libraryTarget: "umd", }, plugins: [ new webpack.optimize.UglifyJsPlugin({ sourceMap: true }) ], devtool: "#source-map" } ]; /*** Build the tests for inclusion in mozilla-central. ************************/ var testFileRegex = /^test\-.*?\.js/; function isTestFile(file) { return testFileRegex.test(file); } var testsDir = path.join(__dirname, "test"); var testFiles = fs.readdirSync(testsDir).filter(isTestFile); // The xpcshell test harness expects a run_test function. Define this function // and stringify it as banner at the top of each test file. function run_test() { for (var k in SOURCE_MAP_TEST_MODULE) { if (/^test/.test(k)) { SOURCE_MAP_TEST_MODULE[k](assert); } } } testFiles.forEach(function (file) { module.exports.push({ entry: path.join(testsDir, file), output: { path: path.join(distDir, "test"), filename: file.replace(/\-/g, "_"), library: "SOURCE_MAP_TEST_MODULE" }, plugins: [ new BannerPlugin(run_test.toString() + "\n\n", { raw: true }) ], devtool: "#inline-source-map" }); }); source-map-js-1.0.2/yarn.lock000066400000000000000000002120601417156454300160350ustar00rootroot00000000000000# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" acorn@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= dependencies: kind-of "^3.0.2" longest "^1.0.1" repeat-string "^1.5.2" amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= anchor-markdown-header@^0.5.4: version "0.5.7" resolved "https://registry.yarnpkg.com/anchor-markdown-header/-/anchor-markdown-header-0.5.7.tgz#045063d76e6a1f9cd327a57a0126aa0fdec371a7" integrity sha1-BFBj125qH5zTJ6V6ASaqD97Dcac= dependencies: emoji-regex "~6.1.0" anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== dependencies: micromatch "^2.1.5" normalize-path "^2.0.0" arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= dependencies: arr-flatten "^1.0.1" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= assert@^1.1.1: version "1.5.0" resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== dependencies: object-assign "^4.1.1" util "0.10.3" assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= async-each@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== async@^0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= async@^1.3.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= async@~0.2.6: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== base64-js@^1.0.2: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" class-utils "^0.3.5" component-emitter "^1.2.1" define-property "^1.0.0" isobject "^3.0.1" mixin-deep "^1.2.0" pascalcase "^0.1.1" big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== binary-extensions@^1.0.0: version "1.13.1" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== dependencies: file-uri-to-path "1.0.0" braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= dependencies: expand-range "^1.8.1" preserve "^0.2.0" repeat-element "^1.1.2" braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" extend-shallow "^2.0.1" fill-range "^4.0.0" isobject "^3.0.1" repeat-element "^1.1.2" snapdragon "^0.8.1" snapdragon-node "^2.0.1" split-string "^3.0.2" to-regex "^3.0.1" braces@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" browserify-aes@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-0.4.0.tgz#067149b668df31c4b58533e02d01e806d8608e2c" integrity sha1-BnFJtmjfMcS1hTPgLQHoBthgjiw= dependencies: inherits "^2.0.1" browserify-zlib@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" integrity sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0= dependencies: pako "~0.2.0" buffer@^4.9.0: version "4.9.2" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" isarray "^1.0.0" builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" get-value "^2.0.6" has-value "^1.0.0" isobject "^3.0.1" set-value "^2.0.0" to-object-path "^0.3.0" union-value "^1.0.0" unset-value "^1.0.0" camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= center-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= dependencies: align-text "^0.1.3" lazy-cache "^1.0.3" chokidar@^1.0.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= dependencies: anymatch "^1.3.0" async-each "^1.0.0" glob-parent "^2.0.0" inherits "^2.0.1" is-binary-path "^1.0.0" is-glob "^2.0.0" path-is-absolute "^1.0.0" readdirp "^2.0.0" optionalDependencies: fsevents "^1.0.0" class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" define-property "^0.2.5" isobject "^3.0.0" static-extend "^0.1.1" clean-publish@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/clean-publish/-/clean-publish-3.1.0.tgz#9eab4eb0f582b5d2a9d247e3eb923fe6479755e7" integrity sha512-xSFrk73vEzPNifexwJX/4pgRkm2Vi1Fz/5a8CBrBpHvc6JKr6KrK9GlZ6sv4SVOgqSZRW902j/CT13Q5iXjsTA== dependencies: cross-spawn "^7.0.3" fast-glob "^3.2.7" fs-extra "^10.0.0" lilconfig "^2.0.3" cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= dependencies: center-align "^0.1.1" right-align "^0.1.1" wordwrap "0.0.2" clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== console-browserify@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" crypto-browserify@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.3.0.tgz#b9fc75bb4a0ed61dcf1cd5dae96eb30c9c3e506c" integrity sha1-ufx1u0oO1h3PHNXa6W6zDJw+UGw= dependencies: browserify-aes "0.4.0" pbkdf2-compat "2.0.1" ripemd160 "0.2.0" sha.js "2.2.6" debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" decamelize@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" isobject "^3.0.1" doctoc@^0.15.0: version "0.15.0" resolved "https://registry.yarnpkg.com/doctoc/-/doctoc-0.15.0.tgz#0a7a48e437a0efa98728a430ada124dd95039c0b" integrity sha1-CnpI5Deg76mHKKQwraEk3ZUDnAs= dependencies: anchor-markdown-header "^0.5.4" htmlparser2 "~3.7.1" minimist "~1.1.0" underscore ">=1.3.3" update-section "^0.3.0" dom-serializer@0: version "0.2.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== dependencies: domelementtype "^2.0.1" entities "^2.0.0" domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== domelementtype@1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== domhandler@2.2: version "2.2.1" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.2.1.tgz#59df9dcd227e808b365ae73e1f6684ac3d946fc2" integrity sha1-Wd+dzSJ+gIs2Wuc+H2aErD2Ub8I= dependencies: domelementtype "1" domutils@1.5: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= dependencies: dom-serializer "0" domelementtype "1" emoji-regex@~6.1.0: version "6.1.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.3.tgz#ec79a3969b02d2ecf2b72254279bf99bc7a83932" integrity sha1-7HmjlpsC0uzytyJUJ5v5m8eoOTI= emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= enhanced-resolve@~0.9.0: version "0.9.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" integrity sha1-TW5omzcl+GCQknzMhs2fFjW4ni4= dependencies: graceful-fs "^4.1.2" memory-fs "^0.2.0" tapable "^0.1.8" entities@1.0: version "1.0.0" resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY= entities@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== errno@^0.1.3: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" events@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= dependencies: is-posix-bracket "^0.1.0" expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" extend-shallow "^2.0.1" posix-character-classes "^0.1.0" regex-not "^1.0.0" snapdragon "^0.8.1" to-regex "^3.0.1" expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= dependencies: fill-range "^2.1.0" extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= dependencies: is-extglob "^1.0.0" extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" define-property "^1.0.0" expand-brackets "^2.1.4" extend-shallow "^2.0.1" fragment-cache "^0.2.1" regex-not "^1.0.0" snapdragon "^0.8.1" to-regex "^3.0.1" fast-glob@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" glob-parent "^5.1.2" merge2 "^1.3.0" micromatch "^4.0.4" fastq@^1.6.0: version "1.13.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: reusify "^1.0.4" file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= fill-range@^2.1.0: version "2.2.4" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== dependencies: is-number "^2.1.0" isobject "^2.0.0" randomatic "^3.0.0" repeat-element "^1.1.2" repeat-string "^1.5.2" fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" repeat-string "^1.6.1" to-regex-range "^2.1.0" fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= dependencies: for-in "^1.0.1" fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" fs-extra@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" universalify "^2.0.0" fsevents@^1.0.0: version "1.2.13" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== dependencies: bindings "^1.5.0" nan "^2.12.1" get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= dependencies: is-glob "^2.0.0" glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.8" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" isobject "^2.0.0" has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" isobject "^3.0.0" has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" htmlparser2@~3.7.1: version "3.7.3" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.7.3.tgz#6a64c77637c08c6f30ec2a8157a53333be7cb05e" integrity sha1-amTHdjfAjG8w7CqBV6UzM758sF4= dependencies: domelementtype "1" domhandler "2.2" domutils "1.5" entities "1.0" readable-stream "1.1" https-browserify@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" integrity sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI= ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= inherits@^2.0.1, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== interpret@^0.6.4: version "0.6.6" resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.6.6.tgz#fecd7a18e7ce5ca6abfb953e1f86213a49f1625b" integrity sha1-/s16GOfOXKar+5U+H4YhOknxYls= is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" kind-of "^5.0.0" is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" kind-of "^6.0.2" is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= dependencies: is-primitive "^2.0.0" is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= dependencies: is-extglob "^1.0.0" is-glob@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= dependencies: kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" is-number@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" optionalDependencies: graceful-fs "^4.1.6" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" kind-of@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= lilconfig@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.3.tgz#68f3005e921dafbd2a2afb48379986aa6d2579fd" integrity sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg== loader-utils@^0.2.11: version "0.2.17" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= dependencies: big.js "^3.1.3" emojis-list "^2.0.0" json5 "^0.5.0" object-assign "^4.0.1" longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" math-random@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== memory-fs@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" integrity sha1-8rslNovBIeORwlIN6Slpyu4KApA= memory-fs@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" integrity sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA= dependencies: errno "^0.1.3" readable-stream "^2.0.1" merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^2.1.5: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" braces "^1.8.2" expand-brackets "^0.1.4" extglob "^0.3.1" filename-regex "^2.0.0" is-extglob "^1.0.0" is-glob "^2.0.1" kind-of "^3.0.2" normalize-path "^2.0.1" object.omit "^2.0.0" parse-glob "^3.0.4" regex-cache "^0.4.2" micromatch@^3.1.10: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" braces "^2.3.1" define-property "^2.0.2" extend-shallow "^3.0.2" extglob "^2.0.4" fragment-cache "^0.2.1" kind-of "^6.0.2" nanomatch "^1.2.9" object.pick "^1.3.0" regex-not "^1.0.0" snapdragon "^0.8.1" to-regex "^3.0.2" micromatch@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== dependencies: braces "^3.0.1" picomatch "^2.2.3" minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= minimist@~1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag= mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" mkdirp@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= nan@^2.12.1: version "2.15.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" define-property "^2.0.2" extend-shallow "^3.0.2" fragment-cache "^0.2.1" is-windows "^1.0.2" kind-of "^6.0.2" object.pick "^1.3.0" regex-not "^1.0.0" snapdragon "^0.8.1" to-regex "^3.0.1" node-libs-browser@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-0.7.0.tgz#3e272c0819e308935e26674408d7af0e1491b83b" integrity sha1-PicsCBnjCJNeJmdECNevDhSRuDs= dependencies: assert "^1.1.1" browserify-zlib "^0.1.4" buffer "^4.9.0" console-browserify "^1.1.0" constants-browserify "^1.0.0" crypto-browserify "3.3.0" domain-browser "^1.1.1" events "^1.0.0" https-browserify "0.0.1" os-browserify "^0.2.0" path-browserify "0.0.0" process "^0.11.0" punycode "^1.2.4" querystring-es3 "^0.2.0" readable-stream "^2.0.5" stream-browserify "^2.0.1" stream-http "^2.3.1" string_decoder "^0.10.25" timers-browserify "^2.0.2" tty-browserify "0.0.0" url "^0.11.0" util "^0.10.3" vm-browserify "0.0.4" normalize-path@^2.0.0, normalize-path@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" kind-of "^3.0.3" object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= dependencies: for-own "^0.1.4" is-extendable "^0.1.1" object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" optimist@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" os-browserify@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" integrity sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8= pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" is-extglob "^1.0.0" is-glob "^2.0.0" pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== pbkdf2-compat@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz#b6e0c8fa99494d94e0511575802a59a5c142f288" integrity sha1-tuDI+plJTZTgURV1gCpZpcFC8og= picomatch@^2.2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process@^0.11.0: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= punycode@^1.2.4: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== randomatic@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== dependencies: is-number "^4.0.0" kind-of "^6.0.0" math-random "^1.0.1" readable-stream@1.1: version "1.1.13" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" isarray "0.0.1" string_decoder "~0.10.x" readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" isarray "~1.0.0" process-nextick-args "~2.0.0" safe-buffer "~5.1.1" string_decoder "~1.1.1" util-deprecate "~1.0.1" readdirp@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: graceful-fs "^4.1.11" micromatch "^3.1.10" readable-stream "^2.0.2" regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== dependencies: is-equal-shallow "^0.1.3" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= dependencies: align-text "^0.1.1" ripemd160@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-0.2.0.tgz#2bf198bde167cacfa51c0a928e84b68bbe171fce" integrity sha1-K/GYveFnys+lHAqSjoS2i74XH84= run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: ret "~0.1.10" set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" is-plain-object "^2.0.3" split-string "^3.0.1" setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= sha.js@2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.2.6.tgz#17ddeddc5f722fb66501658895461977867315ba" integrity sha1-F93t3F9yL7ZlAWWIlUYZd4ZzFbo= shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" isobject "^3.0.0" snapdragon-util "^3.0.1" snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" debug "^2.2.0" define-property "^0.2.5" extend-shallow "^2.0.1" map-cache "^0.2.2" source-map "^0.5.6" source-map-resolve "^0.5.0" use "^3.1.0" source-list-map@~0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" integrity sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY= source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: atob "^2.1.2" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" urix "^0.1.0" source-map-url@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== source-map@^0.5.6, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= source-map@~0.4.1: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" integrity sha1-66T12pwNyZneaAMti092FzZSA2s= dependencies: amdefine ">=0.0.4" split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== dependencies: inherits "~2.0.1" readable-stream "^2.0.2" stream-http@^2.3.1: version "2.8.3" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" readable-stream "^2.3.6" to-arraybuffer "^1.0.0" xtend "^4.0.0" string_decoder@^0.10.25, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" supports-color@^3.1.0: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= dependencies: has-flag "^1.0.0" tapable@^0.1.8, tapable@~0.1.8: version "0.1.10" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" integrity sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q= timers-browserify@^2.0.2: version "2.0.12" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== dependencies: setimmediate "^1.0.4" to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" extend-shallow "^3.0.2" regex-not "^1.0.2" safe-regex "^1.1.0" tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= uglify-js@~2.7.3: version "2.7.5" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" integrity sha1-RhLAx7qu4rp8SH3kkErhIgefLKg= dependencies: async "~0.2.6" source-map "~0.5.1" uglify-to-browserify "~1.0.0" yargs "~3.10.0" uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= underscore@>=1.3.3: version "1.12.0" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.0.tgz#4814940551fc80587cef7840d1ebb0f16453be97" integrity sha512-21rQzss/XPMjolTiIezSu3JAjgagXKROtNrYFEOWK109qY1Uv2tVjPTZ1ci2HgvQDA16gHYSthQIJfB+XId/rQ== union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" set-value "^2.0.1" universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" update-section@^0.3.0: version "0.3.3" resolved "https://registry.yarnpkg.com/update-section/-/update-section-0.3.3.tgz#458f17820d37820dc60e20b86d94391b00123158" integrity sha1-RY8Xgg03gg3GDiC4bZQ5GwASMVg= urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= dependencies: punycode "1.3.2" querystring "0.2.0" use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= dependencies: inherits "2.0.1" util@^0.10.3: version "0.10.4" resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== dependencies: inherits "2.0.3" vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= dependencies: indexof "0.0.1" watchpack@^0.2.1: version "0.2.9" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-0.2.9.tgz#62eaa4ab5e5ba35fdfc018275626e3c0f5e3fb0b" integrity sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws= dependencies: async "^0.9.0" chokidar "^1.0.0" graceful-fs "^4.1.2" webpack-core@~0.6.9: version "0.6.9" resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" integrity sha1-/FcViMhVjad76e+23r3Fo7FyvcI= dependencies: source-list-map "~0.1.7" source-map "~0.4.1" webpack@^1.12.0: version "1.15.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-1.15.0.tgz#4ff31f53db03339e55164a9d468ee0324968fe98" integrity sha1-T/MfU9sDM55VFkqdRo7gMklo/pg= dependencies: acorn "^3.0.0" async "^1.3.0" clone "^1.0.2" enhanced-resolve "~0.9.0" interpret "^0.6.4" loader-utils "^0.2.11" memory-fs "~0.3.0" mkdirp "~0.5.0" node-libs-browser "^0.7.0" optimist "~0.6.0" supports-color "^3.1.0" tapable "~0.1.8" uglify-js "~2.7.3" watchpack "^0.2.1" webpack-core "~0.6.9" which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= xtend@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= dependencies: camelcase "^1.0.2" cliui "^2.1.0" decamelize "^1.0.0" window-size "0.1.0"