commit 4990667410285ee3e9d79532bc702a8cc6e5dfdc Author: jkoschke Date: Fri Aug 26 12:49:14 2022 +0200 initial commit diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..013a459 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,4 @@ +FROM node:16 + +RUN apt-get update && apt-get upgrade +RUN apt-get install wireless-tools -y \ No newline at end of file diff --git a/src/lib/utils.js b/src/lib/utils.js new file mode 100644 index 0000000..2f348ea --- /dev/null +++ b/src/lib/utils.js @@ -0,0 +1,174 @@ +const child_process = require('child_process'); +const execSync = child_process.execSync; + +const _consoleColorCodes = { + Reset: "\x1b[0m", + Bright: "\x1b[1m", + Dim: "\x1b[2m", + Underscore: "\x1b[4m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + Hidden: "\x1b[8m", + + FgBlack: "\x1b[30m", + FgRed: "\x1b[31m", + FgGreen: "\x1b[32m", + FgYellow: "\x1b[33m", + FgBlue: "\x1b[34m", + FgMagenta: "\x1b[35m", + FgCyan: "\x1b[36m", + FgWhite: "\x1b[37m", + + BgBlack: "\x1b[40m", + BgRed: "\x1b[41m", + BgGreen: "\x1b[42m", + BgYellow: "\x1b[43m", + BgBlue: "\x1b[44m", + BgMagenta: "\x1b[45m", + BgCyan: "\x1b[46m", + BgWhite: "\x1b[47m", +} + +function Utils() { + this.consoleColorCodes = _consoleColorCodes; +} + +Utils.prototype.isCurrentUserRoot = function () { + return process.getuid() == 0; // UID 0 is always root +} + +Utils.prototype.printWelcomeMessage = function () { + console.log("###################################") + console.log("##### RaspiWiFi Intial Setup #####") + console.log("###################################") +} + +Utils.prototype.printSetupCanceledMessage = function () { + console.log("") + console.log("") + console.log("===================================================") + console.log("---------------------------------------------------") + console.log("") + console.log("RaspiWiFi installation cancelled. Nothing changed...") + console.log("") + console.log("---------------------------------------------------") + console.log("===================================================") + console.log("") + console.log("") +} + +Utils.prototype.printFinishedMessage = function () { + console.log("") + console.log("") + console.log("#####################################") + console.log("##### RaspiWiFi Setup Complete #####") + console.log("#####################################") + console.log("") + console.log("") +} + +Utils.prototype.checkForYN = function (input) { + if (input.toLowerCase() !== 'y' && input.toLowerCase() !== 'n') { + this.printColor(this.consoleColorCodes.FgRed, 'Please enter y or n!'); + return false; + } + return true; +} + +Utils.prototype.printColor = function (color, ...args) { + console.log(color, ...args, this.consoleColorCodes.Reset); +} + +Utils.prototype.clearConsole = () => { + //process.stdout.write('\033c'); + process.stdout.write('\x1bc'); +} + +Utils.prototype.installSystemDependencies = function () { + this.clearConsole(); + execSync('apt update'); + this.clearConsole(); + execSync('apt install python3 python3-rpi.gpio python3-pip dnsmasq hostapd -y') +} + +Utils.prototype.copyConfigs = function (isWpaEabled) { + /* Creating application directories */ + this.printColor(null, 'Creating application directories'); + execSync('mkdir /usr/lib/raspiwifi'); + execSync('mkdir /etc/raspiwifi'); + execSync('mkdir /etc/cron.raspiwifi'); + + /* Copy application files */ + this.printColor(null, 'Copy application files'); + execSync('cp -a libs/* /usr/lib/raspiwifi/'); + + /* Backing up current files */ + this.printColor(null, 'Backing up current files'); + execSync('mv /etc/wpa_supplicant/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant.conf.original'); + execSync('mv /etc/dnsmasq.conf /etc/dnsmasq.conf.original'); + execSync('mv /etc/dhcpcd.conf /etc/dhcpcd.conf.original'); + + /* Copy default files for basic device setup*/ + this.printColor(null, 'Copy default files for basic device setup'); + execSync('cp /usr/lib/raspiwifi/reset_device/static_files/dnsmasq.conf /etc/'); + execSync('cp /usr/lib/raspiwifi/reset_device/static_files/dhcpcd.conf /etc/'); + if (isWpaEabled) + execSync('cp /usr/lib/raspiwifi/reset_device/static_files/hostapd.conf.wpa /etc/hostapd/hostapd.conf'); + else + execSync('cp /usr/lib/raspiwifi/reset_device/static_files/hostapd.conf.nowpa /etc/hostapd/hostapd.conf'); + + execSync('cp /usr/lib/raspiwifi/reset_device/static_files/aphost_bootstrapper /etc/cron.raspiwifi') + execSync('chmod +x /etc/cron.raspiwifi/aphost_bootstrapper'); + + execSync('mv /usr/lib/raspiwifi/reset_device/static_files/raspiwifi.conf /etc/raspiwifi'); + + /* TODO: Setting up CRON for running monitoring jobs */ + this.printColor(null, 'Setting up CRON for running monitoring jobs'); + execSync('echo "# RaspiWiFi Startup" >> /etc/crontab'); + execSync('echo "@reboot root run-parts /etc/cron.raspiwifi/" >> /etc/crontab'); + + /* Finishing things up */ + this.printColor(null, 'Finishing things up'); + execSync('touch /etc/raspiwifi/host_mode'); +} + +Utils.prototype.updateMainConfigFile = function ({ ssid, autoConfig, autoConfigDelay, sslEnabled, serverPort, wpaEnabled, wpaSecret }) { + console.log(this); + const outputString = this.serializeMainConfigFile({ ssid, autoConfig, autoConfigDelay, sslEnabled, serverPort, wpaEnabled, wpaSecret }); + const fileName = '/etc/raspiwifi/raspiwifi.conf' + execSync('cat <' + fileName + '\n' + outputString) + +} + +Utils.prototype.reboot = function () { + execSync('reboot'); +} + +Utils.prototype.serializeMainConfigFile = function ({ ssid, autoConfig, autoConfigDelay, sslEnabled, serverPort, wpaEnabled, wpaSecret }) { + const output = { + 'SSID': ssid, + 'AutoReconfig': autoConfig, + 'AutoReconfigDelay': autoConfigDelay, + 'SSLEnabled': sslEnabled, + 'ServerPort': serverPort, + 'WPAEnabled': wpaEnabled, + 'PSK': wpaSecret ?? '', + } + return JSON.stringify(output, null, 2); +} + +Utils.prototype.deserializeMainConfigFile = (input) => { + const obj = JSON.parse(input); + return { + ssid: obj['SSID'], + autoConfig: obj['AutoReconfig'], + autoConfigDelay: obj['AutoReconfigDelay'], + sslEnabled: obj['SSLEnabled'], + serverPort: obj['ServerPort'], + wpaEnabled: obj['WPAEnabled'], + wpaSecret: obj['PSK'] ?? '', + } +} + + +module.exports = Utils; \ No newline at end of file diff --git a/src/node_modules/.yarn-integrity b/src/node_modules/.yarn-integrity new file mode 100644 index 0000000..7aff1b0 --- /dev/null +++ b/src/node_modules/.yarn-integrity @@ -0,0 +1,19 @@ +{ + "systemParams": "darwin-x64-93", + "modulesFolders": [ + "node_modules" + ], + "flags": [], + "linkedModules": [], + "topLevelPatterns": [ + "crontab@^1.4.2", + "readline-sync@^1.4.10" + ], + "lockfileEntries": { + "crontab@^1.4.2": "https://registry.yarnpkg.com/crontab/-/crontab-1.4.2.tgz#847452d91574c6029486e70d0186cb27be742892", + "readline-sync@^1.4.10": "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.10.tgz#41df7fbb4b6312d673011594145705bf56d8873b", + "underscore@^1.6.0": "https://registry.yarnpkg.com/underscore/-/underscore-1.13.4.tgz#7886b46bbdf07f768e0052f1828e1dcab40c0dee" + }, + "files": [], + "artifacts": {} +} \ No newline at end of file diff --git a/src/node_modules/crontab/.travis.yml b/src/node_modules/crontab/.travis.yml new file mode 100644 index 0000000..ff74a05 --- /dev/null +++ b/src/node_modules/crontab/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - '0.10' \ No newline at end of file diff --git a/src/node_modules/crontab/README.md b/src/node_modules/crontab/README.md new file mode 100644 index 0000000..1c11c28 --- /dev/null +++ b/src/node_modules/crontab/README.md @@ -0,0 +1,181 @@ +# node-crontab +[![Build Status](https://secure.travis-ci.org/dachev/node-crontab.png)](http://travis-ci.org/dachev/node-crontab) +[![Dependencies](https://david-dm.org/dachev/node-crontab.png)](https://david-dm.org/dachev/node-crontab) +[![NPM version](https://badge.fury.io/js/crontab.svg)](http://badge.fury.io/js/crontab) + +A module for creating, reading, updating, and deleting system cron jobs + +## Installation + +```bash +$ npm install crontab +``` + +## Examples +### Working with jobs +```js +require('crontab').load(function(err, crontab) { + // create with string expression + var job = crontab.create('ls -la', '0 7 * * 1,2,3,4,5'); + + // create with Date + var job = crontab.create('ls -lh', new Date(1400373907766)); + + // create with comment + var job = crontab.create('ls -lt', null, 'comment 2'); + + // create special: @reboot, @hourly, @daily, @weekly, @monthly, @yearly, @annually, @midnight + var job = crontab.create('ls -la', '@reboot'); + + // check valid + var job = crontab.create(); + if (job == null) { + console.log('failed to create job'); + } + + // remove object + var job = crontab.create('ls -lr', '0 7 * * 1,2,3,4,5', 'comment 3'); + crontab.remove(job); + + // remove conditions + crontab.remove({command:'ls -lh', comment:/comment 2/}); + + // manipulate: every business hour + var job = crontab.create('ls -l'); + job.minute().at(0); + job.hour().between(8, 17); + job.dow().between('mon', 'fri'); + + // manipulate: every other hour on weekday nights + var job = crontab.create('ls -l'); + job.hour().between(19, 0).every(2); + job.hour().between(0, 6).every(2); + job.dow().between('mon', 'fri'); + + // manipulate: summer + var job = crontab.create('ls -l'); + job.month().between('jun', 'sep'); + + // manipulate: Christmas + var job = crontab.create('ls -l'); + job.minute().at(30); + job.hour().at(9); + job.dom().on(24); + job.month().in('dec'); + + // show all jobs + var jobs = crontab.jobs(); + + // show jobs with conditions + var jobs = crontab.jobs({command:'ls -l', comment:/comment 1/}); + + // reset jobs to their original state + crontab.reset(); + + // save + crontab.save(function(err, crontab) { + + }); + + console.log(crontab); +}); +``` + +### Working with environment variables +```js +require('crontab').load(function(err, crontab) { + // get all env variables + var vars = crontab.vars(); + // find env variables by name + var vars = crontab.vars({name: 'FOO'}); + // find env variables by value + var vars = crontab.vars({val: 'bar'}); + // find env variables by name and value + var vars = crontab.vars({name: 'FOO', val: 'bar'}); + // find env variables by name + var vars = crontab.vars('FOO'); + + // create with a pair of arguments + crontab.vars().add('FOO', 'foo'); + // create multiple with an object argument + crontab.vars().add({'FOO':'foo', 'BAR':'1'}); + + // remove all env variables + crontab.vars().rm(); + // remove selected env variables + crontab.vars({name: 'FOO'}).rm(); + + // save + crontab.save(function(err, crontab) { + + }); +}); +``` + +### Naive reboot +```js +require('crontab').load(function(err, crontab) { + if (err) { + return console.error(err); + } + + var command = 'ls -l'; + + crontab.remove({command:command}); + crontab.create(command, '@reboot'); + + crontab.save(function(err, crontab) { + + }); +}); +``` + +### More robust reboot and forever +```js +require('crontab').load(function(err, crontab) { + if (err) { + return console.error(err); + } + + var uuid = '64d967a0-120b-11e0-ac64-0800200c9a66'; + var nodePath = process.execPath.split('/').slice(0, -1).join('/'); + var exportCommand = 'export PATH=' + nodePath + ':$PATH'; + var foreverCommand = require('path').join(__dirname, 'node_modules', 'forever', 'bin', 'forever'); + var sysCommand = exportCommand + ' && ' + foreverCommand + ' start ' + __filename; + + crontab.remove({comment:uuid}); + crontab.create(sysCommand, '@reboot', uuid); + + crontab.save(function(err, crontab) { + console.log(err) + }); +}); +``` + +### Specific user +```js +// when executing for another user the library uses sudo, unless the +// current process runs as root +require('crontab').load('alice', function(err, crontab) { + if (err) { + return console.error(err); + } + + crontab.save(function(err, crontab) { + console.log(err) + }); +}); +``` + +## Author +Blagovest Dachev + +## Copyright +* Blagovest Dachev (2010-2014) +* Martin Owens (2009-2012) + +## Credits +This is a JavaScript port of a Python package by Martin Owens + +## License +GPL3 diff --git a/src/node_modules/crontab/lib/CronCommand.js b/src/node_modules/crontab/lib/CronCommand.js new file mode 100644 index 0000000..9ed5d93 --- /dev/null +++ b/src/node_modules/crontab/lib/CronCommand.js @@ -0,0 +1,61 @@ +/** + * @class CronCommand + * A JavaScript representation of the command part of a cron job. + * + * Examples: + * var command = new CronCommand('ls -l /'); + * + * @param {String} __line__ + */ +function CronCommand(line) { + var command = line; + + + /** + * Returns true if the pattern that was passed matches this command. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * // true + * console.log(jobs[i].command().match('ls -l /')); + * } + * }); + * + * @param {String|RegEx} __pattern__ + * @return {Boolean} + */ + this.match = function(pattern) { + if (_.isString(pattern) && !!~command.indexOf(pattern)) { + return true; + } + if (_.isRegExp(pattern)) { + return pattern.test(command); + } + + return false; + } + /** + * Renders the object to a string as it would be written to the system. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].command().toString()); + * } + * }); + * + * @return {String} + */ + this.toString = function() { + return command; + } +} + +module.exports = CronCommand; diff --git a/src/node_modules/crontab/lib/CronComment.js b/src/node_modules/crontab/lib/CronComment.js new file mode 100644 index 0000000..9999a13 --- /dev/null +++ b/src/node_modules/crontab/lib/CronComment.js @@ -0,0 +1,61 @@ +/** + * @class CronComment + * A JavaScript representation of the inline comment part of a cron job. + * + * Examples: + * var comment = new CronComment('run this on the weekend'); + * + * @param {String} __line__ + */ +function CronComment(line) { + var comment = line; + + + /** + * Returns true if the pattern that was passed matches this comment. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({comment:'run this on the weekend'}); + * for (var i = 0; i < jobs.length; i++) { + * // true + * console.log(jobs[i].comment().match('run this on the weekend')); + * } + * }); + * + * @param {String|RegEx} __pattern__ + * @return {Boolean} + */ + this.match = function(pattern) { + if (_.isString(pattern) && !!~command.indexOf(pattern)) { + return true; + } + if (_.isRegExp(pattern)) { + return pattern.test(comment); + } + + return false; + } + /** + * Renders the object to a string as it would be written to the system. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({comment:'run this on the weekend'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].comment().toString()); + * } + * }); + * + * @return {String} + */ + this.toString = function() { + return comment; + } +} + +module.exports = CronComment; diff --git a/src/node_modules/crontab/lib/CronJob.js b/src/node_modules/crontab/lib/CronJob.js new file mode 100644 index 0000000..eb60857 --- /dev/null +++ b/src/node_modules/crontab/lib/CronJob.js @@ -0,0 +1,385 @@ +/** + * Constants + */ +const ITEMREX = /^\s*([^@#\s]+)\s+([^@#\s]+)\s+([^@#\s]+)\s+([^@#\s]+)\s+([^@#\s]+)\s+([^#\n]*)(\s+#\s*([^\n]*)|$)/; +const SPECREX = /@(\w+)\s([^#\n]*)(\s+#\s*([^\n]*)|$)/; + +const SPECIALS = { + 'reboot' : '@reboot', + 'hourly' : '0 * * * *', + 'daily' : '0 0 * * *', + 'weekly' : '0 0 * * 0', + 'monthly' : '0 0 1 * *', + 'yearly' : '0 0 1 1 *', + 'annually' : '0 0 1 1 *', + 'midnight' : '0 0 * * *' +}; + +const MONTH_ENUM = ['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec']; +const WEEK_ENUM = ['sun','mon','tue','wed','thu','fri','sat','sun']; +const SINFO = [ + { 'name' : 'Minute', 'max' : 59, 'min' : 0 }, + { 'name' : 'Hours', 'max' : 23, 'min' : 0 }, + { 'name' : 'Day of Month', 'max' : 31, 'min' : 1 }, + { 'name' : 'Month', 'max' : 12, 'min' : 1, 'enumm' : MONTH_ENUM }, + { 'name' : 'Day of Week', 'max' : 7, 'min' : 0, 'enumm' : WEEK_ENUM }, +]; + +/** + * Imports + */ +var TimeSlot = require('./TimeSlot'); +var CronCommand = require('./CronCommand'); +var CronComment = require('./CronComment'); + +/** + * @class CronJob + * A JavaScript representation of a cron job. Each job has exactly 5 time slots as per cron sytax: + * _minute_, _hour_, _day-of-the-month_, _month_, _day-of-the-week_. + * + * Examples: + * var job1 = new CronJob('* * * * * ls -l / #comment'); + * var job2 = new CronJob(null, 'ls -l /', 'comment'); + * + * @param {String|null} __line__ + * @param {String} __[command]__ + * @param {String} __[comment]__ + */ +function CronJob(line, c, m) { + var self = this; + var command = null; + var comment = null; + var valid = false; + var slots = []; + var special = false; + + + /** + * Returns true if this cron job is valid. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].isValid()); + * } + * }); + * + * @return {Boolean} + */ + this.isValid = function() { + return valid; + } + /** + * Renders the object to a string as it would be written to the system. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].render()); + * } + * }); + * + * @return {String} + */ + this.render = function() { + var time = ''; + + if (special) { + time = special; + } + else { + var tokens = []; + + for (var i = 0; i < 5; i++) { + tokens.push(slots[i].toString()); + } + + time = tokens.join(' '); + } + + var keys = getKeys.call(SPECIALS); + var vals = getVals.call(SPECIALS); + var timeIdx = vals.indexOf(time); + + if (timeIdx >=0 ) { + time = '@' + keys[timeIdx]; + } + + var result = time + ' ' + command.toString(); + if (comment.toString() != '') { + result += ' #' + comment.toString(); + } + + return result; + } + /** + * Clears all time slots. Calling this method amounts to setting the time to '* * * * *'. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].clear()); + * } + * }); + */ + this.clear = function() { + special = false; + + for (var i = 0; i < slots.length; i++) { + slots[i].clear(); + } + } + /** + * Returns the minute time slot. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].minute().render()); + * } + * }); + * + * @return {TimeSlot} + */ + this.minute = function() { + return slots[0]; + } + /** + * Returns the hour time slot. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].hour().render()); + * } + * }); + * + * @return {TimeSlot} + */ + this.hour = function() { + return slots[1]; + } + /** + * Returns the day-of-the-month time slot. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].dom().render()); + * } + * }); + * + * @return {TimeSlot} + */ + this.dom = function() { + return slots[2]; + } + /** + * Returns the month time slot. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].month().render()); + * } + * }); + * + * @return {TimeSlot} + */ + this.month = function() { + return slots[3]; + } + /** + * Returns the day-of-the-week time slot. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].dow().render()); + * } + * }); + * + * @return {TimeSlot} + */ + this.dow = function() { + return slots[4]; + } + /** + * Command getter/setter. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].command('new command')); + * } + * }); + * + * @param {String} __[command]__ + * @return {String} + */ + this.command = function(c) { + if (c) { + command = new CronCommand(c.toString()); + } + + return command.toString(); + } + /** + * Comment getter/setter. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].comment('new comment')); + * } + * }); + * + * @param {String} __[comment]__ + * @return {String} + */ + this.comment = function(c) { + if (c) { + comment = new CronComment(c.toString()); + } + + return comment.toString(); + } + /** + * Renders the object to a string as it would be written to the system. See __render__. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].toString()); + * } + * }); + * + * @return {String} + */ + this.toString = function() { + return this.render(); + } + + + /** + * Populates the time slots with TimeSlot objects. Call this method ONLY from __init__! + * + * @param {Array[String]} __[tokens]__ string tokens to parse + * + * @api private + */ + function setSlots(tokens) { + slots = []; + + for (var i = 0; i < 5; i++) { + var info = SINFO[i]; + var value = (tokens && tokens[i] || null); + var name = info.name; + var min = info.min; + var max = info.max; + var enumm = info.enumm; + var slot = new TimeSlot(name, min, max, enumm, value); + + slots.push(slot); + } + } + /** + * Initializes a new CronJob object. + * + * @api private + */ + function init() { + setSlots(); + + if (line) { + var result = line.match(ITEMREX); + + if (result && result.length > 0) { + command = new CronCommand(result[6]); + comment = new CronComment(result[8] || ''); + valid = true; + + setSlots(result.slice(1,6)); + } + else if (line.indexOf('@') < line.indexOf('#') || line.indexOf('#') == -1) { + var result = line.match(SPECREX); + + if (result && result.length > 0 && SPECIALS[result[1]]) { + command = new CronCommand(result[2]); + comment = new CronComment(result[4] || ''); + + var value = SPECIALS[result[1]]; + if (value.indexOf('@') >= 0) { + special = value; + } + else { + setSlots(value.split(' ')); + } + valid = true; + } + } + } + else if (c) { + valid = true; + command = new CronCommand(c && c.toString() || ''); + comment = new CronComment(m && m.toString() || ''); + } + else { + throw new Error('Expected either a canonical crontab line or a command string'); + } + } + + init(); +} + +/* @api private */ +function getKeys() { + return Object.keys(this); +} + +function getVals() { + var keys = getKeys.call(this); + var vals = []; + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + vals.push(this[key]); + } + + return vals; +} + +module.exports = CronJob; diff --git a/src/node_modules/crontab/lib/CronVar.js b/src/node_modules/crontab/lib/CronVar.js new file mode 100644 index 0000000..eaceaff --- /dev/null +++ b/src/node_modules/crontab/lib/CronVar.js @@ -0,0 +1,144 @@ +/** + * Constants + */ +const ITEMREX = /^(\S+)=(.+)$/; + +/** + * @class CronVar + * A JavaScript representation of a cron environment variable. + * + * Examples: + * var env = new CronVar('MAIL=user@domain.org'); + * + * @param {String} __line__ + */ +function CronVar(line) { + var self = this; + var name = null; + var val = null; + var valid = false; + + + /** + * Returns true if this env variable is valid. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var vars = tab.vars({name:'MAIL'}); + * for (var i = 0; i < vars.length; i++) { + * console.log(vars[i].isValid()); + * } + * }); + * + * @return {Boolean} + */ + this.isValid = function() { + return valid; + } + /** + * Renders the object to a string as it would be written to the system. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var vars = tab.vars({name:'MAIL'}); + * for (var i = 0; i < vars.length; i++) { + * console.log(vars[i].render()); + * } + * }); + * + * @return {String} + */ + this.render = function() { + return name + '=' + val; + } + /** + * Comment getter/setter. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var vars = tab.vars({name:'MAIL'}); + * for (var i = 0; i < vars.length; i++) { + * console.log(vars[i].name('PATH')); + * } + * }); + * + * @param {String} __[name]__ + * @return {String} + */ + this.name = function(c) { + if (c) { + name = ''+c; + } + + return name; + } + /** + * Comment getter/setter. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var vars = tab.vars({name:'MAIL'}); + * for (var i = 0; i < vars.length; i++) { + * console.log(vars[i].val('user@domain.org')); + * } + * }); + * + * @param {String} __[val]__ + * @return {String} + */ + this.val = function(c) { + if (c) { + val = ''+c; + } + + return val; + } + /** + * Renders the object to a string as it would be written to the system. See __render__. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var vars = tab.vars({name:'MAIL'}); + * for (var i = 0; i < vars.length; i++) { + * console.log(vars[i].toString()); + * } + * }); + * + * @return {String} + */ + this.toString = function() { + return this.render(); + } + + /** + * Initializes a new CronVar object. + * + * @api private + */ + function init() { + var tokens = (line||'').match(ITEMREX); + + if (tokens && tokens.length > 0) { + name = tokens[1]; + val = tokens[2]; + valid = true; + } + else { + throw new Error('Expected an env variable declaration line'); + } + } + + init(); +} + +module.exports = CronVar; diff --git a/src/node_modules/crontab/lib/TimeRange.js b/src/node_modules/crontab/lib/TimeRange.js new file mode 100644 index 0000000..fb791f5 --- /dev/null +++ b/src/node_modules/crontab/lib/TimeRange.js @@ -0,0 +1,156 @@ +/** + * @class TimeRange + * A JavaScript representation of a time range. Each range has a _from_, _to_, and _step_ values. + * + * Examples: + * var enumm = ['jan','feb','mar','apr', + * 'may','jun','jul','aug', + * 'sep','oct','nov','dec']; + * + * var slot = new TimeSlot('Month', 1, 12, enumm); + * var range1 = new TimeRange(slot, '* / 2'); // every other month + * var range2 = new TimeRange(slot, 'jun - sep'); // every summer + * + * @param {TimeSlot} __slot__ The owner time slot object + * @param {String} __range__ The range string e.g. _* / 2_, _jun - sep_ + */ +function TimeRange(s, range) { + var self = this; + var slot = s; + var from = null; + var to = null; + var step = 1; + + + /** + * Renders the object to a string as it would be written to the system. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].hour().between(9, 17).render()); + * } + * }); + * + * @return {String} + */ + this.render = function() { + var value = '*'; + + if (from > slot.getMin() || to < slot.getMax()) { + value = from + '-' + to; + } + if (step != 1) { + value += '/' + step; + } + + return value; + } + /** + * Set the step value for this range. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * // every other business hour + * jobs[i].hour().between(9, 17).every(2); + * } + * }); + */ + this.every = function(value) { + step = parseInt(value); + } + /** + * Renders the object to a string as it would be written to the system. See __render__. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].hour().between(9, 17).toString()); + * } + * }); + * + * @return {String} + */ + this.toString = function() { + return this.render(); + } + + + /** + * Converts a string value representing a range limit to an integer. + * + * @param {String} __value__ e.g. _5_,_mon_,_jan_ + * @return {Number} + * + * @api private + */ + function cleanValue(value) { + var sValue = String(value); + var lValue = sValue.toLowerCase(); + var enummIdx = (slot.getEnum() || []).indexOf(lValue); + + if (enummIdx >= 0) { + value = enummIdx; + } + + var iValue = parseInt(value); + if (iValue >= slot.getMin() && iValue <= slot.getMax()) { + return iValue + } + + return null; + } + + /** + * Initializes a new TimeRange object. + * + * @api private + */ + function init() { + if (!range) { + range = '*'; + } + + if (range.indexOf('/') > 0) { + var tokens = range.split('/'); + + range = tokens[0]; + step = tokens[1]; + } + + if (range.indexOf('-') > 0) { + var tokens = range.split('-'); + + from = cleanValue(tokens[0]); + to = cleanValue(tokens[1]); + + if (from == null) { + throw new Error('Invalid range value ' + tokens[0]); + } + else if (to == null) { + throw new Error('Invalid range value ' + tokens[1]); + } + } + else if (range == '*') { + from = slot.getMin(); + to = slot.getMax(); + } + else { + throw new Error('Unknown time range value ' + range); + } + } + + init(); +} + +module.exports = TimeRange; diff --git a/src/node_modules/crontab/lib/TimeSlot.js b/src/node_modules/crontab/lib/TimeSlot.js new file mode 100644 index 0000000..de00f96 --- /dev/null +++ b/src/node_modules/crontab/lib/TimeSlot.js @@ -0,0 +1,282 @@ +/** + * Imports + */ +var TimeRange = require('./TimeRange'); + +/** + * @class TimeSlot + * A JavaScript representation of a time slot (e.g. minute, hour, month). Each slot has zero or + * more time ranges coresponding to the comma separated list in the cron sytax + * (e.g. _* / 4_, _10_, 5-15/2). + * + * Examples: + * var enumm = ['jan','feb','mar','apr', + * 'may','jun','jul','aug', + * 'sep','oct','nov','dec']; + * + * var slot1 = new TimeSlot('Month', 1, 12, enumm); + * var slot2 = new TimeSlot('Minute', 0, 59, null, ''); + * + * @param {String} __name__ (e.g 'Minute', 'Month') + * @param {Number} __min__ minimum value + * @param {Number} __max__ maximum value + * @param {Object|null} __enumm__ an object enumerating all possible values + * @param {String|null} __value__ a value to parse (e.g '19-0/2,0-3') + */ +function TimeSlot(name, min, max, enumm, value) { + var self = this; + var name = name; + var min = min; + var max = max; + var enumm = enumm; + var parts = []; + + + /** + * Returns the minimum value for this time slot. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].month().getMin()); + * } + * }); + * + * @return {Number} + */ + this.getMin = function() { + return min; + } + /** + * Returns the maximum value for this time slot. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].month().getMax()); + * } + * }); + * + * @return {Number} + */ + this.getMax = function() { + return max; + } + /** + * Returns the allowed value enumeration for this time slot. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].month().getEnum()); + * } + * }); + * + * @return {Object} + */ + this.getEnum = function() { + return enumm; + } + /** + * Renders the object to a string as it would be written to the system. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].month().render()); + * } + * }); + * + * @return {Object} + */ + this.render = function() { + return parts.map(function(part) { + return part.toString(); + }).join(',') || '*'; + } + /** + * Set this time slot to repeat every n units e.g. _* / n_ + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * // every other month + * jobs[i].month().every(2); + * } + * }); + * + * @param {Number} __number__ + * @return {TimeRange} + */ + this.every = function(n) { + try { + var range = new TimeRange(self, '*/' + parseInt(n)); + parts.push(range); + + return range; + } + catch (e) {} + + return null; + } + /** + * Set this time slot to repeat exactly at the specified values e.g. _0,12_ + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * // at midnight and noon + * jobs[i].hour().on(0, 12); + * jobs[i].minute().on(0); + * } + * }); + * + * @param {Number} __value+__ one or more values + * @return {TimeRange} + */ + this.on = function() { + for (var i = 0; i < arguments.length; i++) { + parts.push(arguments[i]); + } + } + /** + * Set this time slot to repeat exactly at the specified values e.g. _0,12_ + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * // at midnight and noon + * jobs[i].hour().on(0, 12); + * jobs[i].minute().on(0); + * } + * }); + * + * @param {Number} __value+__ one or more values + * @return {TimeRange} + */ + this.at = this.on; + this.in = this.on; + /** + * Set this time slot to repeat between from and to e.g. _from - to_ + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * // business hours + * jobs[i].hour().between(9, 17); + * } + * }); + * + * @param {Number} __from__ + * @param {Number} __to__ + * @return {TimeRange} + */ + this.between = function(from, to) { + try { + var range = new TimeRange(self, from + '-' + to); + parts.push(range); + + return range; + } + catch (e) {} + + return null; + } + /** + * Clears this time slot. Calling this method amounts to setting the slot to '*'. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].month().clear()); + * } + * }); + */ + this.clear = function() { + parts = []; + } + /** + * Renders the object to a string as it would be written to the system. See __render__. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].month().toString()); + * } + * }); + * + * @return {String} + */ + this.toString = function() { + return this.render(); + } + + + /** + * Initializes a new TimeSlot object. + * + * @api private + */ + function init() { + if (value) { + var tokens = value.split(','); + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + + if (token.indexOf('/') > 0 || token.indexOf('-') > 0 || token == '*') { + var range = new TimeRange(self, token); + parts.push(range); + } + else { + var lPart = token.toLowerCase(); + var enummIdx = (enumm || []).indexOf(lPart); + + if (enummIdx >= 0) { + token = enummIdx; + } + + var iPart = parseInt(token); + if (iPart !== iPart) { + throw new Error('Unknown cron time part for ' + name + ': ' + token); + } + + parts.push(iPart); + } + } + } + } + + init(); +} + +module.exports = TimeSlot; diff --git a/src/node_modules/crontab/lib/index.d.ts b/src/node_modules/crontab/lib/index.d.ts new file mode 100644 index 0000000..e93b1bc --- /dev/null +++ b/src/node_modules/crontab/lib/index.d.ts @@ -0,0 +1,96 @@ +// Type definitions for crontab +// Project: crontab +// Definitions by: Werner Robitza + +declare namespace crontab { + type CrontabCallback = (error: Error | null, crontab: CronTab) => void; + + function load(user: string, callback: CrontabCallback): void; + function load(callback: CrontabCallback): void; + + class CronTab { + jobs(options?: { + command?: string | RegExp; + comment?: string | RegExp; + }): CronJob[]; + find(options?: { + command?: string | RegExp; + comment?: string | RegExp; + }): CronJob[]; + vars( + options: string | { name?: string | RegExp; val?: string | RegExp } + ): CronVar[]; + save(callback?: CrontabCallback): void; + render(): string; + create( + command: string, + when?: string | Date | null, + comment?: string | RegExp + ): CronJob | null; + parse(line: string): CronJob; + remove(jobs: string[]): void; + remove(job: CronJob): void; + remove(options: { + command?: string | RegExp; + comment?: string | RegExp; + }): void; + reset(): void; + load(callback?: CrontabCallback): void; + } + + class CronVar { + constructor(line: string); + isValid(): boolean; + render(): string; + name(): string; + val(): string; + toString(): string; + } + + class CronJob { + constructor( + line: string | null, + command?: string | RegExp, + comment?: string | RegExp + ); + isValid(): boolean; + render(): string; + clear(): void; + minute(): TimeSlot; + hour(): TimeSlot; + dom(): TimeSlot; + month(): TimeSlot; + dow(): TimeSlot; + command(c?: string): string; + comment(c?: string): string; + toString(): string; + } + + class TimeSlot { + constructor( + name: string, + min: number, + max: number, + enumm?: object | null, + value?: string | null + ); + getMin(): number; + getMax(): number; + getEnum(): object; + render(): string; + every(n: number): TimeRange; + on(...value: number[]): TimeRange; + between(from: number, to: number): TimeRange | null; + clear(): void; + toString(): string; + } + + class TimeRange { + constructor(s: TimeSlot, range: string); + render(): string; + every(value: number): void; + toString(): string; + } +} + +export = crontab; diff --git a/src/node_modules/crontab/lib/index.js b/src/node_modules/crontab/lib/index.js new file mode 100644 index 0000000..3261e37 --- /dev/null +++ b/src/node_modules/crontab/lib/index.js @@ -0,0 +1,574 @@ +/** + * Constants + */ +const COMMAND = 'crontab'; + +/** + * @ignore + */ +var Spawn = require('child_process').spawn; +var _ = require('underscore'); +var CronJob = require('./CronJob'); +var CronVar = require('./CronVar'); + +/** + * @class CronTab + * A JavaScript representation of a user crontab. Each tab has zero or more cron jobs corresponding + * to the individual lines in the cron syntax. + * + * Examples: + * new CronTab('bob', function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * console.log("bob's tab: " + tab.render()); + * }); + * + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * console.log("current user's tab: " + tab.render()); + * }); + * + * @param {String} __username__ + * @param {Function} __callback__ + */ +function CronTab(u, cb) { + var self = this; + var user = u || ''; + var root = (process.getuid() == 0); + var backup = {lines:[], jobs:[], vars:[]}; + var lines = []; + var jobs = []; + var vars = []; + + load(cb); + + + /** + * Provides access to the jobs collection. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /', comment:'this should run every night'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].render()); + * } + * }); + * + * @param {Object} __[options]__ + * @return {Array[CronJob]} + */ + this.jobs = function(options) { + if (!options) { + return jobs.slice(); + } + if (!options.command && !options.comment) { + return jobs.slice(); + } + + var queries = _.keys(options); + if (_.without(queries, 'comment', 'command').length > 0) { + return []; + } + + var results = []; + for (var i = 0; i < jobs.length; i++) { + var job = jobs[i]; + var match = true; + + for (var j = 0; j < queries.length; j++) { + var query = queries[j]; + + if (!job[query]().match(options[query])) { + match = false; + break; + } + } + + if (match) { + results.push(job); + } + } + + return results; + } + this.find = this.jobs; + /** + * Provides access to the vars collection. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var vars = tab.vars({key:'MAIL', val:'user@domain.org'}); + * for (var i = 0; i < vars.length; i++) { + * console.log(vars[i].render()); + * } + * }); + * + * @param {Object|String} __[options]__ + * @return {Array[CronVar]} + */ + this.vars = function(options) { + if (_.isString(options)) { + options = {name: options} + } + + var results = []; + var queries = _.keys(options); + + if (queries.length < 1) { + results = vars.slice(); + } + else if (_.without(queries, 'name', 'val').length == 0) { + for (var i = 0; i < vars.length; i++) { + var env = vars[i]; + var match = true; + + for (var j = 0; j < queries.length; j++) { + var query = queries[j]; + + if (!env[query]().match(options[query])) { + match = false; + break; + } + } + + if (match) { + results.push(env); + } + } + } + + results.add = function(name, val) { + var pairs = {}; + if (_.isString(name) && _.isString(val)) { + pairs[name] = val; + } + else if (_.isObject(name)) { + pairs = _.extend({}, name); + } + + var insertIndex = _.findIndex(lines, function(val) { + return val instanceof CronJob; + }); + if (insertIndex < 0) { + insertIndex = 0; + } + + for (name in pairs) { + var val = pairs[name]; + var env = new CronVar(name + '=' + val); + + lines.splice(insertIndex++, 0, env); + vars.push(env); + } + } + + results.rm = function() { + lines = _.difference(lines, results); + vars = _.difference(vars, results); + results.splice(0, results.length); + } + + results.val = function(a) { + return results.length && results[0].val(); + } + + return results; + } + /** + * Writes the crontab to the system. Saves all information. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * tab.remove(jobs); + * + * tab.save(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * console.log('saved'); + * }); + * }); + * + * @param {Function} __callback__ + */ + this.save = function(cb) { + var stdout = ''; + var stderr = ''; + var args = makeChildArgs('save'); + var command = makeChildCommand(); + var child = Spawn(command, args); + + child.stdout.setEncoding('utf8'); + child.stderr.setEncoding('utf8'); + + child.stdout.on('data', function(chunk) { + stdout += chunk; + }); + child.stderr.on('data', function(chunk) { + stderr += chunk; + }); + child.on('error', function (err) { + }); + child.on('close', function (code) { + if (code == 0) { + cb && cb(null, self); + } + else { + cb && cb(new Error(stderr), self); + } + }); + + child.stdin.write(this.render()); + child.stdin.end(); + } + /** + * Renders the object to a string as it would be written to the system. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * console.log(tab.render()); + * }); + * + * @return {String} + */ + this.render = function() { + var tokens = []; + + for (var i = 0; i < lines.length; i++) { + var job = lines[i]; + + if (job.isValid && !job.isValid()) { + tokens.push('# ' + job.toString()); + continue; + } + + tokens.push(job.toString()); + } + + return tokens.join('\n').trim() + '\n'; + } + /** + * Creates a new job with the specified command, comment and date. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var future = Date.parse('2010/7/11'); + * + * tab.create('ls -l /'); + * tab.create('ls -l /', 'just a silly example'); + * tab.create('ls -l /', 'just a silly example', future); + * }); + * + * @param {String} __command__ + * @param {String|Date} __[when]__ + * @param {String} __[comment]__ + * @return {CronJob|null} + */ + this.create = function(command, when, comment) { + if (when && !_.isString(when) && !_.isDate(when)) { + return null; + } + + command = (command || '').trim(); + comment = (comment || '').trim(); + + var job = null; + if (_.isString(when)) { + job = makeJob(when + ' ' + command + ' #' + comment); + } + else { + job = makeJob(null, command, comment); + } + + if (job && _.isDate(when)) { + job.minute().on(when.getMinutes()); + job.hour().on(when.getHours()); + job.dom().on(when.getDate()); + job.month().on(when.getMonth()+1); + } + + if (job) { + jobs.push(job); + lines.push(job); + } + + return job; + } + /** + * Parses a raw crontab line and returns a CronJob object + * + * @param {String} __line__ + * @return {CronJob|null} + */ + this.parse = function(line) { + return makeJob(line); + } + /** + * Removes the specified jobs from the crontab. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * tab.remove(jobs); + * }); + * + * @param {String} __Array[CronJob]__ + */ + this.remove = function(jobs) { + if (jobs instanceof CronJob) { + jobs = [jobs]; + } + else if (_.isArray(jobs)) { + // do nothing, we do this because _.isObject([]) == true + } + else if (_.isObject(jobs)) { + // jobs is actually search options + jobs = this.jobs(jobs); + } + else { + jobs = []; + } + + for (var i = 0; i < jobs.length; i++) { + remove(jobs[i]); + } + + truncateLines(); + } + /** + * Restores this crontab to its original state. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * tab.remove(jobs); + * tab.reset(); + * }); + */ + this.reset = function() { + lines = backup.lines.slice(); + jobs = backup.jobs.slice(); + vars = backup.vars.slice(); + } + + + /** + * Loads the system crontab into this object. + * + * @param {function} __callback__ + * + * @api private + */ + function load(cb) { + var stdout = ''; + var stderr = ''; + var args = makeChildArgs('load'); + var command = makeChildCommand(); + var child = Spawn(command, args); + + lines = []; + jobs = []; + vars = []; + + child.stdout.setEncoding('utf8'); + child.stderr.setEncoding('utf8'); + + child.stdout.on('data', function(chunk) { + stdout += chunk; + }); + child.stderr.on('data', function(chunk) { + stderr += chunk; + }); + child.on('error', function (err) { + }); + child.on('close', function (code) { + if (code != 0 && stderr.indexOf('no crontab for ') < 0) { + cb && cb(new Error(stderr), null); + return; + } + + var tokens = stdout.split('\n'); + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + var job = makeJob(token); + var env = makeVar(token); + + if (job != null && job.isValid()) { + jobs.push(job); + lines.push(job); + } + else if (env != null && env.isValid()) { + vars.push(env); + lines.push(env); + } + else { + lines.push(token); + } + } + + truncateLines(); + + backup.lines = lines.slice(); + backup.jobs = jobs.slice(); + backup.vars = vars.slice(); + + cb && cb(null, self); + }); + } + /** + * Removes the specified job from the crontab. + * + * @param {CronJob} __job__ + * + * @api private + */ + function remove(job) { + var oldJobs = jobs; + var oldLines = lines; + + jobs = []; + lines = []; + + for (var i = 0; i < oldJobs.length; i++) { + var oldJob = oldJobs[i]; + + if (oldJob != job) { + jobs.push(oldJob); + } + } + for (var i = 0; i < oldLines.length; i++) { + var oldLine = oldLines[i]; + + if (oldLine != job) { + lines.push(oldLine); + } + } + } + /** + * Creates an array of CL arguments for the system "crontab" command. Intended to be passed to + * child_process.spawn. + * + * @param {String} __action__ 'load' | 'save' + * + * @api private + */ + function makeChildArgs(action) { + var args = []; + if (user) { + args = args.concat('-u', user); + } + + if (action == 'load') { + args.push('-l'); + } + if (action == 'save' && process.platform !== 'sunos') { + args.push('-'); + } + + return args; + } + /** + * Creates a system command string to run crontab. Intended to be passed to + * child_process.spawn. If this is going to run for another user and the + * current user is not root, we prefix the command with sudo. + * + * @api private + */ + function makeChildCommand() { + var command = COMMAND; + if (user.length > 0 && root == false) { + command = 'sudo ' + command; + } + + return command; + } + /** + * Creates a new job. This method exists to catch instantiation exceptions. + * @see CronJob + * + * @param {String|null} __line__ + * @param {String} __[command]__ + * @param {String} __[comment]__ + * + * @api private + */ + function makeJob(line, command, comment) { + try { + var job = new CronJob(line, command, comment); + if (!job || !job.isValid()) { + throw new Error('invalid job'); + } + + return job; + } catch(e) {} + + return null; + } + /** + * Creates a new job. This method exists to catch instantiation exceptions. + * @see CronJob + * + * @param {String} __line__ + * + * @api private + */ + function makeVar(line) { + try { + var env = new CronVar(line); + if (!env || !env.isValid()) { + throw new Error('invalid env variable'); + } + + return env; + } catch(e) {} + + return null; + } + /** + * Compacts the line collection by removes empty lines from the end. + * + * @api private + */ + function truncateLines() { + var undefined; + var line = lines.pop(); + + while (line != undefined && line.toString().trim() == '') { + line = lines.pop(); + } + + if (line != undefined) { + lines.push(line); + } + } +} + + +// public API +module.exports = { + load:function() { + if (_.isString(arguments[0]) && _.isFunction(arguments[1])) { + new CronTab(arguments[0], arguments[1]); + } + else if (_.isFunction(arguments[0])) { + new CronTab('', arguments[0]); + } + } +}; + + diff --git a/src/node_modules/crontab/package.json b/src/node_modules/crontab/package.json new file mode 100644 index 0000000..4f44371 --- /dev/null +++ b/src/node_modules/crontab/package.json @@ -0,0 +1,43 @@ +{ + "name": "crontab", + "description": "A module for reading, creating, deleting, manipulating, and saving system cronjobs with node.js", + "keywords": [ + "cron", + "crontab", + "schedule", + "system", + "run", + "process" + ], + "version": "1.4.2", + "main": "./lib/index", + "dependencies": { + "underscore": "^1.6.0" + }, + "devDependencies": { + "vows": "0.7.0" + }, + "scripts": { + "test": "test/runner.js" + }, + "engines": { + "node": ">= 0.10.0" + }, + "author": { + "name": "Blagovest Dachev", + "email": "blago@dachev.com", + "url": "http://www.dachev.com" + }, + "homepage": "https://github.com/dachev/node-crontab", + "repository": { + "type": "git", + "url": "git://github.com/dachev/node-crontab.git" + }, + "licenses": [ + { + "type": "GPL3", + "url": "http://opensource.org/licenses/MIT" + } + ], + "types": "lib/index.d.ts" +} diff --git a/src/node_modules/crontab/test/runner.js b/src/node_modules/crontab/test/runner.js new file mode 100755 index 0000000..a1b5aaa --- /dev/null +++ b/src/node_modules/crontab/test/runner.js @@ -0,0 +1,822 @@ +#!/usr/bin/env node + +var events = require('events'); +require('child_process').spawn = mockChild; + +// Mock child_process +function mockChild(command, args) { + var undefined; + var action = (args.indexOf('-l') >= 0) ? 'load' : 'save'; + var uRegEx = /-u\s([^\s]+)/; + var tokens = args.join(' ').match(uRegEx); + var user = tokens && tokens[1] || ''; + + function load(child) { + process.nextTick(function() { + // run for another user = user option will be first + if (user.length > 0 && args[0] != '-u') { + child.stderr.emit('data', 'crontab: if running for another user the -u option must come first'); + child.emit('close', 1); + return; + } + // run for another user + not root = sudo + if (user.length > 0 && mockChild.user != 'root' && !!~command.indexOf('sudo') == false) { + child.stderr.emit('data', 'crontab: must be privileged to use -u'); + child.emit('close', 1); + return; + } + // run for another user + root = no sudo + if (user.length > 0 && mockChild.user == 'root' && !!~command.indexOf('sudo') == true) { + child.stderr.emit('data', 'crontab: must not use sudo if already root and using -u'); + child.emit('close', 1); + return; + } + + var tabs = mockChild.tabs[user || mockChild.user]; + if (tabs == undefined && user != '') { + child.stderr.emit('data', 'crontab: user ' + user + ' unknown'); + child.emit('close', 1); + return; + } + if (tabs == null) { + child.stderr.emit('data', 'crontab: no crontab for ...'); + child.emit('close', 1); + return; + } + + child.stdout.emit('data', tabs.join('\n')); + child.emit('close', 0); + }); + } + + function save(child, newTabs) { + process.nextTick(function() { + // run for another user = user option will be first + if (user.length > 0 && args[0] != '-u') { + child.stderr.emit('data', 'crontab: if running for another user the -u option must come first'); + child.emit('close', 1); + return; + } + // run for another user + not root = sudo + if (user.length > 0 && mockChild.user != 'root' && !!~command.indexOf('sudo') == false) { + child.stderr.emit('data', 'crontab: must be privileged to use -u'); + child.emit('close', 1); + return; + } + // run for another user + root = no sudo + if (user.length > 0 && mockChild.user == 'root' && !!~command.indexOf('sudo') == true) { + child.stderr.emit('data', 'crontab: must not use sudo if already root and using -u'); + child.emit('close', 1); + return; + } + // save + sunos = no "-"" argument + if (!!~args.indexOf('-') && process.platform == 'sunos') { + child.stderr.emit('data', 'crontab: sunos\' flavor of crontab does not recognize -'); + child.emit('close', 1); + return; + } + + mockChild.tabs[user || mockChild.user] = newTabs.split('\n'); + child.emit('close', 0); + }); + } + + var child = new events.EventEmitter; + child.stdout = new events.EventEmitter; + child.stderr = new events.EventEmitter; + child.stdin = { + buffer : '', + write : function(tabs) { this.buffer = tabs; }, + end : function(tabs) { save(child, this.buffer); } + } + + child.stdout.setEncoding =function(){}; + child.stderr.setEncoding =function(){}; + + if (action == 'load') { + load(child); + } + + return child; +} +mockChild.user = 'blago'; +mockChild.tabs = { + empty : [], + reset : [], + alice : ['0 8-17 * * 1-5 /usr/bin/env echo "check email"', + '* 19-0,0-3 * * 1-5 /usr/bin/env echo "hack node.js"', + '30 11 * * 6-0 /usr/bin/env echo "wake up"', + '* * * 5-8 * /usr/bin/env echo "go to Bulgaria"', + '30 9 24 12 * /usr/bin/env echo "get presents"'], + bob : ['0 8-17 * * 1-5 /usr/bin/env echo "check email"', + '* 19-0,0-3 * * 1-5 /usr/bin/env echo "hack node.js"', + '30 11 * * 6-0 /usr/bin/env echo "wake up"'], + blago : null, + root : [], + remove : ['0 7 * * 1,2,3,4,5 ls -la # every weekday @7', + '0 8 * * 1,2,3,4,5 ls -lh # every weekday @8', + '0 9 * * 1,2,3,4,5 ls -lt # every weekday @9'], + special : ['@reboot /usr/bin/env echo "starting service (reboot)" #reboot', + '@hourly /usr/bin/env echo "starting service (hourly)"', + '@daily /usr/bin/env echo "starting service (daily)"', + '@weekly /usr/bin/env echo "starting service (weekly)"', + '@monthly /usr/bin/env echo "starting service (monthly)"', + '@yearly /usr/bin/env echo "starting service (yearly)"', + '@annually /usr/bin/env echo "starting service (annually)"', + '@midnight /usr/bin/env echo "starting service (midnight)"'], + comments: ['0 8-17 * * 1-5 /usr/bin/env echo "check email" #every business hour'], + commands: ['0 8-17 * * 1-5 /usr/bin/env echo "check email" #every business hour'], + env: ['FOO=bar', + 'BAZ=1', + '* * * * * /usr/bin/true'] +}; + + +// Test helpers +function loadTabs(user) { + var promise = new(events.EventEmitter); + + CronTab.load(user, function(err, tab) { + if (err) { promise.emit('error', err); } + else { promise.emit('success', tab); } + }); + + return promise; +} +function saveTabs(tab) { + var promise = new(events.EventEmitter); + + tab.save(function(err, tab) { + if (err) { promise.emit('error', err); } + else { promise.emit('success', tab); } + }); + + return promise; +} +function makeTabArrayFromTopicStack() { + var tab1 = arguments[0]; + var tab2 = arguments[2]; + + return [tab1, tab2]; +} + + +// Test batches +var nonRootLoadsAnotherUserCrons = { + 'non-root user loads another user\'s crons': { + topic: function() { + mockChild.user = 'blago'; + return loadTabs('bob'); + }, + 'should succeed loading because we use sudo':function(err, tab) { + nonRootLoadsAnotherUserCrons.tab = tab; + + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 3); + } + } +}; +var rootLoadsAnotherUserCrons = { + 'root user loads another (existing) user\'s crons': { + topic: function() { + mockChild.user = 'root'; + var originalGetuid = process.getuid; + process.getuid = function() { + return 0; + } + + var tabs = loadTabs('bob'); + process.getuid = originalGetuid; + + return tabs; + }, + 'should succeed loading':function(err, tab) { + rootLoadsAnotherUserCrons.tab = tab; + + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 3); + } + } +}; +var rootLoadsAnotherNonExistingUserCrons = { + 'root user loads another (non-existing) user\'s crons': { + topic: function() { + mockChild.user = 'root'; + var originalGetuid = process.getuid; + process.getuid = function() { + return 0; + } + + var tabs = loadTabs('tom'); + process.getuid = originalGetuid; + + return tabs; + }, + 'should fail loading':function(err, tab) { + Assert.isObject(err); + Assert.isString(err.message); + Assert.matches(err.message, /unknown/); + } + } +}; +var userLoadsHisOwnEmptyCrons = { + 'user loads his own (empty) crons': { + topic: function() { + mockChild.user = 'blago'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + userLoadsHisOwnEmptyCrons.tab = tab; + + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 0); + } + } +}; +var userLoadsHerOwnNonEmptyCrons = { + 'user loads her own (non-empty) crons': { + topic: function() { + mockChild.user = 'alice'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + userLoadsHerOwnNonEmptyCrons.tab = tab; + + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 5); + } + } +}; +var userSavesHerOwnNonEmptyCrons = { + 'user saves her own (non-empty) crons': { + topic: function() { + return saveTabs(userLoadsHerOwnNonEmptyCrons.tab); + }, + 'should succeed saving':function(err, tab) { + Assert.isNull(err); + Assert.isObject(tab); + } + } +}; +var userLoadsHerOwnNonEmptyCronsAgain = { + 'user loads her own (non-empty) crons again': { + topic: function() { + mockChild.user = 'alice'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + userLoadsHerOwnNonEmptyCronsAgain.tab = tab; + + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 5); + }, + 'are the same':function(err, tab) { + Assert.equal(tab.render().trim(), mockChild.tabs.alice.join('\n').trim()); + } + } +}; +var canLoadEnvironment = { + 'can load environment variables' : { + topic: function() { + mockChild.user = 'env'; + return loadTabs(''); + }, + 'should load environment variables':function(err, tab) { + Assert.isArray(tab.vars()); + Assert.equal(tab.vars().length, 2); + Assert.equal(tab.vars('FOO').length, 1); + Assert.equal(tab.vars('BAZ').length, 1); + Assert.equal(tab.vars('FOO').val(), 'bar'); + Assert.equal(tab.vars('BAZ').val(), '1'); + } + } +}; +var canQueryEnvironment = { + 'can query environment variables' : { + topic: function() { + mockChild.user = 'env'; + return loadTabs(''); + }, + 'should succeed with a key argument':function(err, tab) { + Assert.isArray(tab.vars('FOO')); + Assert.equal(tab.vars('FOO').length, 1); + Assert.equal(tab.vars('FOO').val(), 'bar'); + }, + 'should succeed with an object argument':function(err, tab) { + Assert.isArray(tab.vars({name:'FOO'})); + Assert.equal(tab.vars({name:'FOO'}).length, 1); + Assert.equal(tab.vars({name:'FOO'}).val(), 'bar'); + Assert.equal(tab.vars({name:'FOO', val: 'bar'}).length, 1); + }, + 'should succeed with no arguments':function(err, tab) { + Assert.isArray(tab.vars()); + Assert.equal(tab.vars().length, 2); + } + } +} +var canCreateEnvironment = { + 'can create environment variables' : { + topic: function() { + mockChild.user = 'empty'; + + return loadTabs(''); + }, + 'should succeed with a pair of arguments':function(err, tab) { + Assert.equal(tab.vars().length, 0); + tab.vars().add('FOO', 'foo'); + tab.vars().add('BAR', '1'); + Assert.equal(tab.vars().length, 2); + + Assert.equal(tab.vars({name:'FOO'}).length, 1); + Assert.equal(tab.vars({name:'BAR'}).length, 1); + + Assert.equal(tab.vars({name:'FOO'}).val(), 'foo'); + Assert.equal(tab.vars({name:'BAR'}).val(), '1'); + + tab.vars().rm(); + }, + 'should succeed with an object argument':function(err, tab) { + Assert.equal(tab.vars().length, 0); + tab.vars().add({'FOO':'foo', 'BAR':'1'}); + Assert.equal(tab.vars().length, 2); + + Assert.equal(tab.vars({name:'FOO'}).length, 1); + Assert.equal(tab.vars({name:'BAR'}).length, 1); + + Assert.equal(tab.vars({name:'FOO'}).val(), 'foo'); + Assert.equal(tab.vars({name:'BAR'}).val(), '1'); + + tab.vars().rm(); + } + } +} +var canRemoveEnvironment = { + 'can remove environment variables' : { + topic: function() { + mockChild.user = 'empty'; + + return loadTabs(''); + }, + 'should succeed':function(err, tab) { + Assert.equal(tab.vars().length, 0); + tab.vars().add({'FOO':'foo', 'BAR':'1'}); + Assert.equal(tab.vars().length, 2); + + tab.vars({name: 'FOO'}).rm(); + Assert.equal(tab.vars().length, 1); + + tab.vars().rm(); + Assert.equal(tab.vars().length, 0); + } + } +} +var canCreateJob = { + 'can create job': { + topic: function() { + mockChild.user = 'empty'; + + return loadTabs(''); + }, + 'should return null with invalid cron syntax':function(err, tab) { + Assert.equal(tab.create(''), null); + Assert.equal(tab.create('ls -l', ''), null); + Assert.equal(tab.create(), null); + Assert.equal(tab.create(null), null); + Assert.equal(tab.create(null, null, null), null); + }, + 'should succeed with string expression and comment':function(err, tab) { + var job = tab.create('ls -l', '0 7 * * 1,2,3,4,5', 'test'); + + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '7'); + Assert.equal(job.dom().toString(), '*'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '1,2,3,4,5'); + Assert.equal(job.command(), 'ls -l'); + Assert.equal(job.comment(), 'test'); + }, + 'should succeed with date and comment':function(err, tab) { + var date = new Date(1400373907766); + var job = tab.create('ls -l', date, 'test'); + + Assert.isTrue(job.isValid()); + Assert.equal(job.minute(), date.getMinutes()); + Assert.equal(job.hour(), date.getHours()); + Assert.equal(job.dom(), date.getDate()); + Assert.equal(job.month(), date.getMonth()+1); + Assert.equal(job.dow().toString(), '*'); + Assert.equal(job.command(), 'ls -l'); + Assert.equal(job.comment(), 'test'); + }, + 'should succeed with date and no comment':function(err, tab) { + var date = new Date(1400373907766); + var job = tab.create('ls -l', date); + + Assert.isTrue(job.isValid()); + Assert.equal(job.minute(), date.getMinutes()); + Assert.equal(job.hour(), date.getHours()); + Assert.equal(job.dom(), date.getDate()); + Assert.equal(job.month(), date.getMonth()+1); + Assert.equal(job.dow().toString(), '*'); + Assert.equal(job.command(), 'ls -l'); + Assert.equal(job.comment(), ''); + }, + 'should succeed with no date and comment':function(err, tab) { + var job = tab.create('ls -l', null, 'test'); + + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '*'); + Assert.equal(job.hour().toString(), '*'); + Assert.equal(job.dom().toString(), '*'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '*'); + Assert.equal(job.command(), 'ls -l'); + Assert.equal(job.comment(), 'test'); + }, + 'should succeed with no date and no comment':function(err, tab) { + var job = tab.create('ls -l', null, null); + + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '*'); + Assert.equal(job.hour().toString(), '*'); + Assert.equal(job.dom().toString(), '*'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '*'); + Assert.equal(job.command(), 'ls -l'); + Assert.equal(job.comment(), ''); + } + } +}; +var canRemoveJob = { + 'can remove job': { + topic: function() { + mockChild.user = 'remove'; + + return loadTabs(''); + }, + 'should succeed with job object':function(err, tab) { + var count = tab.jobs().length; + var job = tab.jobs({command:'ls -la'})[0]; + + tab.remove(job); + + Assert.equal(tab.jobs().length, count-1); + }, + 'should succeed with command query':function(err, tab) { + var count = tab.jobs().length; + tab.remove({command:'ls -lh'}); + + Assert.equal(tab.jobs().length, count-1); + }, + 'should succeed with comment query':function(err, tab) { + var count = tab.jobs().length; + tab.remove({comment:'every weekday @9'}); + + Assert.equal(tab.jobs().length, count-1); + } + } +}; +var canParseRawLine = { + 'can parse raw line': { + topic: function() { + mockChild.user = 'special'; + return loadTabs(''); + }, + 'should succeed parsing raw line':function(err, tab) { + var job = tab.parse('0 7 * * 1,2,3,4,5 ls -l #test'); + + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '7'); + Assert.equal(job.dom().toString(), '*'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '1,2,3,4,5'); + Assert.equal(job.command(), 'ls -l'); + Assert.equal(job.comment(), 'test'); + } + } +} +var canParseSpecialSyntax = { + 'can parse special cron syntax': { + topic: function() { + mockChild.user = 'special'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 8); + }, + '@reboot':function(err, tab) { + var jobs = tab.jobs({command:'reboot'}); + var job = jobs[0]; + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + Assert.isTrue(job.isValid()); + Assert.equal(job.comment(), 'reboot'); + }, + '@hourly':function(tab) { + var jobs = tab.jobs({command:'hourly'}); + var job = jobs[0]; + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '*'); + Assert.equal(job.dom().toString(), '*'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '*'); + }, + '@daily':function(tab) { + var jobs = tab.jobs({command:'daily'}); + var job = jobs[0]; + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '0'); + Assert.equal(job.dom().toString(), '*'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '*'); + }, + '@weekly':function(tab) { + var jobs = tab.jobs({command:'weekly'}); + var job = jobs[0]; + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '0'); + Assert.equal(job.dom().toString(), '*'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '0'); + }, + '@monthly':function(tab) { + var jobs = tab.jobs({command:'monthly'}); + var job = jobs[0]; + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '0'); + Assert.equal(job.dom().toString(), '1'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '*'); + }, + '@yearly':function(tab) { + var jobs = tab.jobs({command:'yearly'}); + var job = jobs[0]; + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '0'); + Assert.equal(job.dom().toString(), '1'); + Assert.equal(job.month().toString(), '1'); + Assert.equal(job.dow().toString(), '*'); + }, + '@annually':function(tab) { + var jobs = tab.jobs({command:'yearly'}); + var job = jobs[0]; + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '0'); + Assert.equal(job.dom().toString(), '1'); + Assert.equal(job.month().toString(), '1'); + Assert.equal(job.dow().toString(), '*'); + }, + '@midnight':function(tab) { + var jobs = tab.jobs({command:'midnight'}); + var job = jobs[0]; + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '0'); + Assert.equal(job.dom().toString(), '*'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '*'); + } + } +}; +var canParseCommands = { + 'can parse commands' : { + topic: function() { + mockChild.user = 'commands'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 1); + }, + 'command should match':function(err, tab) { + var job = tab.jobs()[0]; + Assert.equal(job.command(), '/usr/bin/env echo "check email"'); + } + } +} +var canParseInlineComments = { + 'can parse inline comments' : { + topic: function() { + mockChild.user = 'comments'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 1); + }, + 'comment should match':function(err, tab) { + var job = tab.jobs()[0]; + Assert.equal(job.comment(), 'every business hour'); + } + } +}; +var canFindJobsByCommand = { + 'can find jobs by command' : { + topic: function() { + mockChild.user = 'commands'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 1); + }, + 'should find jobs by substring':function(err, tab) { + var jobs = tab.jobs({command:'/usr/bin/env echo'}); + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + }, + 'should find jobs by regular expression':function(err, tab) { + var jobs = tab.jobs({command:/echo/}); + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + } + } +}; +var canFindJobsByComment = { + 'can find jobs by comment' : { + topic: function() { + mockChild.user = 'comments'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 1); + }, + 'should find jobs by substring':function(err, tab) { + var jobs = tab.jobs({comment:'every business hour'}); + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + }, + 'should find jobs by regular expression':function(err, tab) { + var jobs = tab.jobs({comment:/business/}); + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + } + } +}; +var canSaveCreatedJobs = { + 'can save jobs' : { + topic: function() { + mockChild.user = 'comments'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + var jobs = tab.jobs(); + + Assert.equal(jobs.length, 1); + }, + 'after a successful load': { + topic: function(tab) { + tab.create('ls -l', '0 7 * * 1,2,3,4,5', 'test'); + return saveTabs(tab); + }, + 'should succeed saving':function(err, tab) { + var jobs = tab.jobs(); + + Assert.equal(jobs.length, 2); + } + } + } +}; +var canResetJobs = { + 'can reset jobs' : { + topic: function() { + mockChild.user = 'reset'; + return loadTabs(''); + }, + 'should succeed reseting':function(err, tab) { + Assert.equal(tab.jobs().length, 0); + + tab.create('ls -l', '0 7 * * 1,2,3,4,5', 'test 1'); + tab.create('ls -l', '0 7 * * 1,2,3,4,5', 'test 2'); + tab.create('ls -l', '0 7 * * 1,2,3,4,5', 'test 3'); + Assert.equal(tab.jobs().length, 3); + + Assert.equal(tab.vars().length, 0); + tab.vars().add('FOO', 'foo'); + tab.vars().add('BAR', '1'); + Assert.equal(tab.vars().length, 2); + + tab.reset(); + Assert.equal(tab.jobs().length, 0); + Assert.equal(tab.vars().length, 0); + } + } +}; + +var willWorkOnManyPlatforms = { + 'can save in sunos' : { + topic: function() { + process.originalPlatform = process.platform; + process.platform = 'sunos'; + + return saveTabs(userLoadsHerOwnNonEmptyCrons.tab); + }, + 'should succeed saving in sunos':function(err, tab) { + process.platform = process.originalPlatform; + + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + } + } +}; + +var willFailWithError = { + 'Failures should throw Error objects' : { + topic: function() { + mockChild.user = 'blago'; + // since user Tom does not exist this should trigger a failure + return loadTabs('tom'); + }, + 'load will fail with Error': function(err, tab) { + Assert.isNotNull(err); + Assert.isTrue(err instanceof Error); + } + } +}; + +var Vows = require('vows'); +var Assert = require('assert'); +var CronTab = require('../lib/index'); + +Vows.describe('crontab'). + addBatch(nonRootLoadsAnotherUserCrons). + addBatch(rootLoadsAnotherUserCrons). + addBatch(rootLoadsAnotherNonExistingUserCrons). + addBatch(userLoadsHisOwnEmptyCrons). + addBatch(userLoadsHerOwnNonEmptyCrons). + addBatch(userSavesHerOwnNonEmptyCrons). + addBatch(userLoadsHerOwnNonEmptyCronsAgain). + addBatch(canLoadEnvironment). + addBatch(canQueryEnvironment). + addBatch(canCreateEnvironment). + addBatch(canRemoveEnvironment). + addBatch(canCreateJob). + addBatch(canRemoveJob). + addBatch(canParseRawLine). + addBatch(canParseSpecialSyntax). + addBatch(canParseCommands). + addBatch(canParseInlineComments). + addBatch(canFindJobsByCommand). + addBatch(canFindJobsByComment). + addBatch(canSaveCreatedJobs). + addBatch(canResetJobs). + addBatch(willWorkOnManyPlatforms). + addBatch(willFailWithError). + export(module); diff --git a/src/node_modules/readline-sync/LICENSE b/src/node_modules/readline-sync/LICENSE new file mode 100644 index 0000000..0d289d9 --- /dev/null +++ b/src/node_modules/readline-sync/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 anseki + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/src/node_modules/readline-sync/README-Deprecated.md b/src/node_modules/readline-sync/README-Deprecated.md new file mode 100644 index 0000000..25128a5 --- /dev/null +++ b/src/node_modules/readline-sync/README-Deprecated.md @@ -0,0 +1,89 @@ +# readlineSync + +## Deprecated Methods and Options + +The readlineSync current version is fully compatible with older version. +The following methods and options are deprecated. + +### `setPrint` method + +Use the [`print`](README.md#basic_options-print) option. +For the [Default Options](README.md#basic_options), use: + +```js +readlineSync.setDefaultOptions({print: value}); +``` + +instead of: + +```js +readlineSync.setPrint(value); +``` + +### `setPrompt` method + +Use the [`prompt`](README.md#basic_options-prompt) option. +For the [Default Options](README.md#basic_options), use: + +```js +readlineSync.setDefaultOptions({prompt: value}); +``` + +instead of: + +```js +readlineSync.setPrompt(value); +``` + +### `setEncoding` method + +Use the [`encoding`](README.md#basic_options-encoding) option. +For the [Default Options](README.md#basic_options), use: + +```js +readlineSync.setDefaultOptions({encoding: value}); +``` + +instead of: + +```js +readlineSync.setEncoding(value); +``` + +### `setMask` method + +Use the [`mask`](README.md#basic_options-mask) option. +For the [Default Options](README.md#basic_options), use: + +```js +readlineSync.setDefaultOptions({mask: value}); +``` + +instead of: + +```js +readlineSync.setMask(value); +``` + +### `setBufferSize` method + +Use the [`bufferSize`](README.md#basic_options-buffersize) option. +For the [Default Options](README.md#basic_options), use: + +```js +readlineSync.setDefaultOptions({bufferSize: value}); +``` + +instead of: + +```js +readlineSync.setBufferSize(value); +``` + +### `noEchoBack` option + +Use [`hideEchoBack`](README.md#basic_options-hideechoback) option instead of it. + +### `noTrim` option + +Use [`keepWhitespace`](README.md#basic_options-keepwhitespace) option instead of it. diff --git a/src/node_modules/readline-sync/README.md b/src/node_modules/readline-sync/README.md new file mode 100644 index 0000000..4549a51 --- /dev/null +++ b/src/node_modules/readline-sync/README.md @@ -0,0 +1,1836 @@ +# readlineSync + +[![npm](https://img.shields.io/npm/v/readline-sync.svg)](https://www.npmjs.com/package/readline-sync) [![GitHub issues](https://img.shields.io/github/issues/anseki/readline-sync.svg)](https://github.com/anseki/readline-sync/issues) [![dependencies](https://img.shields.io/badge/dependencies-No%20dependency-brightgreen.svg)](package.json) [![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE-MIT) + +Synchronous [Readline](http://nodejs.org/api/readline.html) for interactively running to have a conversation with the user via a console(TTY). + +readlineSync tries to let your script have a conversation with the user via a console, even when the input/output stream is redirected like `your-script bar.log`. + + + +
Basic OptionsUtility MethodsPlaceholders
+ +* Simple case: + +```js +var readlineSync = require('readline-sync'); + +// Wait for user's response. +var userName = readlineSync.question('May I have your name? '); +console.log('Hi ' + userName + '!'); + +// Handle the secret text (e.g. password). +var favFood = readlineSync.question('What is your favorite food? ', { + hideEchoBack: true // The typed text on screen is hidden by `*` (default). +}); +console.log('Oh, ' + userName + ' loves ' + favFood + '!'); +``` + +```console +May I have your name? CookieMonster +Hi CookieMonster! +What is your favorite food? **** +Oh, CookieMonster loves tofu! +``` + +* Get the user's response by a single key without the Enter key: + +```js +var readlineSync = require('readline-sync'); +if (readlineSync.keyInYN('Do you want this module?')) { + // 'Y' key was pressed. + console.log('Installing now...'); + // Do something... +} else { + // Another key was pressed. + console.log('Searching another...'); + // Do something... +} +``` + +* Let the user choose an item from a list: + +```js +var readlineSync = require('readline-sync'), + animals = ['Lion', 'Elephant', 'Crocodile', 'Giraffe', 'Hippo'], + index = readlineSync.keyInSelect(animals, 'Which animal?'); +console.log('Ok, ' + animals[index] + ' goes to your room.'); +``` + +```console +[1] Lion +[2] Elephant +[3] Crocodile +[4] Giraffe +[5] Hippo +[0] CANCEL + +Which animal? [1...5 / 0]: 2 +Ok, Elephant goes to your room. +``` + +* An UI like the Range Slider: +(Press `Z` or `X` key to change a value, and Space Bar to exit) + +```js +var readlineSync = require('readline-sync'), + MAX = 60, MIN = 0, value = 30, key; +console.log('\n\n' + (new Array(20)).join(' ') + + '[Z] <- -> [X] FIX: [SPACE]\n'); +while (true) { + console.log('\x1B[1A\x1B[K|' + + (new Array(value + 1)).join('-') + 'O' + + (new Array(MAX - value + 1)).join('-') + '| ' + value); + key = readlineSync.keyIn('', + {hideEchoBack: true, mask: '', limit: 'zx '}); + if (key === 'z') { if (value > MIN) { value--; } } + else if (key === 'x') { if (value < MAX) { value++; } } + else { break; } +} +console.log('\nA value the user requested: ' + value); +``` + +![sample](screen_03.gif) + +* Handle the commands repeatedly, such as the shell interface: + +```js +readlineSync.promptCLLoop({ + add: function(target, into) { + console.log(target + ' is added into ' + into + '.'); + // Do something... + }, + remove: function(target) { + console.log(target + ' is removed.'); + // Do something... + }, + bye: function() { return true; } +}); +console.log('Exited'); +``` + +```console +> add pic01.png archive +pic01.png is added into archive. +> delete pic01.png +Requested command is not available. +> remove pic01.png +pic01.png is removed. +> bye +Exited +``` + +## Installation + +```console +npm install readline-sync +``` + +## Quick Start + +**How does the user input?** + +- [Type a reply to a question, and press the Enter key](#quick_start-a) (A) +- [Type a keyword like a command in prompt, and press the Enter key](#quick_start-b) (B) +- [Press a single key without the Enter key](#quick_start-c) (C) + +**(A) What does the user input?** + +- [E-mail address](#utility_methods-questionemail) +- [New password](#utility_methods-questionnewpassword) +- [Integer number](#utility_methods-questionint) +- [Floating-point number](#utility_methods-questionfloat) +- [Local file/directory path](#utility_methods-questionpath) +- [Others](#basic_methods-question) + +**(B) What does your script do?** + +- [Receive a parsed command-name and arguments](#utility_methods-promptcl) +- [Receive an input repeatedly](#utility_methods-promptloop) +- [Receive a parsed command-name and arguments repeatedly](#utility_methods-promptclloop) +- [Receive an input with prompt that is similar to that of the user's shell](#utility_methods-promptsimshell) +- [Others](#basic_methods-prompt) + +**(C) What does the user do?** + +- [Say "Yes" or "No"](#utility_methods-keyinyn) +- [Say "Yes" or "No" explicitly](#utility_methods-keyinynstrict) +- [Make the running of script continue when ready](#utility_methods-keyinpause) +- [Choose an item from a list](#utility_methods-keyinselect) +- [Others](#basic_methods-keyin) + +## Basic Methods + +These are used to control details of the behavior. It is recommended to use the [Utility Methods](#utility_methods) instead of Basic Methods if it satisfy your request. + +### `question` + +```js +answer = readlineSync.question([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then return the input from the user after it has been typed and the Enter key was pressed. +You can specify an `options` (see [Basic Options](#basic_options)) to control the behavior (e.g. refusing unexpected input, avoiding trimming white spaces, etc.). **If you let the user input the secret text (e.g. password), you should consider [`hideEchoBack`](#basic_options-hideechoback) option.** + +The `query` may be string, or may not be (e.g. number, Date, Object, etc.). It is converted to string (i.e. `toString` method is called) before it is displayed. (see [Note](#note) also) +It can include the [placeholders](#placeholders). + +For example: + +```js +program = readlineSync.question('Which program starts do you want? ', { + defaultInput: 'firefox' +}); +``` + +### `prompt` + +```js +input = readlineSync.prompt([options]) +``` + +Display a prompt-sign (see [`prompt`](#basic_options-prompt) option) to the user, and then return the input from the user after it has been typed and the Enter key was pressed. +You can specify an `options` (see [Basic Options](#basic_options)) to control the behavior (e.g. refusing unexpected input, avoiding trimming white spaces, etc.). + +For example: + +```js +while (true) { + command = readlineSync.prompt(); + // Do something... +} +``` + +### `keyIn` + +```js +pressedKey = readlineSync.keyIn([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then return a character as a key immediately it was pressed by the user, **without pressing the Enter key**. Note that the user has no chance to change the input. +You can specify an `options` (see [Basic Options](#basic_options)) to control the behavior (e.g. ignoring keys except some keys, checking target key, etc.). + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. + +For example: + +```js +menuId = readlineSync.keyIn('Hit 1...5 key: ', {limit: '$<1-5>'}); +``` + +### `setDefaultOptions` + +```js +currentDefaultOptions = readlineSync.setDefaultOptions([newDefaultOptions]) +``` + +Change the [Default Options](#basic_options) to the values of properties of `newDefaultOptions` Object. +All it takes is to specify options that you want change, because unspecified options are not updated. + +## Basic Options + +[`prompt`](#basic_options-prompt), [`hideEchoBack`](#basic_options-hideechoback), [`mask`](#basic_options-mask), [`limit`](#basic_options-limit), [`limitMessage`](#basic_options-limitmessage), [`defaultInput`](#basic_options-defaultinput), [`trueValue`, `falseValue`](#basic_options-truevalue_falsevalue), [`caseSensitive`](#basic_options-casesensitive), [`keepWhitespace`](#basic_options-keepwhitespace), [`encoding`](#basic_options-encoding), [`bufferSize`](#basic_options-buffersize), [`print`](#basic_options-print), [`history`](#basic_options-history), [`cd`](#basic_options-cd) + +An `options` Object can be specified to the methods to control the behavior of readlineSync. The options that were not specified to the methods are got from the Default Options. You can change the Default Options by [`setDefaultOptions`](#basic_methods-setdefaultoptions) method anytime, and it is kept until a current process is exited. +Specify the options that are often used to the Default Options, and specify temporary options to the methods. + +For example: + +```js +readlineSync.setDefaultOptions({limit: ['green', 'yellow', 'red']}); +a1 = readlineSync.question('Which color of signal? '); // Input is limited to 3 things. +a2 = readlineSync.question('Which color of signal? '); // It's limited yet. +a3 = readlineSync.question('What is your favorite color? ', {limit: null}); // It's unlimited temporarily. +a4 = readlineSync.question('Which color of signal? '); // It's limited again. +readlineSync.setDefaultOptions({limit: ['beef', 'chicken']}); +a5 = readlineSync.question('Beef or Chicken? '); // Input is limited to new 2 things. +a6 = readlineSync.question('And you? '); // It's limited to 2 things yet. +``` + +The Object as `options` can have following properties. + +### `prompt` + +_For `prompt*` methods only_ +*Type:* string or others +*Default:* `'> '` + +Set the prompt-sign that is displayed to the user by `prompt*` methods. For example you see `> ` that is Node.js's prompt-sign when you run `node` on the command line. +This may be string, or may not be (e.g. number, Date, Object, etc.). It is converted to string every time (i.e. `toString` method is called) before it is displayed. (see [Note](#note) also) +It can include the [placeholders](#placeholders). + +For example: + +```js +readlineSync.setDefaultOptions({prompt: '$ '}); +``` + +```js +// Display the memory usage always. +readlineSync.setDefaultOptions({ + prompt: { // Simple Object that has toString method. + toString: function() { + var rss = process.memoryUsage().rss; + return '[' + (rss > 1024 ? Math.round(rss / 1024) + 'k' : rss) + 'b]$ '; + } + } +}); +``` + +```console +[13148kb]$ foo +[13160kb]$ bar +[13200kb]$ +``` + +### `hideEchoBack` + +*Type:* boolean +*Default:* `false` + +If `true` is specified, hide the secret text (e.g. password) which is typed by user on screen by the mask characters (see [`mask`](#basic_options-mask) option). + +For example: + +```js +password = readlineSync.question('PASSWORD: ', {hideEchoBack: true}); +console.log('Login ...'); +``` + +```console +PASSWORD: ******** +Login ... +``` + +### `mask` + +*Type:* string +*Default:* `'*'` + +Set the mask characters that are shown instead of the secret text (e.g. password) when `true` is specified to [`hideEchoBack`](#basic_options-hideechoback) option. If you want to show nothing, specify `''`. (But it might be not user friendly in some cases.) +**Note:** In some cases (e.g. when the input stream is redirected on Windows XP), `'*'` or `''` might be used whether other one is specified. + +For example: + +```js +secret = readlineSync.question('Please whisper sweet words: ', { + hideEchoBack: true, + mask: require('chalk').magenta('\u2665') +}); +``` + +![sample](screen_02.gif) + +### `limit` + +Limit the user's input. +The usage differ depending on the method. + +#### For `question*` and `prompt*` methods + +*Type:* string, number, RegExp, function or Array +*Default:* `[]` + +Accept only the input that matches value that is specified to this. If the user input others, display a string that is specified to [`limitMessage`](#basic_options-limitmessage) option, and wait for reinput. + +* The string is compared with the input. It is affected by [`caseSensitive`](#basic_options-casesensitive) option. +* The number is compared with the input that is converted to number by `parseFloat()`. For example, it interprets `' 3.14 '`, `'003.1400'`, `'314e-2'` and `'3.14PI'` as `3.14`. And it interprets `'005'`, `'5files'`, `'5kb'` and `'5px'` as `5`. +* The RegExp tests the input. +* The function that returns a boolean to indicate whether it matches is called with the input. + +One of above or an Array that includes multiple things (or Array includes Array) can be specified. + +For example: + +```js +command = readlineSync.prompt({limit: ['add', 'remove', /^clear( all)?$/]}); +// ** But `promptCL` method should be used instead of this. ** +``` + +```js +file = readlineSync.question('Text File: ', {limit: /\.txt$/i}); +// ** But `questionPath` method should be used instead of this. ** +``` + +```js +ip = readlineSync.question('IP Address: ', {limit: function(input) { + return require('net').isIP(input); // Valid IP Address +}}); +``` + +```js +availableActions = []; +if (!blockExists()) { availableActions.push('jump'); } +if (isLarge(place)) { availableActions.push('run'); } +if (isNew(shoes)) { availableActions.push('kick'); } +if (isNearby(enemy)) { availableActions.push('punch'); } +action = readlineSync.prompt({limit: availableActions}); +// ** But `promptCL` method should be used instead of this. ** +``` + +#### For `keyIn*` method + +*Type:* string, number or Array +*Default:* `[]` + +Accept only the key that matches value that is specified to this, ignore others. +Specify the characters as the key. All strings or Array of those are decomposed into single characters. For example, `'abcde'` or `['a', 'bc', ['d', 'e']]` are the same as `['a', 'b', 'c', 'd', 'e']`. +These strings are compared with the input. It is affected by [`caseSensitive`](#basic_options-casesensitive) option. + +The [placeholders](#placeholders) like `'$'` are replaced to an Array that is the character list like `['a', 'b', 'c', 'd', 'e']`. + +For example: + +```js +direction = readlineSync.keyIn('Left or Right? ', {limit: 'lr'}); // 'l' or 'r' +``` + +```js +dice = readlineSync.keyIn('Roll the dice, What will the result be? ', + {limit: '$<1-6>'}); // range of '1' to '6' +``` + +### `limitMessage` + +_For `question*` and `prompt*` methods only_ +*Type:* string +*Default:* `'Input another, please.$<( [)limit(])>'` + +Display this to the user when the [`limit`](#basic_options-limit) option is specified and the user input others. +The [placeholders](#placeholders) can be included. + +For example: + +```js +file = readlineSync.question('Name of Text File: ', { + limit: /\.txt$/i, + limitMessage: 'Sorry, $ is not text file.' +}); +``` + +### `defaultInput` + +_For `question*` and `prompt*` methods only_ +*Type:* string +*Default:* `''` + +If the user input empty text (i.e. pressed the Enter key only), return this. + +For example: + +```js +lang = readlineSync.question('Which language? ', {defaultInput: 'javascript'}); +``` + +### `trueValue`, `falseValue` + +*Type:* string, number, RegExp, function or Array +*Default:* `[]` + +If the input matches `trueValue`, return `true`. If the input matches `falseValue`, return `false`. In any other case, return the input. + +* The string is compared with the input. It is affected by [`caseSensitive`](#basic_options-casesensitive) option. +* The number is compared with the input that is converted to number by `parseFloat()`. For example, it interprets `' 3.14 '`, `'003.1400'`, `'314e-2'` and `'3.14PI'` as `3.14`. And it interprets `'005'`, `'5files'`, `'5kb'` and `'5px'` as `5`. Note that in `keyIn*` method, the input is every time one character (i.e. the number that is specified must be an integer within the range of `0` to `9`). +* The RegExp tests the input. +* The function that returns a boolean to indicate whether it matches is called with the input. + +One of above or an Array that includes multiple things (or Array includes Array) can be specified. + +For example: + +```js +answer = readlineSync.question('How do you like it? ', { + trueValue: ['yes', 'yeah', 'yep'], + falseValue: ['no', 'nah', 'nope'] +}); +if (answer === true) { + console.log('Let\'s go!'); +} else if (answer === false) { + console.log('Oh... It\'s ok...'); +} else { + console.log('Sorry. What does "' + answer + '" you said mean?'); +} +``` + +### `caseSensitive` + +*Type:* boolean +*Default:* `false` + +By default, the string comparisons are case-insensitive (i.e. `a` equals `A`). If `true` is specified, it is case-sensitive, the cases are not ignored (i.e. `a` is different from `A`). +It affects: [`limit`](#basic_options-limit), [`trueValue`](#basic_options-truevalue_falsevalue), [`falseValue`](#basic_options-truevalue_falsevalue), some [placeholders](#placeholders), and some [Utility Methods](#utility_methods). + +### `keepWhitespace` + +_For `question*` and `prompt*` methods only_ +*Type:* boolean +*Default:* `false` + +By default, remove the leading and trailing white spaces from the input text. If `true` is specified, don't remove those. + +### `encoding` + +*Type:* string +*Default:* `'utf8'` + +Set the encoding method of the input and output. + +### `bufferSize` + +_For `question*` and `prompt*` methods only_ +*Type:* number +*Default:* `1024` + +When readlineSync reads from a console directly (without [external program](#note-reading_by_external_program)), use a size `bufferSize` buffer. +Even if the input by user exceeds it, it's usually no problem, because the buffer is used repeatedly. But some platforms's (e.g. Windows) console might not accept input that exceeds it. And set an enough size. +Note that this might be limited by [version of Node.js](https://nodejs.org/api/buffer.html#buffer_class_method_buffer_alloc_size_fill_encoding) and environment running your script (Big buffer size is usually not required). (See also: [issue](https://github.com/nodejs/node/issues/4660), [PR](https://github.com/nodejs/node/pull/4682)) + +### `print` + +*Type:* function or `undefined` +*Default:* `undefined` + +Call the specified function with every output. The function is given two arguments, `display` as an output text, and a value of [`encoding`](#basic_options-encoding) option. + +For example: + +* Pass the plain texts to the Logger (e.g. [log4js](https://github.com/nomiddlename/log4js-node)), after clean the colored texts. + +![sample](screen_01.png) + +```js +var readlineSync = require('readline-sync'), + chalk = require('chalk'), + log4js = require('log4js'), + logger, user, pw, command; + +log4js.configure({appenders: [{type: 'file', filename: 'fooApp.log'}]}); +logger = log4js.getLogger('fooApp'); + +readlineSync.setDefaultOptions({ + print: function(display, encoding) + { logger.info(chalk.stripColor(display)); }, // Remove ctrl-chars. + prompt: chalk.red.bold('> ') +}); + +console.log(chalk.black.bold.bgYellow(' Your Account ')); +user = readlineSync.question(chalk.gray.underline(' USER NAME ') + ' : '); +pw = readlineSync.question(chalk.gray.underline(' PASSWORD ') + ' : ', + {hideEchoBack: true}); +// Authorization ... +console.log(chalk.green('Welcome, ' + user + '!')); +command = readlineSync.prompt(); +``` + +* Output a conversation to a file when an output stream is redirected to record those into a file like `your-script >foo.log`. That is, a conversation isn't outputted to `foo.log` without this code. + +```js +readlineSync.setDefaultOptions({ + print: function(display, encoding) + { process.stdout.write(display, encoding); } +}); +var name = readlineSync.question('May I have your name? '); +var loc = readlineSync.question('Hi ' + name + '! Where do you live? '); +``` + +* Let somebody hear our conversation in real time. +It just uses a fifo with above sample code that was named `conv.js`. + +Another terminal: + +```console +mkfifo /tmp/fifo +cat /tmp/fifo +``` + +My terminal: + +```console +node conv.js >/tmp/fifo +``` + +```console +May I have your name? Oz +Hi Oz! Where do you live? Emerald City +``` + +And then, another terminal shows this synchronously: + +```console +May I have your name? Oz +Hi Oz! Where do you live? Emerald City +``` + +### `history` + +_For `question*` and `prompt*` methods only_ +*Type:* boolean +*Default:* `true` + +readlineSync supports a history expansion feature that is similar to that of the shell. If `false` is specified, disable this feature. +*It keeps a previous input only.* That is, only `!!`, `!-1`, `!!:p` and `!-1:p` like bash or zsh etc. are supported. + +* `!!` or `!-1`: Return a previous input. +* `!!:p` or `!-1:p`: Display a previous input but do not return it, and wait for reinput. + +For example: + +```js +while (true) { + input = readlineSync.prompt(); + console.log('-- You said "' + input + '"'); +} +``` + +```console +> hello +-- You said "hello" +> !! +hello +-- You said "hello" +> !!:p +hello +> bye +-- You said "bye" +``` + +### `cd` + +_For `question*` and `prompt*` methods only_ +*Type:* boolean +*Default:* `false` + +readlineSync supports the changing the current working directory feature that is similar to the `cd` and `pwd` commands in the shell. If `true` is specified, enable this feature. +This helps the user when you let the user input the multiple local files or directories. +It supports `cd` and `pwd` commands. + +* `cd `: Change the current working directory to ``. The `` can include `~` as the home directory. +* `pwd`: Display the current working directory. + +When these were input, do not return, and wait for reinput. + +For example: + +```js +while (true) { + file = readlineSync.questionPath('File: '); + console.log('-- Specified file is ' + file); +} +``` + +```console +File: cd foo-dir/bar-dir +File: pwd +/path/to/foo-dir/bar-dir +File: file-a.js +-- Specified file is /path/to/foo-dir/bar-dir/file-a.js +File: file-b.png +-- Specified file is /path/to/foo-dir/bar-dir/file-b.png +File: file-c.html +-- Specified file is /path/to/foo-dir/bar-dir/file-c.html +``` + +## Utility Methods + +[`questionEMail`](#utility_methods-questionemail), [`questionNewPassword`](#utility_methods-questionnewpassword), [`questionInt`](#utility_methods-questionint), [`questionFloat`](#utility_methods-questionfloat), [`questionPath`](#utility_methods-questionpath), [`promptCL`](#utility_methods-promptcl), [`promptLoop`](#utility_methods-promptloop), [`promptCLLoop`](#utility_methods-promptclloop), [`promptSimShell`](#utility_methods-promptsimshell), [`keyInYN`](#utility_methods-keyinyn), [`keyInYNStrict`](#utility_methods-keyinynstrict), [`keyInPause`](#utility_methods-keyinpause), [`keyInSelect`](#utility_methods-keyinselect) + +These are convenient methods that are extended [Basic Methods](#basic_methods) to be used easily. + +### `questionEMail` + +```js +email = readlineSync.questionEMail([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then accept only a valid e-mail address, and then return it after the Enter key was pressed. + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. +The default value of `query` is `'Input e-mail address: '`. + +**Note:** The valid e-mail address requirement is a willful violation of [RFC5322](http://tools.ietf.org/html/rfc5322), this is defined in [HTML5](http://www.w3.org/TR/html5/forms.html). This works enough to prevent the user mistaking. If you want to change it, specify [`limit`](#basic_options-limit) option. + +For example: + +```js +email = readlineSync.questionEMail(); +console.log('-- E-mail is ' + email); +``` + +```console +Input e-mail address: abc +Input valid e-mail address, please. +Input e-mail address: mail@example.com +-- E-mail is mail@example.com +``` + +#### Options + +The following options have independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`hideEchoBack`](#basic_options-hideechoback) | `false` | +| [`limit`](#basic_options-limit) | RegExp by [HTML5](http://www.w3.org/TR/html5/forms.html) | +| [`limitMessage`](#basic_options-limitmessage) | `'Input valid e-mail address, please.'` | +| [`trueValue`](#basic_options-truevalue_falsevalue) | `null` | +| [`falseValue`](#basic_options-truevalue_falsevalue) | `null` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + + +
maskdefaultInputcaseSensitiveencodingbufferSize
printhistory
+ +### `questionNewPassword` + +```js +password = readlineSync.questionNewPassword([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then accept only a valid password, and then request same one again, and then return it after the Enter key was pressed. +It's the password, or something that is the secret text like the password. +You can specify the valid password requirement to the options. + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. +The default value of `query` is `'Input new password: '`. + +**Note:** Only the form of password is checked. Check it more if you want. For example, [zxcvbn](https://github.com/dropbox/zxcvbn) is password strength estimation library. + +For example: + +```js +password = readlineSync.questionNewPassword(); +console.log('-- Password is ' + password); +``` + +```console +Input new password: ************ +It can include: 0...9, A...Z, a...z, !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ +And the length must be: 12...24 +Input new password: ************* +Reinput a same one to confirm it: ************* +It differs from first one. Hit only the Enter key if you want to retry from first one. +Reinput a same one to confirm it: ************* +-- Password is _my_password_ +``` + +#### Options + +The following options have independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`hideEchoBack`](#basic_options-hideechoback) | `true` | +| [`mask`](#basic_options-mask) | `'*'` | +| [`limitMessage`](#basic_options-limitmessage) | `'It can include: $\nAnd the length must be: $'` | +| [`trueValue`](#basic_options-truevalue_falsevalue) | `null` | +| [`falseValue`](#basic_options-truevalue_falsevalue) | `null` | +| [`caseSensitive`](#basic_options-casesensitive) | `true` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + +
defaultInputkeepWhitespaceencodingbufferSizeprint
+ +And the following additional options are available. + +##### `charlist` + +*Type:* string +*Default:* `'$'` + +A string as the characters that can be included in the password. For example, if `'abc123'` is specified, the passwords that include any character other than these 6 characters are refused. +The [placeholders](#placeholders) like `'$'` are replaced to the characters like `'abcde'`. + +For example, let the user input a password that is created with alphabet and some symbols: + +```js +password = readlineSync.questionNewPassword('PASSWORD: ', {charlist: '$#$@%'}); +``` + +##### `min`, `max` + +*Type:* number +*Default:* `min`: `12`, `max`: `24` + +`min`: A number as a minimum length of the password. +`max`: A number as a maximum length of the password. + +##### `confirmMessage` + +*Type:* string or others +*Default:* `'Reinput a same one to confirm it: '` + +A message that lets the user input the same password again. +It can include the [placeholders](#placeholders). +If this is not string, it is converted to string (i.e. `toString` method is called). + +##### `unmatchMessage` + +*Type:* string or others +*Default:* `'It differs from first one. Hit only the Enter key if you want to retry from first one.'` + +A warning message that is displayed when the second input did not match first one. +This is converted the same as the [`confirmMessage`](#utility_methods-questionnewpassword-options-confirmmessage) option. + +#### Additional Placeholders + +The following additional [placeholder](#placeholders) parameters are available. + +##### `charlist` + +A current value of [`charlist`](#utility_methods-questionnewpassword-options-charlist) option that is converted to human readable if possible. (e.g. `'A...Z'`) + +##### `length` + +A current value of [`min` and `max`](#utility_methods-questionnewpassword-options-min_max) option that is converted to human readable. (e.g. `'12...24'`) + +### `questionInt` + +```js +numInt = readlineSync.questionInt([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then accept only an input that can be interpreted as an integer, and then return the number (not string) after the Enter key was pressed. +This parses the input as much as possible by `parseInt()`. For example, it interprets `' 5 '`, `'5.6'`, `'005'`, `'5files'`, `'5kb'` and `'5px'` as `5`. + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. + +#### Options + +The following option has independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`limitMessage`](#basic_options-limitmessage) | `'Input valid number, please.'` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + + +
hideEchoBackmaskdefaultInputencodingbufferSize
printhistory
+ +### `questionFloat` + +```js +numFloat = readlineSync.questionFloat([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then accept only an input that can be interpreted as a floating-point number, and then return the number (not string) after the Enter key was pressed. +This parses the input as much as possible by `parseFloat()`. For example, it interprets `' 3.14 '`, `'003.1400'`, `'314e-2'` and `'3.14PI'` as `3.14`. + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. + +#### Options + +The following option has independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`limitMessage`](#basic_options-limitmessage) | `'Input valid number, please.'` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + + +
hideEchoBackmaskdefaultInputencodingbufferSize
printhistory
+ +### `questionPath` + +```js +path = readlineSync.questionPath([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then accept only a valid local file or directory path, and then return an absolute path after the Enter key was pressed. +The `~` that is input by the user is replaced to the home directory. +You can specify the valid local file or directory path requirement to the options. And you can make it create a new file or directory when it doesn't exist. + +It is recommended to use this method with the [`cd`](#basic_options-cd) option. (Default: `true`) + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. +The default value of `query` is `'Input path (you can "cd" and "pwd"): '`. + +For example: + +```js +sourceFile = readlineSync.questionPath('Read from: ', { + isFile: true +}); +console.log('-- sourceFile: ' + sourceFile); + +saveDir = readlineSync.questionPath('Save to: ', { + isDirectory: true, + exists: null, + create: true +}); +console.log('-- saveDir: ' + saveDir); +``` + +```console +Read from: ~/fileA +No such file or directory: /home/user/fileA +Input valid path, please. +Read from: pwd +/path/to/work +Read from: cd ~/project-1 +Read from: fileA +-- sourceFile: /home/user/project-1/fileA +Save to: ~/deploy/data +-- saveDir: /home/user/deploy/data +``` + +#### Options + +The following options have independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`hideEchoBack`](#basic_options-hideechoback) | `false` | +| [`limitMessage`](#basic_options-limitmessage) | `'$Input valid path, please.$<( Min:)min>$<( Max:)max>'` | +| [`history`](#basic_options-history) | `true` | +| [`cd`](#basic_options-cd) | `true` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + +
maskdefaultInputencodingbufferSizeprint
+ +And the following additional options are available. + +**Note:** It does not check the coherency about a combination of the options as the path requirement. For example, the `{exists: false, isFile: true}` never check that it is a file because it is limited to the path that does not exist. + +##### `exists` + +*Type:* boolean or others +*Default:* `true` + +If `true` is specified, accept only a file or directory path that exists. If `false` is specified, accept only a file or directory path that does *not* exist. +In any other case, the existence is not checked. + +##### `min`, `max` + +*Type:* number or others +*Default:* `undefined` + +`min`: A number as a minimum size of the file that is accepted. +`max`: A number as a maximum size of the file that is accepted. +If it is not specified or `0` is specified, the size is not checked. (A size of directory is `0`.) + +##### `isFile`, `isDirectory` + +*Type:* boolean +*Default:* `false` + +`isFile`: If `true` is specified, accept only a file path. +`isDirectory`: If `true` is specified, accept only a directory path. + +##### `validate` + +*Type:* function or `undefined` +*Default:* `undefined` + +If a function that returns `true` or an error message is specified, call it with a path that was input, and accept the input when the function returned `true`. +If the function returned a string as an error message, that message is got by the [`error`](#utility_methods-questionpath-additional_placeholders-error) additional [placeholder](#placeholders) parameter. +A path that was input is parsed before it is passed to the function. `~` is replaced to a home directory, and a path is converted to an absolute path. +This is also a return value from this method. + +For example, accept only PNG file or tell it to the user: + +```js +imageFile = readlineSync.questionPath('Image File: ', { + validate: function(path) { return /\.png$/i.test(path) || 'It is not PNG'; } +}); +``` + +##### `create` + +*Type:* boolean +*Default:* `false` + +If `true` is specified, create a file or directory as a path that was input when it doesn't exist. If `true` is specified to the [`isDirectory`](#utility_methods-questionpath-options-isfile_isdirectory) option, create a directory, otherwise a file. +It does not affect the existence check. Therefore, you can get a new file or directory path anytime by specifying: `{exists: false, create: true}` + +#### Additional Placeholders + +The following additional [placeholder](#placeholders) parameters are available. + +##### `error` + +An error message when the input was not accepted. +This value is set by readlineSync, or the function that was specified to [`validate`](#utility_methods-questionpath-options-validate) option. + +##### `min`, `max` + +A current value of [`min` and `max`](#utility_methods-questionpath-options-min_max) option. + +### `promptCL` + +```js +argsArray = readlineSync.promptCL([commandHandler[, options]]) +``` + +Display a prompt-sign (see [`prompt`](#basic_options-prompt) option) to the user, and then consider the input as a command-line and parse it, and then return a result after the Enter key was pressed. +A return value is an Array that includes the tokens that were parsed. It parses the input from the user as the command-line, and it interprets whitespaces, quotes, etc., and it splits it to tokens properly. Usually, a first element of the Array is command-name, and remaining elements are arguments. + +For example: + +```js +argsArray = readlineSync.promptCL(); +console.log(argsArray.join('\n')); +``` + +```console +> command arg "arg" " a r g " "" 'a"r"g' "a""rg" "arg +command +arg +arg + a r g + +a"r"g +arg +arg +``` + +#### `commandHandler` + +By using the `commandHandler` argument, this method will come into its own. Specifying the Object to this argument has the more merit. And it has the more merit for [`promptCLLoop`](#utility_methods-promptclloop) method. + +If a function is specified to `commandHandler` argument, it is just called with a parsed Array as an argument list of the function. And `this` is an original input string, in the function. + +For example, the following 2 codes work same except that `this` is enabled in the second one: + +```js +argsArray = readlineSync.promptCL(); +if (argsArray[0] === 'add') { + console.log(argsArray[1] + ' is added.'); +} else if (argsArray[0] === 'copy') { + console.log(argsArray[1] + ' is copied to ' + argsArray[2] + '.'); +} +``` + +```js +readlineSync.promptCL(function(command, arg1, arg2) { + console.log('You want to: ' + this); // All of command-line. + if (command === 'add') { + console.log(arg1 + ' is added.'); + } else if (command === 'copy') { + console.log(arg1 + ' is copied to ' + arg2 + '.'); + } +}); +``` + +If an Object that has properties named as the command-name is specified, the command-name is interpreted, and a function as the value of matched property is called. A function is chosen properly by handling case of the command-name in accordance with the [`caseSensitive`](#basic_options-casesensitive) option. +The function is called with a parsed Array that excludes a command-name (i.e. first element is removed from the Array) as an argument list of the function. +That is, a structure of the `commandHandler` Object looks like: + +```js +{ + commandA: function(arg) { ... }, // commandA requires one argument. + commandB: function(arg1, arg2) { ... }, // readlineSync doesn't care those. + commandC: function() { ... } // Of course, it can also ignore all. +} +``` + +readlineSync just receives the arguments from the user and passes those to these functions without checking. The functions may have to check whether the required argument was input by the user, and more validate those. + +For example, the following code works same to the above code: + +```js +readlineSync.promptCL({ + add: function(element) { // It's called by also "ADD", "Add", "aDd", etc.. + console.log(element + ' is added.'); + }, + copy: function(from, to) { + console.log(from + ' is copied to ' + to + '.'); + } +}); +``` + +If the matched property is not found in the Object, a `_` property is chosen, and the function as the value of this property is called with a parsed Array as an argument list of the function. Note that this includes a command-name. That is, the function looks like `function(command, arg1, arg2, ...) { ... }`. +And if the Object doesn't have a `_` property, any command that the matched property is not found in the Object is refused. + +For example: + +```js +readlineSync.promptCL({ + copy: function(from, to) { // command-name is not included. + console.log(from + ' is copied to ' + to + '.'); + }, + _: function(command) { // command-name is included. + console.log('Sorry, ' + command + ' is not available.'); + } +}); +``` + +#### Options + +The following options have independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`hideEchoBack`](#basic_options-hideechoback) | `false` | +| [`limitMessage`](#basic_options-limitmessage) | `'Requested command is not available.'` | +| [`caseSensitive`](#basic_options-casesensitive) | `false` | +| [`history`](#basic_options-history) | `true` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + + +
promptmaskdefaultInputencodingbufferSize
printcd
+ +### `promptLoop` + +```js +readlineSync.promptLoop(inputHandler[, options]) +``` + +Display a prompt-sign (see [`prompt`](#basic_options-prompt) option) to the user, and then call `inputHandler` function with the input from the user after it has been typed and the Enter key was pressed. Do these repeatedly until `inputHandler` function returns `true`. + +For example, the following 2 codes work same: + +```js +while (true) { + input = readlineSync.prompt(); + console.log('-- You said "' + input + '"'); + if (input === 'bye') { + break; + } +} +console.log('It\'s exited from loop.'); +``` + +```js +readlineSync.promptLoop(function(input) { + console.log('-- You said "' + input + '"'); + return input === 'bye'; +}); +console.log('It\'s exited from loop.'); +``` + +```console +> hello +-- You said "hello" +> good morning +-- You said "good morning" +> bye +-- You said "bye" +It's exited from loop. +``` + +#### Options + +The following options have independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`hideEchoBack`](#basic_options-hideechoback) | `false` | +| [`trueValue`](#basic_options-truevalue_falsevalue) | `null` | +| [`falseValue`](#basic_options-truevalue_falsevalue) | `null` | +| [`caseSensitive`](#basic_options-casesensitive) | `false` | +| [`history`](#basic_options-history) | `true` | + +The other options work as shown in the [Basic Options](#basic_options) section. + +### `promptCLLoop` + +```js +readlineSync.promptCLLoop([commandHandler[, options]]) +``` + +Execute [`promptCL`](#utility_methods-promptcl) method repeatedly until chosen [`commandHandler`](#utility_methods-promptcl-commandhandler) returns `true`. +The [`commandHandler`](#utility_methods-promptcl-commandhandler) may be a function that is called like: + +```js +exit = allCommands(command, arg1, arg2, ...); +``` + +or an Object that has the functions that are called like: + +```js +exit = foundCommand(arg1, arg2, ...); +``` + +See [`promptCL`](#utility_methods-promptcl) method for details. +This method looks like a combination of [`promptCL`](#utility_methods-promptcl) method and [`promptLoop`](#utility_methods-promptloop) method. + +For example: + +```js +readlineSync.promptCLLoop({ + add: function(element) { + console.log(element + ' is added.'); + }, + copy: function(from, to) { + console.log(from + ' is copied to ' + to + '.'); + }, + bye: function() { return true; } +}); +console.log('It\'s exited from loop.'); +``` + +```console +> add "New Hard Disk" +New Hard Disk is added. +> move filesOnOld "New Hard Disk" +Requested command is not available. +> copy filesOnOld "New Hard Disk" +filesOnOld is copied to New Hard Disk. +> bye +It's exited from loop. +``` + +#### Options + +The following options have independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`hideEchoBack`](#basic_options-hideechoback) | `false` | +| [`limitMessage`](#basic_options-limitmessage) | `'Requested command is not available.'` | +| [`caseSensitive`](#basic_options-casesensitive) | `false` | +| [`history`](#basic_options-history) | `true` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + + +
promptmaskdefaultInputencodingbufferSize
printcd
+ +### `promptSimShell` + +```js +input = readlineSync.promptSimShell([options]) +``` + +Display a prompt-sign that is similar to that of the user's shell to the user, and then return the input from the user after it has been typed and the Enter key was pressed. +This method displays a prompt-sign like: + +On Windows: + +```console +C:\Users\User\Path\To\Directory> +``` + +On others: + +```console +user@host:~/path/to/directory$ +``` + +#### Options + +The following options have independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`hideEchoBack`](#basic_options-hideechoback) | `false` | +| [`history`](#basic_options-history) | `true` | + +The other options other than [`prompt`](#basic_options-prompt) option work as shown in the [Basic Options](#basic_options) section. + +### `keyInYN` + +```js +boolYesOrEmpty = readlineSync.keyInYN([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then return a boolean or an empty string immediately a key was pressed by the user, **without pressing the Enter key**. Note that the user has no chance to change the input. +This method works like the `window.confirm` method of web browsers. A return value means "Yes" or "No" the user said. It differ depending on the pressed key: + +* `Y`: `true` +* `N`: `false` +* other: `''` + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. +The default value of `query` is `'Are you sure? '`. + +The keys other than `Y` and `N` are also accepted (If you want to know a user's wish explicitly, use [`keyInYNStrict`](#utility_methods-keyinynstrict) method). Therefore, if you let the user make an important decision (e.g. files are removed), check whether the return value is not *falsy*. That is, a default is "No". + +For example: + +```js +if (!readlineSync.keyInYN('Do you want to install this?')) { + // Key that is not `Y` was pressed. + process.exit(); +} +// Do something... +``` + +Or if you let the user stop something that must be done (e.g. something about the security), check whether the return value is `false` explicitly. That is, a default is "Yes". + +For example: + +```js +// Don't use `(!readlineSync.keyInYN())`. +if (readlineSync.keyInYN('Continue virus scan?') === false) { + // `N` key was pressed. + process.exit(); +} +// Continue... +``` + +#### Options + +The following options work as shown in the [Basic Options](#basic_options) section. + + + +
encodingprint
+ +And the following additional option is available. + +##### `guide` + +*Type:* boolean +*Default:* `true` + +If `true` is specified, a string `'[y/n]'` as guide for the user is added to `query`. And `':'` is moved to the end of `query`, or it is added. + +For example: + +```js +readlineSync.keyInYN('Do you like me?'); // No colon +readlineSync.keyInYN('Really? :'); // Colon already exists +``` + +```console +Do you like me? [y/n]: y +Really? [y/n]: y +``` + +### `keyInYNStrict` + +```js +boolYes = readlineSync.keyInYNStrict([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then accept only `Y` or `N` key, and then return a boolean immediately it was pressed by the user, **without pressing the Enter key**. Note that the user has no chance to change the input. +This method works like the `window.confirm` method of web browsers. A return value means "Yes" or "No" the user said. It differ depending on the pressed key: + +* `Y`: `true` +* `N`: `false` + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. +The default value of `query` is `'Are you sure? '`. + +A key other than `Y` and `N` is not accepted. That is, a return value has no default. Therefore, the user has to tell an own wish explicitly. If you want to know a user's wish easily, use [`keyInYN`](#utility_methods-keyinyn) method. + +This method works same to [`keyInYN`](#utility_methods-keyinyn) method except that this accept only `Y` or `N` key (Therefore, a return value is boolean every time). The options also work same to [`keyInYN`](#utility_methods-keyinyn) method. + +### `keyInPause` + +```js +readlineSync.keyInPause([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then just wait for a key to be pressed by the user. +This method works like the `window.alert` method of web browsers. This is used to make the running of script pause and show something to the user, or wait for the user to be ready. +By default, any key is accepted (See: [Note](#utility_methods-keyinpause-note)). You can change this behavior by specifying [`limit`](#basic_options-limit) option (e.g. accept only a Space Bar). + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. +The default value of `query` is `'Continue...'`. + +For example: + +```js +// Have made the preparations for something... +console.log('==== Information of Your Computer ===='); +console.log(info); // This can be `query`. +readlineSync.keyInPause(); +console.log('It\'s executing now...'); +// Do something... +``` + +```console +==== Information of Your Computer ==== +FOO: 123456 +BAR: abcdef +Continue... (Hit any key) +It's executing now... +``` + +#### Options + +The following option has independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`limit`](#basic_options-limit) | `null` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + +
caseSensitiveencodingprint
+ +And the following additional option is available. + +##### `guide` + +*Type:* boolean +*Default:* `true` + +If `true` is specified, a string `'(Hit any key)'` as guide for the user is added to `query`. + +For example: + +```js +readlineSync.keyInPause('It\'s pausing now...'); +``` + +```console +It's pausing now... (Hit any key) +``` + +#### Note + +Control keys including Enter key are not accepted by `keyIn*` methods. +If you want to wait until the user presses Enter key, use `question*` methods instead of `keyIn*` methods. For example: + +```js +readlineSync.question('Hit Enter key to continue.', {hideEchoBack: true, mask: ''}); +``` + +### `keyInSelect` + +```js +index = readlineSync.keyInSelect(items[, query[, options]]) +``` + +Display the list that was created with the `items` Array, and the `query` to the user if it's specified, and then return the number as an index of the `items` Array immediately it was chosen by pressing a key by the user, **without pressing the Enter key**. Note that the user has no chance to change the input. + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. +The default value of `query` is `'Choose one from list: '`. + +The minimum length of `items` Array is 1 and maximum length is 35. These elements are displayed as item list. A key to let the user choose an item is assigned to each item automatically in sequence like "1, 2, 3 ... 9, A, B, C ...". A number as an index of the `items` Array that corresponds to a chosen item by the user is returned. + +**Note:** Even if the `items` Array has only less than 35 items, a long Array that forces an user to scroll the list may irritate the user. Remember, the user might be in a console environment that doesn't support scrolling the screen. If you want to use a long `items` Array (e.g. more than 10 items), you should consider a "Pagination". (See [example](https://github.com/anseki/readline-sync/issues/60#issuecomment-324533678).) + +For example: + +```js +frameworks = ['Express', 'hapi', 'flatiron', 'MEAN.JS', 'locomotive']; +index = readlineSync.keyInSelect(frameworks, 'Which framework?'); +console.log(frameworks[index] + ' is enabled.'); +``` + +```console +[1] Express +[2] hapi +[3] flatiron +[4] MEAN.JS +[5] locomotive +[0] CANCEL + +Which framework? [1...5 / 0]: 2 +hapi is enabled. +``` + +#### Options + +The following option has independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`hideEchoBack`](#basic_options-hideechoback) | `false` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + +
maskencodingprint
+ +And the following additional options are available. + +##### `guide` + +*Type:* boolean +*Default:* `true` + +If `true` is specified, a string like `'[1...5]'` as guide for the user is added to `query`. And `':'` is moved to the end of `query`, or it is added. This is the key list that corresponds to the item list. + +##### `cancel` + +*Type:* boolean, string or others +*Default:* `'CANCEL'` + +If a value other than `false` is specified, an item to let the user tell "cancel" is added to the item list. "[0] CANCEL" (default) is displayed, and if `0` key is pressed, `-1` is returned. +You can specify a label of this item other than `'CANCEL'`. A string such as `'Go back'` (empty string `''` also), something that is converted to string such as `Date`, a string that includes [placeholder](#placeholders) such as `'Next $ items'` are accepted. + +#### Additional Placeholders + +The following additional [placeholder](#placeholders) parameters are available. + +##### `itemsCount` + +A length of a current `items` Array. + +For example: + +```js +items = ['item-A', 'item-B', 'item-C', 'item-D', 'item-E']; +index = readlineSync.keyInSelect(items, null, + {cancel: 'Show more than $ items'}); +``` + +```console +[1] item-A +[2] item-B +[3] item-C +[4] item-D +[5] item-E +[0] Show more than 5 items +``` + +##### `firstItem` + +A first item in a current `items` Array. + +For example: + +```js +index = readlineSync.keyInSelect(items, 'Choose $ or another: '); +``` + +##### `lastItem` + +A last item in a current `items` Array. + +For example: + +```js +items = ['January', 'February', 'March', 'April', 'May', 'June']; +index = readlineSync.keyInSelect(items, null, + {cancel: 'In after $'}); +``` + +```console +[1] January +[2] February +[3] March +[4] April +[5] May +[6] June +[0] In after June +``` + +## Placeholders + +[`hideEchoBack`, `mask`, `defaultInput`, `caseSensitive`, `keepWhitespace`, `encoding`, `bufferSize`, `history`, `cd`, `limit`, `trueValue`, `falseValue`](#placeholders-parameters-hideechoback_mask_defaultinput_casesensitive_keepwhitespace_encoding_buffersize_history_cd_limit_truevalue_falsevalue), [`limitCount`, `limitCountNotZero`](#placeholders-parameters-limitcount_limitcountnotzero), [`lastInput`](#placeholders-parameters-lastinput), [`history_mN`](#placeholders-parameters-historymn), [`cwd`, `CWD`, `cwdHome`](#placeholders-parameters-cwd_cwd_cwdhome), [`date`, `time`, `localeDate`, `localeTime`](#placeholders-parameters-date_time_localedate_localetime), [`C1-C2`](#placeholders-parameters-c1_c2) + +The placeholders in the text are replaced to another string. + +For example, the [`limitMessage`](#basic_options-limitmessage) option to display a warning message that means that the command the user requested is not available: + +```js +command = readlineSync.prompt({ + limit: ['add', 'remove'], + limitMessage: '$ is not available.' +}); +``` + +```console +> delete +delete is not available. +``` + +The placeholders can be included in: + +* `query` argument +* [`prompt`](#basic_options-prompt) and [`limitMessage`](#basic_options-limitmessage) options +* [`limit` option for `keyIn*` method](#basic_options-limit-for_keyin_method) and [`charlist`](#utility_methods-questionnewpassword-options-charlist) option for [`questionNewPassword`](#utility_methods-questionnewpassword) method ([`C1-C2`](#placeholders-parameters-c1_c2) parameter only) +* And some additional options for the [Utility Methods](#utility_methods). + +### Syntax + +``` +$ +``` + +Or + +``` +$<(text1)parameter(text2)> +``` + +The placeholder is replaced to a string that is got by a `parameter`. +Both the `(text1)` and `(text2)` are optional. +A more added `'$'` at the left of the placeholder is used as an escape character, it disables a placeholder. For example, `'$$'` is replaced to `'$'`. If you want to put a `'$'` which is *not* an escape character at the left of a placeholder, specify it like `'$<($)bufferSize>'`, then it is replaced to `'$1024'`. + +At the each position of `'(text1)'` and `'(text2)'`, `'text1'` and `'text2'` are put when a string that was got by a `parameter` has more than 0 length. If that got string is `''`, a placeholder with or without `'(text1)'` and `'(text2)'` is replaced to `''`. + +For example, a warning message that means that the command the user requested is not available: + +```js +command = readlineSync.prompt({ + limit: ['add', 'remove'], + limitMessage: 'Refused $ you requested. Please input another.' +}); +``` + +```console +> give-me-car +Refused give-me-car you requested. Please input another. +``` + +It looks like no problem. +But when the user input nothing (hit only the Enter key), and then a message is displayed: + +```console +> +Refused you requested. Please input another. +``` + +This goes well: + +```js +command = readlineSync.prompt({ + limit: ['add', 'remove'], + limitMessage: 'Refused $. Please input another.' +}); +``` + +```console +> +Refused . Please input another. +``` + +(May be more better: `'$<(Refused )lastInput( you requested. )>Please input another.'`) + +**Note:** The syntax `${parameter}` of older version is still supported, but this should not be used because it may be confused with template string syntax of ES6. And this will not be supported in due course of time. + +### Parameters + +The following parameters are available. And some additional parameters are available in the [Utility Methods](#utility_methods). + +#### `hideEchoBack`, `mask`, `defaultInput`, `caseSensitive`, `keepWhitespace`, `encoding`, `bufferSize`, `history`, `cd`, `limit`, `trueValue`, `falseValue` + +A current value of each option. +It is converted to human readable if possible. The boolean value is replaced to `'on'` or `'off'`, and the Array is replaced to the list of only string and number elements. +And in the `keyIn*` method, the parts of the list as characters sequence are suppressed. For example, when `['a', 'b', 'c', 'd', 'e']` is specified to the [`limit`](#basic_options-limit) option, `'$'` is replaced to `'a...e'`. If `true` is specified to the [`caseSensitive`](#basic_options-casesensitive) option, the characters are converted to lower case. + +For example: + +```js +input = readlineSync.question( + 'Input something or the Enter key as "$": ', + {defaultInput: 'hello'} +); +``` + +```console +Input something or the Enter key as "hello": +``` + +#### `limitCount`, `limitCountNotZero` + +A length of a current value of the [`limit`](#basic_options-limit) option. +When the value of the [`limit`](#basic_options-limit) option is empty, `'$'` is replaced to `'0'`, `'$'` is replaced to `''`. + +For example: + +```js +action = readlineSync.question( + 'Choose action$<( from )limitCountNotZero( actions)>: ', + {limit: availableActions} +); +``` + +```console +Choose action from 5 actions: +``` + +#### `lastInput` + +A last input from the user. +In any case, this is saved. + +For example: + +```js +command = readlineSync.prompt({ + limit: availableCommands, + limitMessage: '$ is not available.' +}); +``` + +```console +> wrong-command +wrong-command is not available. +``` + +#### `history_mN` + +When the history expansion feature is enabled (see [`history`](#basic_options-history) option), a current command line minus `N`. +*This feature keeps the previous input only.* That is, only `history_m1` is supported. + +For example: + +```js +while (true) { + input = readlineSync.question('Something$<( or "!!" as ")history_m1(")>: '); + console.log('-- You said "' + input + '"'); +} +``` + +```console +Something: hello +-- You said "hello" +Something or "!!" as "hello": !! +hello +-- You said "hello" +``` + +#### `cwd`, `CWD`, `cwdHome` + +A current working directory. + +* `cwd`: A full-path +* `CWD`: A directory name +* `cwdHome`: A path that includes `~` as the home directory + +For example, like bash/zsh: + +```js +command = readlineSync.prompt({prompt: '[$]$ '}); +``` + +```console +[~/foo/bar]$ +``` + +#### `date`, `time`, `localeDate`, `localeTime` + +A string as current date or time. + +* `date`: A date portion +* `time`: A time portion +* `localeDate`: A locality sensitive representation of the date portion based on system settings +* `localeTime`: A locality sensitive representation of the time portion based on system settings + +For example: + +```js +command = readlineSync.prompt({prompt: '[$]> '}); +``` + +```console +[04/21/2015]> +``` + +#### `C1-C2` + +_For [`limit` option for `keyIn*` method](#basic_options-limit-for_keyin_method) and [`charlist`](#utility_methods-questionnewpassword-options-charlist) option for [`questionNewPassword`](#utility_methods-questionnewpassword) method only_ + +A character list. +`C1` and `C2` are each single character as the start and the end. A sequence in ascending or descending order of characters ranging from `C1` to `C2` is created. For example, `'$'` is replaced to `'abcde'`. `'$<5-1>'` is replaced to `'54321'`. + +For example, let the user input a password that is created with alphabet: + +```js +password = readlineSync.questionNewPassword('PASSWORD: ', {charlist: '$'}); +``` + +See also [`limit` option for `keyIn*` method](#basic_options-limit-for_keyin_method). + +## Special method `getRawInput` + +```js +rawInput = readlineSync.getRawInput() +``` + +Return a raw input data of last method. +When the input was terminated with no data, a `NULL` is inserted to the data. + +This might contain control-codes (e.g. `LF`, `CR`, `EOF`, etc.), therefore, it might be used to get `^D` that was input. But you should understand each environments for that. Or, **you should not use this** if your script is used in multiple environments. +For example, when the user input `EOF` (`^D` in Unix like system, `^Z` in Windows), `x1A` (`EOF`) is returned in Windows, and `x00` (`NULL`) is returned in Unix like system. And `x04` (`EOT`) is returned in Unix like system with raw-mode. And also, when [external program](#note-reading_by_external_program) is used, nothing is returned. See also [Control characters](#note-control_characters). +You may examine each environment and you must test your script very much, if you want to handle the raw input data. + +## With Task Runner + +The easy way to control a flow of the task runner by the input from the user: + +* [Grunt](http://gruntjs.com/) plugin: [grunt-confirm](https://github.com/anseki/grunt-confirm) +* [gulp](http://gulpjs.com/) plugin: [gulp-confirm](https://github.com/anseki/gulp-confirm) + +If you want to control a flow of the task runner (e.g. [Grunt](http://gruntjs.com/)), call readlineSync in a task callback that is called by the task runner. Then a flow of tasks is paused and it is controlled by the user. + +For example, by using [grunt-task-helper](https://github.com/anseki/grunt-task-helper): + +```console +$ grunt +Running "fileCopy" task +Files already exist: + file-a.png + file-b.js +Overwrite? [y/n]: y +file-a.png copied. +file-b.js copied. +Done. +``` + +`Gruntfile.js` + +```js +grunt.initConfig({ + taskHelper: { + fileCopy: { + options: { + handlerByTask: function() { + // Abort the task if user don't want it. + return readlineSync.keyInYN('Overwrite?'); + }, + filesArray: [] + }, + ... + } + }, + copy: { + fileCopy: { + files: '<%= taskHelper.fileCopy.options.filesArray %>' + } + } +}); +``` + +## Note + +### Platforms + +TTY interfaces are different by the platforms. If the platform doesn't support the interactively reading from TTY, an error is thrown. + +```js +try { + answer = readlineSync.question('What is your favorite food? '); +} catch (e) { + console.error(e); + process.exit(1); +} +``` + +### Control characters + +TTY interfaces are different by the platforms. In some environments, ANSI escape sequences might be ignored. For example, in non-POSIX TTY such as Windows CMD does not support it (that of Windows 8 especially has problems). Since readlineSync does not use Node.js library that emulates POSIX TTY (but that is still incomplete), those characters may be not parsed. Then, using ANSI escape sequences is not recommended if you will support more environments. +Also, control characters user input might be not accepted or parsed. That behavior differs depending on the environment. And current Node.js does not support controlling a readline system library. + +### Reading by external program + +readlineSync tries to read from a console by using the external program if it is needed (e.g. when the input stream is redirected on Windows XP). And if the running Node.js doesn't support the [Synchronous Process Execution](http://nodejs.org/api/child_process.html#child_process_synchronous_process_creation) (i.e. Node.js v0.10-), readlineSync uses "piping via files" for the synchronous execution. +As everyone knows, "piping via files" is no good. It blocks the event loop and a process. It might make the your script be slow. + +Why did I choose it? : + +* Good modules (native addon) for the synchronous execution exist, but node-gyp can't compile those in some platforms or Node.js versions. +* I think that the security is important more than the speed. Some modules have problem about security. Those don't protect the data. I think that the speed is not needed usually, because readlineSync is used while user types keys. + +## Deprecated methods and options + +See [README-Deprecated.md](README-Deprecated.md). diff --git a/src/node_modules/readline-sync/lib/encrypt.js b/src/node_modules/readline-sync/lib/encrypt.js new file mode 100644 index 0000000..d732ce6 --- /dev/null +++ b/src/node_modules/readline-sync/lib/encrypt.js @@ -0,0 +1,24 @@ +/* + * readlineSync + * https://github.com/anseki/readline-sync + * + * Copyright (c) 2019 anseki + * Licensed under the MIT license. + */ + +var cipher = require('crypto').createCipher( + process.argv[2] /*algorithm*/, process.argv[3] /*password*/), + stdin = process.stdin, + stdout = process.stdout, + crypted = ''; + +stdin.resume(); +stdin.setEncoding('utf8'); +stdin.on('data', function(d) { + crypted += cipher.update(d, 'utf8', 'hex'); +}); +stdin.on('end', function() { + stdout.write(crypted + cipher.final('hex'), 'binary', function() { + process.exit(0); + }); +}); diff --git a/src/node_modules/readline-sync/lib/read.cs.js b/src/node_modules/readline-sync/lib/read.cs.js new file mode 100644 index 0000000..a789c22 --- /dev/null +++ b/src/node_modules/readline-sync/lib/read.cs.js @@ -0,0 +1,123 @@ +/* jshint wsh:true */ + +/* + * readlineSync + * https://github.com/anseki/readline-sync + * + * Copyright (c) 2019 anseki + * Licensed under the MIT license. + */ + +var + FSO_ForReading = 1, FSO_ForWriting = 2, + PS_MSG = 'Microsoft Windows PowerShell is required.' + + ' https://technet.microsoft.com/en-us/library/hh847837.aspx', + + input = '', fso, tty, + options = (function(conf) { + var options = {}, arg, args =// Array.prototype.slice.call(WScript.Arguments), + (function() { + var args = [], i, iLen; + for (i = 0, iLen = WScript.Arguments.length; i < iLen; i++) + { args.push(WScript.Arguments(i)); } + return args; + })(), + confLc = {}, key; + + function decodeArg(arg) { + return arg.replace(/#(\d+);/g, function(str, charCode) { + return String.fromCharCode(+charCode); + }); + } + + for (key in conf) { + if (conf.hasOwnProperty(key)) + { confLc[key.toLowerCase()] = {key: key, type: conf[key]}; } + } + + while (typeof(arg = args.shift()) === 'string') { + if (!(arg = (arg.match(/^\-+(.+)$/) || [])[1])) { continue; } + arg = arg.toLowerCase(); + if (confLc[arg]) { + options[confLc[arg].key] = + confLc[arg].type === 'boolean' ? true : + confLc[arg].type === 'string' ? args.shift() : null; + } + } + for (key in conf) { + if (conf.hasOwnProperty(key) && conf[key] === 'string') { + if (typeof options[key] !== 'string') { options[key] = ''; } + else { options[key] = decodeArg(options[key]); } + } + } + return options; + })({ + display: 'string', + displayOnly: 'boolean', + keyIn: 'boolean', + hideEchoBack: 'boolean', + mask: 'string' + }); + +if (!options.hideEchoBack && !options.keyIn) { + if (options.display) { writeTTY(options.display); } + if (!options.displayOnly) { input = readByFSO(); } +} else if (options.hideEchoBack && !options.keyIn && !options.mask) { + if (options.display) { writeTTY(options.display); } + if (!options.displayOnly) { input = readByPW(); } +} else { + WScript.StdErr.WriteLine(PS_MSG); + WScript.Quit(1); +} + +WScript.StdOut.Write('\'' + input + '\''); + +WScript.Quit(); + +function writeTTY(text) { + try { + tty = tty || getFso().OpenTextFile('CONOUT$', FSO_ForWriting, true); + tty.Write(text); + } catch (e) { + WScript.StdErr.WriteLine('TTY Write Error: ' + e.number + + '\n' + e.description + '\n' + PS_MSG); + WScript.Quit(e.number || 1); + } +} + +function readByFSO() { + var text; + try { + text = getFso().OpenTextFile('CONIN$', FSO_ForReading).ReadLine(); + } catch (e) { + WScript.StdErr.WriteLine('TTY Read Error: ' + e.number + + '\n' + e.description + '\n' + PS_MSG); + WScript.Quit(e.number || 1); + } + return text; +} + +// TTY must be STDIN that is not redirected and not piped. +function readByPW() { + var text; + try { + text = WScript.CreateObject('ScriptPW.Password').GetPassword() + // Bug? Illegal data may be returned when user types before initializing. + .replace(/[\u4000-\u40FF]/g, function(chr) { + var charCode = chr.charCodeAt(0); + return charCode >= 0x4020 && charCode <= 0x407F ? + String.fromCharCode(charCode - 0x4000) : ''; + }); + } catch (e) { + WScript.StdErr.WriteLine('ScriptPW.Password Error: ' + e.number + + '\n' + e.description + '\n' + PS_MSG); + WScript.Quit(e.number || 1); + } + writeTTY('\n'); + return text; +} + +function getFso() { + if (!fso) { fso = new ActiveXObject('Scripting.FileSystemObject'); } + return fso; +} diff --git a/src/node_modules/readline-sync/lib/read.ps1 b/src/node_modules/readline-sync/lib/read.ps1 new file mode 100644 index 0000000..096cdd1 --- /dev/null +++ b/src/node_modules/readline-sync/lib/read.ps1 @@ -0,0 +1,128 @@ +# readlineSync +# https://github.com/anseki/readline-sync +# +# Copyright (c) 2019 anseki +# Licensed under the MIT license. + +Param( + [string] $display, + [switch] $displayOnly, + [switch] $keyIn, + [switch] $hideEchoBack, + [string] $mask, + [string] $limit, + [switch] $caseSensitive +) + +$ErrorActionPreference = 'Stop' # for cmdlet +trap { + # `throw $_` and `Write-Error $_` return exit-code 0 + $Host.UI.WriteErrorLine($_) + exit 1 +} + +function decodeArg ($arg) { + [Regex]::Replace($arg, '#(\d+);', { [char][int] $args[0].Groups[1].Value }) +} + +$options = @{} +foreach ($arg in @('display', 'displayOnly', 'keyIn', 'hideEchoBack', 'mask', 'limit', 'caseSensitive')) { + $options.Add($arg, (Get-Variable $arg -ValueOnly)) +} +$argList = New-Object string[] $options.Keys.Count +$options.Keys.CopyTo($argList, 0) +foreach ($arg in $argList) { + if ($options[$arg] -is [string] -and $options[$arg]) + { $options[$arg] = decodeArg $options[$arg] } +} + +[string] $inputTTY = '' +[bool] $silent = -not $options.display -and + $options.keyIn -and $options.hideEchoBack -and -not $options.mask +[bool] $isCooked = -not $options.hideEchoBack -and -not $options.keyIn + +# Instant method that opens TTY without CreateFile via P/Invoke in .NET Framework +# **NOTE** Don't include special characters of DOS in $command when $getRes is True. +# [string] $cmdPath = $Env:ComSpec +# [string] $psPath = 'powershell.exe' +function execWithTTY ($command, $getRes = $False, $throwError = $False) { + if ($getRes) { + $res = (cmd.exe /C "CON powershell.exe -Command -" + if ($LastExitCode -ne 0) { + if ($throwError) { throw $LastExitCode } + else { exit $LastExitCode } + } + } +} + +function writeTTY ($text) { + execWithTTY ('Write-Host (''' + + (($text -replace '''', '''''') -replace '[\r\n]', '''+"`n"+''') + ''') -NoNewline') +} + +if ($options.display) { + writeTTY $options.display +} +if ($options.displayOnly) { return "''" } + +if (-not $options.keyIn -and $options.hideEchoBack -and $options.mask -eq '*') { + # It fails when it's not ready. + try { + $inputTTY = execWithTTY ('$text = Read-Host -AsSecureString;' + + '$bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($text);' + + '[Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)') $True $True + return '''' + $inputTTY + '''' + } catch {} # ignore +} + +if ($options.keyIn) { $reqSize = 1 } + +if ($options.keyIn -and $options.limit) { + $limitPtn = '[^' + $options.limit + ']' +} + +while ($True) { + if (-not $isCooked) { + $chunk = [char][int] (execWithTTY '[int] [Console]::ReadKey($True).KeyChar' $True) + } else { + $chunk = execWithTTY 'Read-Host' $True + $chunk += "`n" + } + + if ($chunk -and $chunk -match '^(.*?)[\r\n]') { + $chunk = $Matches[1] + $atEol = $True + } else { $atEol = $False } + + # other ctrl-chars + if ($chunk) { $chunk = $chunk -replace '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]', '' } + if ($chunk -and $limitPtn) { + if ($options.caseSensitive) { $chunk = $chunk -creplace $limitPtn, '' } + else { $chunk = $chunk -ireplace $limitPtn, '' } + } + + if ($chunk) { + if (-not $isCooked) { + if (-not $options.hideEchoBack) { + writeTTY $chunk + } elseif ($options.mask) { + writeTTY ($options.mask * $chunk.Length) + } + } + $inputTTY += $chunk + } + + if ((-not $options.keyIn -and $atEol) -or + ($options.keyIn -and $inputTTY.Length -ge $reqSize)) { break } +} + +if (-not $isCooked -and -not $silent) { execWithTTY 'Write-Host ''''' } # new line + +return "'$inputTTY'" diff --git a/src/node_modules/readline-sync/lib/read.sh b/src/node_modules/readline-sync/lib/read.sh new file mode 100644 index 0000000..b41e80c --- /dev/null +++ b/src/node_modules/readline-sync/lib/read.sh @@ -0,0 +1,137 @@ +# readlineSync +# https://github.com/anseki/readline-sync +# +# Copyright (c) 2019 anseki +# Licensed under the MIT license. + +# Use perl for compatibility of sed/awk of GNU / POSIX, BSD. (and tr) +# Hide "\n" from shell by "\fNL" + +decode_arg() { + printf '%s' "$(printf '%s' "$1" | perl -pe 's/#(\d+);/sprintf("%c", $1)/ge; s/[\r\n]/\fNL/g')" +} + +# getopt(s) +while [ $# -ge 1 ]; do + arg="$(printf '%s' "$1" | grep -E '^-+[^-]+$' | tr '[A-Z]' '[a-z]' | tr -d '-')" + case "$arg" in + 'display') shift; options_display="$(decode_arg "$1")";; + 'displayonly') options_displayOnly=true;; + 'keyin') options_keyIn=true;; + 'hideechoback') options_hideEchoBack=true;; + 'mask') shift; options_mask="$(decode_arg "$1")";; + 'limit') shift; options_limit="$(decode_arg "$1")";; + 'casesensitive') options_caseSensitive=true;; + esac + shift +done + +reset_tty() { + if [ -n "$save_tty" ]; then + stty --file=/dev/tty "$save_tty" 2>/dev/null || \ + stty -F /dev/tty "$save_tty" 2>/dev/null || \ + stty -f /dev/tty "$save_tty" || exit $? + fi +} +trap 'reset_tty' EXIT +save_tty="$(stty --file=/dev/tty -g 2>/dev/null || stty -F /dev/tty -g 2>/dev/null || stty -f /dev/tty -g || exit $?)" + +[ -z "$options_display" ] && [ "$options_keyIn" = true ] && \ + [ "$options_hideEchoBack" = true ] && [ -z "$options_mask" ] && silent=true +[ "$options_hideEchoBack" != true ] && [ "$options_keyIn" != true ] && is_cooked=true + +write_tty() { + # if [ "$2" = true ]; then + # printf '%b' "$1" >/dev/tty + # else + # printf '%s' "$1" >/dev/tty + # fi + printf '%s' "$1" | perl -pe 's/\fNL/\r\n/g' >/dev/tty +} + +replace_allchars() { ( + text='' + for i in $(seq 1 ${#1}) + do + text="$text$2" + done + printf '%s' "$text" +) } + +if [ -n "$options_display" ]; then + write_tty "$options_display" +fi +if [ "$options_displayOnly" = true ]; then + printf "'%s'" '' + exit 0 +fi + +if [ "$is_cooked" = true ]; then + stty --file=/dev/tty cooked 2>/dev/null || \ + stty -F /dev/tty cooked 2>/dev/null || \ + stty -f /dev/tty cooked || exit $? +else + stty --file=/dev/tty raw -echo 2>/dev/null || \ + stty -F /dev/tty raw -echo 2>/dev/null || \ + stty -f /dev/tty raw -echo || exit $? +fi + +[ "$options_keyIn" = true ] && req_size=1 + +if [ "$options_keyIn" = true ] && [ -n "$options_limit" ]; then + if [ "$options_caseSensitive" = true ]; then + limit_ptn="$options_limit" + else + # Safe list + # limit_ptn="$(printf '%s' "$options_limit" | sed 's/\([a-z]\)/\L\1\U\1/ig')" + limit_ptn="$(printf '%s' "$options_limit" | perl -pe 's/([a-z])/lc($1) . uc($1)/ige')" + fi +fi + +while : +do + if [ "$is_cooked" != true ]; then + # chunk="$(dd if=/dev/tty bs=1 count=1 2>/dev/null)" + chunk="$(dd if=/dev/tty bs=1 count=1 2>/dev/null | perl -pe 's/[\r\n]/\fNL/g')" + else + IFS= read -r chunk ', + hideEchoBack: false, + mask: '*', + limit: [], + limitMessage: 'Input another, please.$<( [)limit(])>', + defaultInput: '', + trueValue: [], + falseValue: [], + caseSensitive: false, + keepWhitespace: false, + encoding: 'utf8', + bufferSize: 1024, + print: void 0, + history: true, + cd: false, + phContent: void 0, + preCheck: void 0 + /* eslint-enable key-spacing */ + }, + + fdR = 'none', + isRawMode = false, + salt = 0, + lastInput = '', + inputHistory = [], + _DBG_useExt = false, + _DBG_checkOptions = false, + _DBG_checkMethod = false, + fdW, ttyR, extHostPath, extHostArgs, tempdir, rawInput; + +function getHostArgs(options) { + // Send any text to crazy Windows shell safely. + function encodeArg(arg) { + return arg.replace(/[^\w\u0080-\uFFFF]/g, function(chr) { + return '#' + chr.charCodeAt(0) + ';'; + }); + } + + return extHostArgs.concat((function(conf) { + var args = []; + Object.keys(conf).forEach(function(optionName) { + if (conf[optionName] === 'boolean') { + if (options[optionName]) { args.push('--' + optionName); } + } else if (conf[optionName] === 'string') { + if (options[optionName]) { + args.push('--' + optionName, encodeArg(options[optionName])); + } + } + }); + return args; + })({ + /* eslint-disable key-spacing */ + display: 'string', + displayOnly: 'boolean', + keyIn: 'boolean', + hideEchoBack: 'boolean', + mask: 'string', + limit: 'string', + caseSensitive: 'boolean' + /* eslint-enable key-spacing */ + })); +} + +// piping via files (for Node.js v0.10-) +function _execFileSync(options, execOptions) { + + function getTempfile(name) { + var suffix = '', + filepath, fd; + tempdir = tempdir || require('os').tmpdir(); + + while (true) { + filepath = pathUtil.join(tempdir, name + suffix); + try { + fd = fs.openSync(filepath, 'wx'); + } catch (e) { + if (e.code === 'EEXIST') { + suffix++; + continue; + } else { + throw e; + } + } + fs.closeSync(fd); + break; + } + return filepath; + } + + var res = {}, + pathStdout = getTempfile('readline-sync.stdout'), + pathStderr = getTempfile('readline-sync.stderr'), + pathExit = getTempfile('readline-sync.exit'), + pathDone = getTempfile('readline-sync.done'), + crypto = require('crypto'), + hostArgs, shellPath, shellArgs, exitCode, extMessage, shasum, decipher, password; + + shasum = crypto.createHash(ALGORITHM_HASH); + shasum.update('' + process.pid + (salt++) + Math.random()); + password = shasum.digest('hex'); + decipher = crypto.createDecipher(ALGORITHM_CIPHER, password); + + hostArgs = getHostArgs(options); + if (IS_WIN) { + shellPath = process.env.ComSpec || 'cmd.exe'; + process.env.Q = '"'; // The quote (") that isn't escaped. + // `()` for ignore space by echo + shellArgs = ['/V:ON', '/S', '/C', + '(%Q%' + shellPath + '%Q% /V:ON /S /C %Q%' + /* ESLint bug? */ // eslint-disable-line no-path-concat + '%Q%' + extHostPath + '%Q%' + + hostArgs.map(function(arg) { return ' %Q%' + arg + '%Q%'; }).join('') + + ' & (echo !ERRORLEVEL!)>%Q%' + pathExit + '%Q%%Q%) 2>%Q%' + pathStderr + '%Q%' + + ' |%Q%' + process.execPath + '%Q% %Q%' + __dirname + '\\encrypt.js%Q%' + + ' %Q%' + ALGORITHM_CIPHER + '%Q% %Q%' + password + '%Q%' + + ' >%Q%' + pathStdout + '%Q%' + + ' & (echo 1)>%Q%' + pathDone + '%Q%']; + } else { + shellPath = '/bin/sh'; + shellArgs = ['-c', + // Use `()`, not `{}` for `-c` (text param) + '("' + extHostPath + '"' + /* ESLint bug? */ // eslint-disable-line no-path-concat + hostArgs.map(function(arg) { return " '" + arg.replace(/'/g, "'\\''") + "'"; }).join('') + + '; echo $?>"' + pathExit + '") 2>"' + pathStderr + '"' + + ' |"' + process.execPath + '" "' + __dirname + '/encrypt.js"' + + ' "' + ALGORITHM_CIPHER + '" "' + password + '"' + + ' >"' + pathStdout + '"' + + '; echo 1 >"' + pathDone + '"']; + } + if (_DBG_checkMethod) { _DBG_checkMethod('_execFileSync', hostArgs); } + try { + childProc.spawn(shellPath, shellArgs, execOptions); + } catch (e) { + res.error = new Error(e.message); + res.error.method = '_execFileSync - spawn'; + res.error.program = shellPath; + res.error.args = shellArgs; + } + + while (fs.readFileSync(pathDone, {encoding: options.encoding}).trim() !== '1') {} // eslint-disable-line no-empty + if ((exitCode = + fs.readFileSync(pathExit, {encoding: options.encoding}).trim()) === '0') { + res.input = + decipher.update(fs.readFileSync(pathStdout, {encoding: 'binary'}), + 'hex', options.encoding) + + decipher.final(options.encoding); + } else { + extMessage = fs.readFileSync(pathStderr, {encoding: options.encoding}).trim(); + res.error = new Error(DEFAULT_ERR_MSG + (extMessage ? '\n' + extMessage : '')); + res.error.method = '_execFileSync'; + res.error.program = shellPath; + res.error.args = shellArgs; + res.error.extMessage = extMessage; + res.error.exitCode = +exitCode; + } + + fs.unlinkSync(pathStdout); + fs.unlinkSync(pathStderr); + fs.unlinkSync(pathExit); + fs.unlinkSync(pathDone); + + return res; +} + +function readlineExt(options) { + var res = {}, + execOptions = {env: process.env, encoding: options.encoding}, + hostArgs, extMessage; + + if (!extHostPath) { + if (IS_WIN) { + if (process.env.PSModulePath) { // Windows PowerShell + extHostPath = 'powershell.exe'; + extHostArgs = ['-ExecutionPolicy', 'Bypass', + '-File', __dirname + '\\read.ps1']; // eslint-disable-line no-path-concat + } else { // Windows Script Host + extHostPath = 'cscript.exe'; + extHostArgs = ['//nologo', __dirname + '\\read.cs.js']; // eslint-disable-line no-path-concat + } + } else { + extHostPath = '/bin/sh'; + extHostArgs = [__dirname + '/read.sh']; // eslint-disable-line no-path-concat + } + } + if (IS_WIN && !process.env.PSModulePath) { // Windows Script Host + // ScriptPW (Win XP and Server2003) needs TTY stream as STDIN. + // In this case, If STDIN isn't TTY, an error is thrown. + execOptions.stdio = [process.stdin]; + } + + if (childProc.execFileSync) { + hostArgs = getHostArgs(options); + if (_DBG_checkMethod) { _DBG_checkMethod('execFileSync', hostArgs); } + try { + res.input = childProc.execFileSync(extHostPath, hostArgs, execOptions); + } catch (e) { // non-zero exit code + extMessage = e.stderr ? (e.stderr + '').trim() : ''; + res.error = new Error(DEFAULT_ERR_MSG + (extMessage ? '\n' + extMessage : '')); + res.error.method = 'execFileSync'; + res.error.program = extHostPath; + res.error.args = hostArgs; + res.error.extMessage = extMessage; + res.error.exitCode = e.status; + res.error.code = e.code; + res.error.signal = e.signal; + } + } else { + res = _execFileSync(options, execOptions); + } + if (!res.error) { + res.input = res.input.replace(/^\s*'|'\s*$/g, ''); + options.display = ''; + } + + return res; +} + +/* + display: string + displayOnly: boolean + keyIn: boolean + hideEchoBack: boolean + mask: string + limit: string (pattern) + caseSensitive: boolean + keepWhitespace: boolean + encoding, bufferSize, print +*/ +function _readlineSync(options) { + var input = '', + displaySave = options.display, + silent = !options.display && options.keyIn && options.hideEchoBack && !options.mask; + + function tryExt() { + var res = readlineExt(options); + if (res.error) { throw res.error; } + return res.input; + } + + if (_DBG_checkOptions) { _DBG_checkOptions(options); } + + (function() { // open TTY + var fsB, constants, verNum; + + function getFsB() { + if (!fsB) { + fsB = process.binding('fs'); // For raw device path + constants = process.binding('constants'); + // for v6.3.0+ + constants = constants && constants.fs && typeof constants.fs.O_RDWR === 'number' + ? constants.fs : constants; + } + return fsB; + } + + if (typeof fdR !== 'string') { return; } + fdR = null; + + if (IS_WIN) { + // iojs-v2.3.2+ input stream can't read first line. (#18) + // ** Don't get process.stdin before check! ** + // Fixed v5.1.0 + // Fixed v4.2.4 + // It regressed again in v5.6.0, it is fixed in v6.2.0. + verNum = (function(ver) { // getVerNum + var nums = ver.replace(/^\D+/, '').split('.'); + var verNum = 0; + if ((nums[0] = +nums[0])) { verNum += nums[0] * 10000; } + if ((nums[1] = +nums[1])) { verNum += nums[1] * 100; } + if ((nums[2] = +nums[2])) { verNum += nums[2]; } + return verNum; + })(process.version); + if (!(verNum >= 20302 && verNum < 40204 || verNum >= 50000 && verNum < 50100 || verNum >= 50600 && verNum < 60200) && + process.stdin.isTTY) { + process.stdin.pause(); + fdR = process.stdin.fd; + ttyR = process.stdin._handle; + } else { + try { + // The stream by fs.openSync('\\\\.\\CON', 'r') can't switch to raw mode. + // 'CONIN$' might fail on XP, 2000, 7 (x86). + fdR = getFsB().open('CONIN$', constants.O_RDWR, parseInt('0666', 8)); + ttyR = new TTY(fdR, true); + } catch (e) { /* ignore */ } + } + + if (process.stdout.isTTY) { + fdW = process.stdout.fd; + } else { + try { + fdW = fs.openSync('\\\\.\\CON', 'w'); + } catch (e) { /* ignore */ } + if (typeof fdW !== 'number') { // Retry + try { + fdW = getFsB().open('CONOUT$', constants.O_RDWR, parseInt('0666', 8)); + } catch (e) { /* ignore */ } + } + } + + } else { + if (process.stdin.isTTY) { + process.stdin.pause(); + try { + fdR = fs.openSync('/dev/tty', 'r'); // device file, not process.stdin + ttyR = process.stdin._handle; + } catch (e) { /* ignore */ } + } else { + // Node.js v0.12 read() fails. + try { + fdR = fs.openSync('/dev/tty', 'r'); + ttyR = new TTY(fdR, false); + } catch (e) { /* ignore */ } + } + + if (process.stdout.isTTY) { + fdW = process.stdout.fd; + } else { + try { + fdW = fs.openSync('/dev/tty', 'w'); + } catch (e) { /* ignore */ } + } + } + })(); + + (function() { // try read + var isCooked = !options.hideEchoBack && !options.keyIn, + atEol, limit, buffer, reqSize, readSize, chunk, line; + rawInput = ''; + + // Node.js v0.10- returns an error if same mode is set. + function setRawMode(mode) { + if (mode === isRawMode) { return true; } + if (ttyR.setRawMode(mode) !== 0) { return false; } + isRawMode = mode; + return true; + } + + if (_DBG_useExt || !ttyR || + typeof fdW !== 'number' && (options.display || !isCooked)) { + input = tryExt(); + return; + } + + if (options.display) { + fs.writeSync(fdW, options.display); + options.display = ''; + } + if (options.displayOnly) { return; } + + if (!setRawMode(!isCooked)) { + input = tryExt(); + return; + } + + reqSize = options.keyIn ? 1 : options.bufferSize; + // Check `allocUnsafe` to make sure of the new API. + buffer = Buffer.allocUnsafe && Buffer.alloc ? Buffer.alloc(reqSize) : new Buffer(reqSize); + + if (options.keyIn && options.limit) { + limit = new RegExp('[^' + options.limit + ']', + 'g' + (options.caseSensitive ? '' : 'i')); + } + + while (true) { + readSize = 0; + try { + readSize = fs.readSync(fdR, buffer, 0, reqSize); + } catch (e) { + if (e.code !== 'EOF') { + setRawMode(false); + input += tryExt(); + return; + } + } + if (readSize > 0) { + chunk = buffer.toString(options.encoding, 0, readSize); + rawInput += chunk; + } else { + chunk = '\n'; + rawInput += String.fromCharCode(0); + } + + if (chunk && typeof (line = (chunk.match(/^(.*?)[\r\n]/) || [])[1]) === 'string') { + chunk = line; + atEol = true; + } + + // other ctrl-chars + // eslint-disable-next-line no-control-regex + if (chunk) { chunk = chunk.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, ''); } + if (chunk && limit) { chunk = chunk.replace(limit, ''); } + + if (chunk) { + if (!isCooked) { + if (!options.hideEchoBack) { + fs.writeSync(fdW, chunk); + } else if (options.mask) { + fs.writeSync(fdW, (new Array(chunk.length + 1)).join(options.mask)); + } + } + input += chunk; + } + + if (!options.keyIn && atEol || + options.keyIn && input.length >= reqSize) { break; } + } + + if (!isCooked && !silent) { fs.writeSync(fdW, '\n'); } + setRawMode(false); + })(); + + if (options.print && !silent) { + options.print( + displaySave + ( + options.displayOnly ? '' : ( + options.hideEchoBack ? (new Array(input.length + 1)).join(options.mask) : input + ) + '\n' // must at least write '\n' + ), + options.encoding); + } + + return options.displayOnly ? '' : + (lastInput = options.keepWhitespace || options.keyIn ? input : input.trim()); +} + +function flattenArray(array, validator) { + var flatArray = []; + function _flattenArray(array) { + if (array == null) { return; } + if (Array.isArray(array)) { + array.forEach(_flattenArray); + } else if (!validator || validator(array)) { + flatArray.push(array); + } + } + _flattenArray(array); + return flatArray; +} + +function escapePattern(pattern) { + return pattern.replace(/[\x00-\x7f]/g, // eslint-disable-line no-control-regex + function(s) { return '\\x' + ('00' + s.charCodeAt().toString(16)).substr(-2); }); +} + +// margeOptions(options1, options2 ... ) +// margeOptions(true, options1, options2 ... ) +// arg1=true : Start from defaultOptions and pick elements of that. +function margeOptions() { + var optionsList = Array.prototype.slice.call(arguments), + optionNames, fromDefault; + + if (optionsList.length && typeof optionsList[0] === 'boolean') { + fromDefault = optionsList.shift(); + if (fromDefault) { + optionNames = Object.keys(defaultOptions); + optionsList.unshift(defaultOptions); + } + } + + return optionsList.reduce(function(options, optionsPart) { + if (optionsPart == null) { return options; } + + // ======== DEPRECATED ======== + if (optionsPart.hasOwnProperty('noEchoBack') && + !optionsPart.hasOwnProperty('hideEchoBack')) { + optionsPart.hideEchoBack = optionsPart.noEchoBack; + delete optionsPart.noEchoBack; + } + if (optionsPart.hasOwnProperty('noTrim') && + !optionsPart.hasOwnProperty('keepWhitespace')) { + optionsPart.keepWhitespace = optionsPart.noTrim; + delete optionsPart.noTrim; + } + // ======== /DEPRECATED ======== + + if (!fromDefault) { optionNames = Object.keys(optionsPart); } + optionNames.forEach(function(optionName) { + var value; + if (!optionsPart.hasOwnProperty(optionName)) { return; } + value = optionsPart[optionName]; + /* eslint-disable no-multi-spaces */ + switch (optionName) { + // _readlineSync <- * * -> defaultOptions + // ================ string + case 'mask': // * * + case 'limitMessage': // * + case 'defaultInput': // * + case 'encoding': // * * + value = value != null ? value + '' : ''; + if (value && optionName !== 'limitMessage') { value = value.replace(/[\r\n]/g, ''); } + options[optionName] = value; + break; + // ================ number(int) + case 'bufferSize': // * * + if (!isNaN(value = parseInt(value, 10)) && typeof value === 'number') { + options[optionName] = value; // limited updating (number is needed) + } + break; + // ================ boolean + case 'displayOnly': // * + case 'keyIn': // * + case 'hideEchoBack': // * * + case 'caseSensitive': // * * + case 'keepWhitespace': // * * + case 'history': // * + case 'cd': // * + options[optionName] = !!value; + break; + // ================ array + case 'limit': // * * to string for readlineExt + case 'trueValue': // * + case 'falseValue': // * + options[optionName] = flattenArray(value, function(value) { + var type = typeof value; + return type === 'string' || type === 'number' || + type === 'function' || value instanceof RegExp; + }).map(function(value) { + return typeof value === 'string' ? value.replace(/[\r\n]/g, '') : value; + }); + break; + // ================ function + case 'print': // * * + case 'phContent': // * + case 'preCheck': // * + options[optionName] = typeof value === 'function' ? value : void 0; + break; + // ================ other + case 'prompt': // * + case 'display': // * + options[optionName] = value != null ? value : ''; + break; + // no default + } + /* eslint-enable no-multi-spaces */ + }); + return options; + }, {}); +} + +function isMatched(res, comps, caseSensitive) { + return comps.some(function(comp) { + var type = typeof comp; + return type === 'string' + ? (caseSensitive ? res === comp : res.toLowerCase() === comp.toLowerCase()) : + type === 'number' ? parseFloat(res) === comp : + type === 'function' ? comp(res) : + comp instanceof RegExp ? comp.test(res) : false; + }); +} + +function replaceHomePath(path, expand) { + var homePath = pathUtil.normalize( + IS_WIN ? (process.env.HOMEDRIVE || '') + (process.env.HOMEPATH || '') : + process.env.HOME || '').replace(/[/\\]+$/, ''); + path = pathUtil.normalize(path); + return expand ? path.replace(/^~(?=\/|\\|$)/, homePath) : + path.replace(new RegExp('^' + escapePattern(homePath) + + '(?=\\/|\\\\|$)', IS_WIN ? 'i' : ''), '~'); +} + +function replacePlaceholder(text, generator) { + var PTN_INNER = '(?:\\(([\\s\\S]*?)\\))?(\\w+|.-.)(?:\\(([\\s\\S]*?)\\))?', + rePlaceholder = new RegExp('(\\$)?(\\$<' + PTN_INNER + '>)', 'g'), + rePlaceholderCompat = new RegExp('(\\$)?(\\$\\{' + PTN_INNER + '\\})', 'g'); + + function getPlaceholderText(s, escape, placeholder, pre, param, post) { + var text; + return escape || typeof (text = generator(param)) !== 'string' ? placeholder : + text ? (pre || '') + text + (post || '') : ''; + } + + return text.replace(rePlaceholder, getPlaceholderText) + .replace(rePlaceholderCompat, getPlaceholderText); +} + +function array2charlist(array, caseSensitive, collectSymbols) { + var group = [], + groupClass = -1, + charCode = 0, + symbols = '', + values, suppressed; + function addGroup(groups, group) { + if (group.length > 3) { // ellipsis + groups.push(group[0] + '...' + group[group.length - 1]); + suppressed = true; + } else if (group.length) { + groups = groups.concat(group); + } + return groups; + } + + values = array.reduce(function(chars, value) { + return chars.concat((value + '').split('')); + }, []).reduce(function(groups, curChar) { + var curGroupClass, curCharCode; + if (!caseSensitive) { curChar = curChar.toLowerCase(); } + curGroupClass = /^\d$/.test(curChar) ? 1 : + /^[A-Z]$/.test(curChar) ? 2 : /^[a-z]$/.test(curChar) ? 3 : 0; + if (collectSymbols && curGroupClass === 0) { + symbols += curChar; + } else { + curCharCode = curChar.charCodeAt(0); + if (curGroupClass && curGroupClass === groupClass && + curCharCode === charCode + 1) { + group.push(curChar); + } else { + groups = addGroup(groups, group); + group = [curChar]; + groupClass = curGroupClass; + } + charCode = curCharCode; + } + return groups; + }, []); + values = addGroup(values, group); // last group + if (symbols) { values.push(symbols); suppressed = true; } + return {values: values, suppressed: suppressed}; +} + +function joinChunks(chunks, suppressed) { + return chunks.join(chunks.length > 2 ? ', ' : suppressed ? ' / ' : '/'); +} + +function getPhContent(param, options) { + var resCharlist = {}, + text, values, arg; + if (options.phContent) { + text = options.phContent(param, options); + } + if (typeof text !== 'string') { + switch (param) { + case 'hideEchoBack': + case 'mask': + case 'defaultInput': + case 'caseSensitive': + case 'keepWhitespace': + case 'encoding': + case 'bufferSize': + case 'history': + case 'cd': + text = !options.hasOwnProperty(param) ? '' : + typeof options[param] === 'boolean' ? (options[param] ? 'on' : 'off') : + options[param] + ''; + break; + // case 'prompt': + // case 'query': + // case 'display': + // text = options.hasOwnProperty('displaySrc') ? options.displaySrc + '' : ''; + // break; + case 'limit': + case 'trueValue': + case 'falseValue': + values = options[options.hasOwnProperty(param + 'Src') ? param + 'Src' : param]; + if (options.keyIn) { // suppress + resCharlist = array2charlist(values, options.caseSensitive); + values = resCharlist.values; + } else { + values = values.filter(function(value) { + var type = typeof value; + return type === 'string' || type === 'number'; + }); + } + text = joinChunks(values, resCharlist.suppressed); + break; + case 'limitCount': + case 'limitCountNotZero': + text = options[options.hasOwnProperty('limitSrc') ? 'limitSrc' : 'limit'].length; + text = text || param !== 'limitCountNotZero' ? text + '' : ''; + break; + case 'lastInput': + text = lastInput; + break; + case 'cwd': + case 'CWD': + case 'cwdHome': + text = process.cwd(); + if (param === 'CWD') { + text = pathUtil.basename(text); + } else if (param === 'cwdHome') { + text = replaceHomePath(text); + } + break; + case 'date': + case 'time': + case 'localeDate': + case 'localeTime': + text = (new Date())['to' + + param.replace(/^./, function(str) { return str.toUpperCase(); }) + + 'String'](); + break; + default: // with arg + if (typeof (arg = (param.match(/^history_m(\d+)$/) || [])[1]) === 'string') { + text = inputHistory[inputHistory.length - arg] || ''; + } + } + } + return text; +} + +function getPhCharlist(param) { + var matches = /^(.)-(.)$/.exec(param), + text = '', + from, to, code, step; + if (!matches) { return null; } + from = matches[1].charCodeAt(0); + to = matches[2].charCodeAt(0); + step = from < to ? 1 : -1; + for (code = from; code !== to + step; code += step) { text += String.fromCharCode(code); } + return text; +} + +// cmd "arg" " a r g " "" 'a"r"g' "a""rg" "arg +function parseCl(cl) { + var reToken = new RegExp(/(\s*)(?:("|')(.*?)(?:\2|$)|(\S+))/g), + taken = '', + args = [], + matches, part; + cl = cl.trim(); + while ((matches = reToken.exec(cl))) { + part = matches[3] || matches[4] || ''; + if (matches[1]) { + args.push(taken); + taken = ''; + } + taken += part; + } + if (taken) { args.push(taken); } + return args; +} + +function toBool(res, options) { + return ( + (options.trueValue.length && + isMatched(res, options.trueValue, options.caseSensitive)) ? true : + (options.falseValue.length && + isMatched(res, options.falseValue, options.caseSensitive)) ? false : res); +} + +function getValidLine(options) { + var res, forceNext, limitMessage, + matches, histInput, args, resCheck; + + function _getPhContent(param) { return getPhContent(param, options); } + function addDisplay(text) { options.display += (/[^\r\n]$/.test(options.display) ? '\n' : '') + text; } + + options.limitSrc = options.limit; + options.displaySrc = options.display; + options.limit = ''; // for readlineExt + options.display = replacePlaceholder(options.display + '', _getPhContent); + + while (true) { + res = _readlineSync(options); + forceNext = false; + limitMessage = ''; + + if (options.defaultInput && !res) { res = options.defaultInput; } + + if (options.history) { + if ((matches = /^\s*!(?:!|-1)(:p)?\s*$/.exec(res))) { // `!!` `!-1` +`:p` + histInput = inputHistory[0] || ''; + if (matches[1]) { // only display + forceNext = true; + } else { // replace input + res = histInput; + } + // Show it even if it is empty (NL only). + addDisplay(histInput + '\n'); + if (!forceNext) { // Loop may break + options.displayOnly = true; + _readlineSync(options); + options.displayOnly = false; + } + } else if (res && res !== inputHistory[inputHistory.length - 1]) { + inputHistory = [res]; + } + } + + if (!forceNext && options.cd && res) { + args = parseCl(res); + switch (args[0].toLowerCase()) { + case 'cd': + if (args[1]) { + try { + process.chdir(replaceHomePath(args[1], true)); + } catch (e) { + addDisplay(e + ''); + } + } + forceNext = true; + break; + case 'pwd': + addDisplay(process.cwd()); + forceNext = true; + break; + // no default + } + } + + if (!forceNext && options.preCheck) { + resCheck = options.preCheck(res, options); + res = resCheck.res; + if (resCheck.forceNext) { forceNext = true; } // Don't switch to false. + } + + if (!forceNext) { + if (!options.limitSrc.length || + isMatched(res, options.limitSrc, options.caseSensitive)) { break; } + if (options.limitMessage) { + limitMessage = replacePlaceholder(options.limitMessage, _getPhContent); + } + } + + addDisplay((limitMessage ? limitMessage + '\n' : '') + + replacePlaceholder(options.displaySrc + '', _getPhContent)); + } + return toBool(res, options); +} + +// for dev +exports._DBG_set_useExt = function(val) { _DBG_useExt = val; }; +exports._DBG_set_checkOptions = function(val) { _DBG_checkOptions = val; }; +exports._DBG_set_checkMethod = function(val) { _DBG_checkMethod = val; }; +exports._DBG_clearHistory = function() { lastInput = ''; inputHistory = []; }; + +// ------------------------------------ + +exports.setDefaultOptions = function(options) { + defaultOptions = margeOptions(true, options); + return margeOptions(true); // copy +}; + +exports.question = function(query, options) { + /* eslint-disable key-spacing */ + return getValidLine(margeOptions(margeOptions(true, options), { + display: query + })); + /* eslint-enable key-spacing */ +}; + +exports.prompt = function(options) { + var readOptions = margeOptions(true, options); + readOptions.display = readOptions.prompt; + return getValidLine(readOptions); +}; + +exports.keyIn = function(query, options) { + /* eslint-disable key-spacing */ + var readOptions = margeOptions(margeOptions(true, options), { + display: query, + keyIn: true, + keepWhitespace: true + }); + /* eslint-enable key-spacing */ + + // char list + readOptions.limitSrc = readOptions.limit.filter(function(value) { + var type = typeof value; + return type === 'string' || type === 'number'; + }).map(function(text) { + return replacePlaceholder(text + '', getPhCharlist); + }); + // pattern + readOptions.limit = escapePattern(readOptions.limitSrc.join('')); + + ['trueValue', 'falseValue'].forEach(function(optionName) { + readOptions[optionName] = readOptions[optionName].reduce(function(comps, comp) { + var type = typeof comp; + if (type === 'string' || type === 'number') { + comps = comps.concat((comp + '').split('')); + } else { comps.push(comp); } + return comps; + }, []); + }); + + readOptions.display = replacePlaceholder(readOptions.display + '', + function(param) { return getPhContent(param, readOptions); }); + + return toBool(_readlineSync(readOptions), readOptions); +}; + +// ------------------------------------ + +exports.questionEMail = function(query, options) { + if (query == null) { query = 'Input e-mail address: '; } + /* eslint-disable key-spacing */ + return exports.question(query, margeOptions({ + // -------- default + hideEchoBack: false, + // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address + limit: /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/, + limitMessage: 'Input valid e-mail address, please.', + trueValue: null, + falseValue: null + }, options, { + // -------- forced + keepWhitespace: false, + cd: false + })); + /* eslint-enable key-spacing */ +}; + +exports.questionNewPassword = function(query, options) { + /* eslint-disable key-spacing */ + var resCharlist, min, max, + readOptions = margeOptions({ + // -------- default + hideEchoBack: true, + mask: '*', + limitMessage: 'It can include: $\n' + + 'And the length must be: $', + trueValue: null, + falseValue: null, + caseSensitive: true + }, options, { + // -------- forced + history: false, + cd: false, + // limit (by charlist etc.), + phContent: function(param) { + return param === 'charlist' ? resCharlist.text : + param === 'length' ? min + '...' + max : null; + } + }), + // added: charlist, min, max, confirmMessage, unmatchMessage + charlist, confirmMessage, unmatchMessage, + limit, limitMessage, res1, res2; + /* eslint-enable key-spacing */ + options = options || {}; + + charlist = replacePlaceholder( + options.charlist ? options.charlist + '' : '$', getPhCharlist); + if (isNaN(min = parseInt(options.min, 10)) || typeof min !== 'number') { min = 12; } + if (isNaN(max = parseInt(options.max, 10)) || typeof max !== 'number') { max = 24; } + limit = new RegExp('^[' + escapePattern(charlist) + + ']{' + min + ',' + max + '}$'); + resCharlist = array2charlist([charlist], readOptions.caseSensitive, true); + resCharlist.text = joinChunks(resCharlist.values, resCharlist.suppressed); + + confirmMessage = options.confirmMessage != null ? options.confirmMessage : + 'Reinput a same one to confirm it: '; + unmatchMessage = options.unmatchMessage != null ? options.unmatchMessage : + 'It differs from first one.' + + ' Hit only the Enter key if you want to retry from first one.'; + + if (query == null) { query = 'Input new password: '; } + + limitMessage = readOptions.limitMessage; + while (!res2) { + readOptions.limit = limit; + readOptions.limitMessage = limitMessage; + res1 = exports.question(query, readOptions); + + readOptions.limit = [res1, '']; + readOptions.limitMessage = unmatchMessage; + res2 = exports.question(confirmMessage, readOptions); + } + + return res1; +}; + +function _questionNum(query, options, parser) { + var validValue; + function getValidValue(value) { + validValue = parser(value); + return !isNaN(validValue) && typeof validValue === 'number'; + } + /* eslint-disable key-spacing */ + exports.question(query, margeOptions({ + // -------- default + limitMessage: 'Input valid number, please.' + }, options, { + // -------- forced + limit: getValidValue, + cd: false + // trueValue, falseValue, caseSensitive, keepWhitespace don't work. + })); + /* eslint-enable key-spacing */ + return validValue; +} +exports.questionInt = function(query, options) { + return _questionNum(query, options, function(value) { return parseInt(value, 10); }); +}; +exports.questionFloat = function(query, options) { + return _questionNum(query, options, parseFloat); +}; + +exports.questionPath = function(query, options) { + /* eslint-disable key-spacing */ + var error = '', + validPath, // before readOptions + readOptions = margeOptions({ + // -------- default + hideEchoBack: false, + limitMessage: '$Input valid path, please.' + + '$<( Min:)min>$<( Max:)max>', + history: true, + cd: true + }, options, { + // -------- forced + keepWhitespace: false, + limit: function(value) { + var exists, stat, res; + value = replaceHomePath(value, true); + error = ''; // for validate + // mkdir -p + function mkdirParents(dirPath) { + dirPath.split(/\/|\\/).reduce(function(parents, dir) { + var path = pathUtil.resolve((parents += dir + pathUtil.sep)); + if (!fs.existsSync(path)) { + fs.mkdirSync(path); + } else if (!fs.statSync(path).isDirectory()) { + throw new Error('Non directory already exists: ' + path); + } + return parents; + }, ''); + } + + try { + exists = fs.existsSync(value); + validPath = exists ? fs.realpathSync(value) : pathUtil.resolve(value); + // options.exists default: true, not-bool: no-check + if (!options.hasOwnProperty('exists') && !exists || + typeof options.exists === 'boolean' && options.exists !== exists) { + error = (exists ? 'Already exists' : 'No such file or directory') + + ': ' + validPath; + return false; + } + if (!exists && options.create) { + if (options.isDirectory) { + mkdirParents(validPath); + } else { + mkdirParents(pathUtil.dirname(validPath)); + fs.closeSync(fs.openSync(validPath, 'w')); // touch + } + validPath = fs.realpathSync(validPath); + } + if (exists && (options.min || options.max || + options.isFile || options.isDirectory)) { + stat = fs.statSync(validPath); + // type check first (directory has zero size) + if (options.isFile && !stat.isFile()) { + error = 'Not file: ' + validPath; + return false; + } else if (options.isDirectory && !stat.isDirectory()) { + error = 'Not directory: ' + validPath; + return false; + } else if (options.min && stat.size < +options.min || + options.max && stat.size > +options.max) { + error = 'Size ' + stat.size + ' is out of range: ' + validPath; + return false; + } + } + if (typeof options.validate === 'function' && + (res = options.validate(validPath)) !== true) { + if (typeof res === 'string') { error = res; } + return false; + } + } catch (e) { + error = e + ''; + return false; + } + return true; + }, + // trueValue, falseValue, caseSensitive don't work. + phContent: function(param) { + return param === 'error' ? error : + param !== 'min' && param !== 'max' ? null : + options.hasOwnProperty(param) ? options[param] + '' : ''; + } + }); + // added: exists, create, min, max, isFile, isDirectory, validate + /* eslint-enable key-spacing */ + options = options || {}; + + if (query == null) { query = 'Input path (you can "cd" and "pwd"): '; } + + exports.question(query, readOptions); + return validPath; +}; + +// props: preCheck, args, hRes, limit +function getClHandler(commandHandler, options) { + var clHandler = {}, + hIndex = {}; + if (typeof commandHandler === 'object') { + Object.keys(commandHandler).forEach(function(cmd) { + if (typeof commandHandler[cmd] === 'function') { + hIndex[options.caseSensitive ? cmd : cmd.toLowerCase()] = commandHandler[cmd]; + } + }); + clHandler.preCheck = function(res) { + var cmdKey; + clHandler.args = parseCl(res); + cmdKey = clHandler.args[0] || ''; + if (!options.caseSensitive) { cmdKey = cmdKey.toLowerCase(); } + clHandler.hRes = + cmdKey !== '_' && hIndex.hasOwnProperty(cmdKey) + ? hIndex[cmdKey].apply(res, clHandler.args.slice(1)) : + hIndex.hasOwnProperty('_') ? hIndex._.apply(res, clHandler.args) : null; + return {res: res, forceNext: false}; + }; + if (!hIndex.hasOwnProperty('_')) { + clHandler.limit = function() { // It's called after preCheck. + var cmdKey = clHandler.args[0] || ''; + if (!options.caseSensitive) { cmdKey = cmdKey.toLowerCase(); } + return hIndex.hasOwnProperty(cmdKey); + }; + } + } else { + clHandler.preCheck = function(res) { + clHandler.args = parseCl(res); + clHandler.hRes = typeof commandHandler === 'function' + ? commandHandler.apply(res, clHandler.args) : true; // true for break loop + return {res: res, forceNext: false}; + }; + } + return clHandler; +} + +exports.promptCL = function(commandHandler, options) { + /* eslint-disable key-spacing */ + var readOptions = margeOptions({ + // -------- default + hideEchoBack: false, + limitMessage: 'Requested command is not available.', + caseSensitive: false, + history: true + }, options), + // -------- forced + // trueValue, falseValue, keepWhitespace don't work. + // preCheck, limit (by clHandler) + clHandler = getClHandler(commandHandler, readOptions); + /* eslint-enable key-spacing */ + readOptions.limit = clHandler.limit; + readOptions.preCheck = clHandler.preCheck; + exports.prompt(readOptions); + return clHandler.args; +}; + +exports.promptLoop = function(inputHandler, options) { + /* eslint-disable key-spacing */ + var readOptions = margeOptions({ + // -------- default + hideEchoBack: false, + trueValue: null, + falseValue: null, + caseSensitive: false, + history: true + }, options); + /* eslint-enable key-spacing */ + while (true) { if (inputHandler(exports.prompt(readOptions))) { break; } } + // return; // nothing is returned +}; + +exports.promptCLLoop = function(commandHandler, options) { + /* eslint-disable key-spacing */ + var readOptions = margeOptions({ + // -------- default + hideEchoBack: false, + limitMessage: 'Requested command is not available.', + caseSensitive: false, + history: true + }, options), + // -------- forced + // trueValue, falseValue, keepWhitespace don't work. + // preCheck, limit (by clHandler) + clHandler = getClHandler(commandHandler, readOptions); + /* eslint-enable key-spacing */ + readOptions.limit = clHandler.limit; + readOptions.preCheck = clHandler.preCheck; + while (true) { + exports.prompt(readOptions); + if (clHandler.hRes) { break; } + } + // return; // nothing is returned +}; + +exports.promptSimShell = function(options) { + /* eslint-disable key-spacing */ + return exports.prompt(margeOptions({ + // -------- default + hideEchoBack: false, + history: true + }, options, { + // -------- forced + prompt: (function() { + return IS_WIN ? '$>' : + // 'user@host:cwd$ ' + (process.env.USER || '') + + (process.env.HOSTNAME ? '@' + process.env.HOSTNAME.replace(/\..*$/, '') : '') + + ':$$ '; + })() + })); + /* eslint-enable key-spacing */ +}; + +function _keyInYN(query, options, limit) { + var res; + if (query == null) { query = 'Are you sure? '; } + if ((!options || options.guide !== false) && (query += '')) { + query = query.replace(/\s*:?\s*$/, '') + ' [y/n]: '; + } + /* eslint-disable key-spacing */ + res = exports.keyIn(query, margeOptions(options, { + // -------- forced + hideEchoBack: false, + limit: limit, + trueValue: 'y', + falseValue: 'n', + caseSensitive: false + // mask doesn't work. + })); + // added: guide + /* eslint-enable key-spacing */ + return typeof res === 'boolean' ? res : ''; +} +exports.keyInYN = function(query, options) { return _keyInYN(query, options); }; +exports.keyInYNStrict = function(query, options) { return _keyInYN(query, options, 'yn'); }; + +exports.keyInPause = function(query, options) { + if (query == null) { query = 'Continue...'; } + if ((!options || options.guide !== false) && (query += '')) { + query = query.replace(/\s+$/, '') + ' (Hit any key)'; + } + /* eslint-disable key-spacing */ + exports.keyIn(query, margeOptions({ + // -------- default + limit: null + }, options, { + // -------- forced + hideEchoBack: true, + mask: '' + })); + // added: guide + /* eslint-enable key-spacing */ + // return; // nothing is returned +}; + +exports.keyInSelect = function(items, query, options) { + /* eslint-disable key-spacing */ + var readOptions = margeOptions({ + // -------- default + hideEchoBack: false + }, options, { + // -------- forced + trueValue: null, + falseValue: null, + caseSensitive: false, + // limit (by items), + phContent: function(param) { + return param === 'itemsCount' ? items.length + '' : + param === 'firstItem' ? (items[0] + '').trim() : + param === 'lastItem' ? (items[items.length - 1] + '').trim() : null; + } + }), + // added: guide, cancel + keylist = '', + key2i = {}, + charCode = 49 /* '1' */, + display = '\n'; + /* eslint-enable key-spacing */ + if (!Array.isArray(items) || !items.length || items.length > 35) { + throw '`items` must be Array (max length: 35).'; + } + + items.forEach(function(item, i) { + var key = String.fromCharCode(charCode); + keylist += key; + key2i[key] = i; + display += '[' + key + '] ' + (item + '').trim() + '\n'; + charCode = charCode === 57 /* '9' */ ? 97 /* 'a' */ : charCode + 1; + }); + if (!options || options.cancel !== false) { + keylist += '0'; + key2i['0'] = -1; + display += '[0] ' + + (options && options.cancel != null && typeof options.cancel !== 'boolean' + ? (options.cancel + '').trim() : 'CANCEL') + '\n'; + } + readOptions.limit = keylist; + display += '\n'; + + if (query == null) { query = 'Choose one from list: '; } + if ((query += '')) { + if (!options || options.guide !== false) { + query = query.replace(/\s*:?\s*$/, '') + ' [$]: '; + } + display += query; + } + + return key2i[exports.keyIn(display, readOptions).toLowerCase()]; +}; + +exports.getRawInput = function() { return rawInput; }; + +// ======== DEPRECATED ======== +function _setOption(optionName, args) { + var options; + if (args.length) { options = {}; options[optionName] = args[0]; } + return exports.setDefaultOptions(options)[optionName]; +} +exports.setPrint = function() { return _setOption('print', arguments); }; +exports.setPrompt = function() { return _setOption('prompt', arguments); }; +exports.setEncoding = function() { return _setOption('encoding', arguments); }; +exports.setMask = function() { return _setOption('mask', arguments); }; +exports.setBufferSize = function() { return _setOption('bufferSize', arguments); }; diff --git a/src/node_modules/readline-sync/package.json b/src/node_modules/readline-sync/package.json new file mode 100644 index 0000000..c832e8e --- /dev/null +++ b/src/node_modules/readline-sync/package.json @@ -0,0 +1,40 @@ +{ + "name": "readline-sync", + "version": "1.4.10", + "title": "readlineSync", + "description": "Synchronous Readline for interactively running to have a conversation with the user via a console(TTY).", + "keywords": [ + "readline", + "synchronous", + "interactive", + "prompt", + "question", + "password", + "cli", + "tty", + "command", + "repl", + "keyboard", + "wait", + "block" + ], + "main": "./lib/readline-sync.js", + "files": [ + "lib/*.@(js|ps1|sh)", + "README-Deprecated.md" + ], + "engines": { + "node": ">= 0.8.0" + }, + "homepage": "https://github.com/anseki/readline-sync", + "repository": { + "type": "git", + "url": "git://github.com/anseki/readline-sync.git" + }, + "bugs": "https://github.com/anseki/readline-sync/issues", + "license": "MIT", + "author": { + "name": "anseki", + "url": "https://github.com/anseki" + } +} diff --git a/src/node_modules/underscore/LICENSE b/src/node_modules/underscore/LICENSE new file mode 100644 index 0000000..12a7f05 --- /dev/null +++ b/src/node_modules/underscore/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/node_modules/underscore/README.md b/src/node_modules/underscore/README.md new file mode 100644 index 0000000..9beae50 --- /dev/null +++ b/src/node_modules/underscore/README.md @@ -0,0 +1,34 @@ + __ + /\ \ __ + __ __ ___ \_\ \ __ _ __ ____ ___ ___ _ __ __ /\_\ ____ + /\ \/\ \ /' _ `\ /'_ \ /'__`\/\ __\/ ,__\ / ___\ / __`\/\ __\/'__`\ \/\ \ /',__\ + \ \ \_\ \/\ \/\ \/\ \ \ \/\ __/\ \ \//\__, `\/\ \__//\ \ \ \ \ \//\ __/ __ \ \ \/\__, `\ + \ \____/\ \_\ \_\ \___,_\ \____\\ \_\\/\____/\ \____\ \____/\ \_\\ \____\/\_\ _\ \ \/\____/ + \/___/ \/_/\/_/\/__,_ /\/____/ \/_/ \/___/ \/____/\/___/ \/_/ \/____/\/_//\ \_\ \/___/ + \ \____/ + \/___/ + +Underscore.js is a utility-belt library for JavaScript that provides +support for the usual functional suspects (each, map, reduce, filter...) +without extending any core JavaScript objects. + +For Docs, License, Tests, and pre-packed downloads, see: +https://underscorejs.org + +For support and questions, please consult +our [security policy](SECURITY.md), +[the gitter channel](https://gitter.im/jashkenas/underscore) +or [stackoverflow](https://stackoverflow.com/search?q=underscore.js) + +Underscore is an open-sourced component of DocumentCloud: +https://github.com/documentcloud + +Many thanks to our contributors: +https://github.com/jashkenas/underscore/contributors + +You can support the project by donating on +[Patreon](https://patreon.com/juliangonggrijp). +Enterprise coverage is available as part of the +[Tidelift Subscription](https://tidelift.com/subscription/pkg/npm-underscore?utm_source=npm-underscore&utm_medium=referral&utm_campaign=enterprise). + +This project adheres to a [code of conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. diff --git a/src/node_modules/underscore/amd/_baseCreate.js b/src/node_modules/underscore/amd/_baseCreate.js new file mode 100644 index 0000000..34ae6de --- /dev/null +++ b/src/node_modules/underscore/amd/_baseCreate.js @@ -0,0 +1,21 @@ +define(['./isObject', './_setup'], function (isObject, _setup) { + + // Create a naked function reference for surrogate-prototype-swapping. + function ctor() { + return function(){}; + } + + // An internal function for creating a new object that inherits from another. + function baseCreate(prototype) { + if (!isObject(prototype)) return {}; + if (_setup.nativeCreate) return _setup.nativeCreate(prototype); + var Ctor = ctor(); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + } + + return baseCreate; + +}); diff --git a/src/node_modules/underscore/amd/_baseIteratee.js b/src/node_modules/underscore/amd/_baseIteratee.js new file mode 100644 index 0000000..6579215 --- /dev/null +++ b/src/node_modules/underscore/amd/_baseIteratee.js @@ -0,0 +1,15 @@ +define(['./identity', './isFunction', './isObject', './isArray', './matcher', './property', './_optimizeCb'], function (identity, isFunction, isObject, isArray, matcher, property, _optimizeCb) { + + // An internal function to generate callbacks that can be applied to each + // element in a collection, returning the desired result — either `_.identity`, + // an arbitrary callback, a property matcher, or a property accessor. + function baseIteratee(value, context, argCount) { + if (value == null) return identity; + if (isFunction(value)) return _optimizeCb(value, context, argCount); + if (isObject(value) && !isArray(value)) return matcher(value); + return property(value); + } + + return baseIteratee; + +}); diff --git a/src/node_modules/underscore/amd/_cb.js b/src/node_modules/underscore/amd/_cb.js new file mode 100644 index 0000000..6544623 --- /dev/null +++ b/src/node_modules/underscore/amd/_cb.js @@ -0,0 +1,12 @@ +define(['./underscore', './_baseIteratee', './iteratee'], function (underscore, _baseIteratee, iteratee) { + + // The function we call internally to generate a callback. It invokes + // `_.iteratee` if overridden, otherwise `baseIteratee`. + function cb(value, context, argCount) { + if (underscore.iteratee !== iteratee) return underscore.iteratee(value, context); + return _baseIteratee(value, context, argCount); + } + + return cb; + +}); diff --git a/src/node_modules/underscore/amd/_chainResult.js b/src/node_modules/underscore/amd/_chainResult.js new file mode 100644 index 0000000..f9e3002 --- /dev/null +++ b/src/node_modules/underscore/amd/_chainResult.js @@ -0,0 +1,10 @@ +define(['./underscore'], function (underscore) { + + // Helper function to continue chaining intermediate results. + function chainResult(instance, obj) { + return instance._chain ? underscore(obj).chain() : obj; + } + + return chainResult; + +}); diff --git a/src/node_modules/underscore/amd/_collectNonEnumProps.js b/src/node_modules/underscore/amd/_collectNonEnumProps.js new file mode 100644 index 0000000..cb8af80 --- /dev/null +++ b/src/node_modules/underscore/amd/_collectNonEnumProps.js @@ -0,0 +1,42 @@ +define(['./_setup', './isFunction', './_has'], function (_setup, isFunction, _has) { + + // Internal helper to create a simple lookup structure. + // `collectNonEnumProps` used to depend on `_.contains`, but this led to + // circular imports. `emulatedSet` is a one-off solution that only works for + // arrays of strings. + function emulatedSet(keys) { + var hash = {}; + for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; + return { + contains: function(key) { return hash[key] === true; }, + push: function(key) { + hash[key] = true; + return keys.push(key); + } + }; + } + + // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't + // be iterated by `for key in ...` and thus missed. Extends `keys` in place if + // needed. + function collectNonEnumProps(obj, keys) { + keys = emulatedSet(keys); + var nonEnumIdx = _setup.nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (isFunction(constructor) && constructor.prototype) || _setup.ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (_has(obj, prop) && !keys.contains(prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = _setup.nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { + keys.push(prop); + } + } + } + + return collectNonEnumProps; + +}); diff --git a/src/node_modules/underscore/amd/_createAssigner.js b/src/node_modules/underscore/amd/_createAssigner.js new file mode 100644 index 0000000..deb5902 --- /dev/null +++ b/src/node_modules/underscore/amd/_createAssigner.js @@ -0,0 +1,24 @@ +define(function () { + + // An internal function for creating assigner functions. + function createAssigner(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + } + + return createAssigner; + +}); diff --git a/src/node_modules/underscore/amd/_createEscaper.js b/src/node_modules/underscore/amd/_createEscaper.js new file mode 100644 index 0000000..385ad84 --- /dev/null +++ b/src/node_modules/underscore/amd/_createEscaper.js @@ -0,0 +1,21 @@ +define(['./keys'], function (keys) { + + // Internal helper to generate functions for escaping and unescaping strings + // to/from HTML interpolation. + function createEscaper(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + } + + return createEscaper; + +}); diff --git a/src/node_modules/underscore/amd/_createIndexFinder.js b/src/node_modules/underscore/amd/_createIndexFinder.js new file mode 100644 index 0000000..400fb05 --- /dev/null +++ b/src/node_modules/underscore/amd/_createIndexFinder.js @@ -0,0 +1,30 @@ +define(['./_getLength', './_setup', './isNaN'], function (_getLength, _setup, _isNaN) { + + // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. + function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = _getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(_setup.slice.call(array, i, length), _isNaN); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + } + + return createIndexFinder; + +}); diff --git a/src/node_modules/underscore/amd/_createPredicateIndexFinder.js b/src/node_modules/underscore/amd/_createPredicateIndexFinder.js new file mode 100644 index 0000000..27635f2 --- /dev/null +++ b/src/node_modules/underscore/amd/_createPredicateIndexFinder.js @@ -0,0 +1,18 @@ +define(['./_cb', './_getLength'], function (_cb, _getLength) { + + // Internal function to generate `_.findIndex` and `_.findLastIndex`. + function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = _cb(predicate, context); + var length = _getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; + } + + return createPredicateIndexFinder; + +}); diff --git a/src/node_modules/underscore/amd/_createReduce.js b/src/node_modules/underscore/amd/_createReduce.js new file mode 100644 index 0000000..303a6d8 --- /dev/null +++ b/src/node_modules/underscore/amd/_createReduce.js @@ -0,0 +1,30 @@ +define(['./_isArrayLike', './keys', './_optimizeCb'], function (_isArrayLike, keys, _optimizeCb) { + + // Internal helper to create a reducing function, iterating left or right. + function createReduce(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var _keys = !_isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[_keys ? _keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = _keys ? _keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, _optimizeCb(iteratee, context, 4), memo, initial); + }; + } + + return createReduce; + +}); diff --git a/src/node_modules/underscore/amd/_createSizePropertyCheck.js b/src/node_modules/underscore/amd/_createSizePropertyCheck.js new file mode 100644 index 0000000..83ce2c4 --- /dev/null +++ b/src/node_modules/underscore/amd/_createSizePropertyCheck.js @@ -0,0 +1,13 @@ +define(['./_setup'], function (_setup) { + + // Common internal logic for `isArrayLike` and `isBufferLike`. + function createSizePropertyCheck(getSizeProperty) { + return function(collection) { + var sizeProperty = getSizeProperty(collection); + return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= _setup.MAX_ARRAY_INDEX; + } + } + + return createSizePropertyCheck; + +}); diff --git a/src/node_modules/underscore/amd/_deepGet.js b/src/node_modules/underscore/amd/_deepGet.js new file mode 100644 index 0000000..e075108 --- /dev/null +++ b/src/node_modules/underscore/amd/_deepGet.js @@ -0,0 +1,15 @@ +define(function () { + + // Internal function to obtain a nested property in `obj` along `path`. + function deepGet(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; + } + + return deepGet; + +}); diff --git a/src/node_modules/underscore/amd/_escapeMap.js b/src/node_modules/underscore/amd/_escapeMap.js new file mode 100644 index 0000000..584873e --- /dev/null +++ b/src/node_modules/underscore/amd/_escapeMap.js @@ -0,0 +1,15 @@ +define(function () { + + // Internal list of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + + return escapeMap; + +}); diff --git a/src/node_modules/underscore/amd/_executeBound.js b/src/node_modules/underscore/amd/_executeBound.js new file mode 100644 index 0000000..b3ac1cb --- /dev/null +++ b/src/node_modules/underscore/amd/_executeBound.js @@ -0,0 +1,16 @@ +define(['./_baseCreate', './isObject'], function (_baseCreate, isObject) { + + // Internal function to execute `sourceFunc` bound to `context` with optional + // `args`. Determines whether to execute a function as a constructor or as a + // normal function. + function executeBound(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = _baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (isObject(result)) return result; + return self; + } + + return executeBound; + +}); diff --git a/src/node_modules/underscore/amd/_flatten.js b/src/node_modules/underscore/amd/_flatten.js new file mode 100644 index 0000000..26ca34d --- /dev/null +++ b/src/node_modules/underscore/amd/_flatten.js @@ -0,0 +1,32 @@ +define(['./_getLength', './_isArrayLike', './isArray', './isArguments'], function (_getLength, _isArrayLike, isArray, isArguments) { + + // Internal implementation of a recursive `flatten` function. + function flatten(input, depth, strict, output) { + output = output || []; + if (!depth && depth !== 0) { + depth = Infinity; + } else if (depth <= 0) { + return output.concat(input); + } + var idx = output.length; + for (var i = 0, length = _getLength(input); i < length; i++) { + var value = input[i]; + if (_isArrayLike(value) && (isArray(value) || isArguments(value))) { + // Flatten current level of array or arguments object. + if (depth > 1) { + flatten(value, depth - 1, strict, output); + idx = output.length; + } else { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; + } + + return flatten; + +}); diff --git a/src/node_modules/underscore/amd/_getByteLength.js b/src/node_modules/underscore/amd/_getByteLength.js new file mode 100644 index 0000000..c6d9974 --- /dev/null +++ b/src/node_modules/underscore/amd/_getByteLength.js @@ -0,0 +1,8 @@ +define(['./_shallowProperty'], function (_shallowProperty) { + + // Internal helper to obtain the `byteLength` property of an object. + var getByteLength = _shallowProperty('byteLength'); + + return getByteLength; + +}); diff --git a/src/node_modules/underscore/amd/_getLength.js b/src/node_modules/underscore/amd/_getLength.js new file mode 100644 index 0000000..f889b98 --- /dev/null +++ b/src/node_modules/underscore/amd/_getLength.js @@ -0,0 +1,8 @@ +define(['./_shallowProperty'], function (_shallowProperty) { + + // Internal helper to obtain the `length` property of an object. + var getLength = _shallowProperty('length'); + + return getLength; + +}); diff --git a/src/node_modules/underscore/amd/_group.js b/src/node_modules/underscore/amd/_group.js new file mode 100644 index 0000000..d980552 --- /dev/null +++ b/src/node_modules/underscore/amd/_group.js @@ -0,0 +1,18 @@ +define(['./_cb', './each'], function (_cb, each) { + + // An internal function used for aggregate "group by" operations. + function group(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = _cb(iteratee, context); + each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; + } + + return group; + +}); diff --git a/src/node_modules/underscore/amd/_has.js b/src/node_modules/underscore/amd/_has.js new file mode 100644 index 0000000..983f060 --- /dev/null +++ b/src/node_modules/underscore/amd/_has.js @@ -0,0 +1,10 @@ +define(['./_setup'], function (_setup) { + + // Internal function to check whether `key` is an own property name of `obj`. + function has(obj, key) { + return obj != null && _setup.hasOwnProperty.call(obj, key); + } + + return has; + +}); diff --git a/src/node_modules/underscore/amd/_hasObjectTag.js b/src/node_modules/underscore/amd/_hasObjectTag.js new file mode 100644 index 0000000..bb9bee6 --- /dev/null +++ b/src/node_modules/underscore/amd/_hasObjectTag.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var hasObjectTag = _tagTester('Object'); + + return hasObjectTag; + +}); diff --git a/src/node_modules/underscore/amd/_isArrayLike.js b/src/node_modules/underscore/amd/_isArrayLike.js new file mode 100644 index 0000000..2137c4b --- /dev/null +++ b/src/node_modules/underscore/amd/_isArrayLike.js @@ -0,0 +1,11 @@ +define(['./_createSizePropertyCheck', './_getLength'], function (_createSizePropertyCheck, _getLength) { + + // Internal helper for collection methods to determine whether a collection + // should be iterated as an array or as an object. + // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var isArrayLike = _createSizePropertyCheck(_getLength); + + return isArrayLike; + +}); diff --git a/src/node_modules/underscore/amd/_isBufferLike.js b/src/node_modules/underscore/amd/_isBufferLike.js new file mode 100644 index 0000000..813641d --- /dev/null +++ b/src/node_modules/underscore/amd/_isBufferLike.js @@ -0,0 +1,9 @@ +define(['./_createSizePropertyCheck', './_getByteLength'], function (_createSizePropertyCheck, _getByteLength) { + + // Internal helper to determine whether we should spend extensive checks against + // `ArrayBuffer` et al. + var isBufferLike = _createSizePropertyCheck(_getByteLength); + + return isBufferLike; + +}); diff --git a/src/node_modules/underscore/amd/_keyInObj.js b/src/node_modules/underscore/amd/_keyInObj.js new file mode 100644 index 0000000..ba269d9 --- /dev/null +++ b/src/node_modules/underscore/amd/_keyInObj.js @@ -0,0 +1,11 @@ +define(function () { + + // Internal `_.pick` helper function to determine whether `key` is an enumerable + // property name of `obj`. + function keyInObj(value, key, obj) { + return key in obj; + } + + return keyInObj; + +}); diff --git a/src/node_modules/underscore/amd/_methodFingerprint.js b/src/node_modules/underscore/amd/_methodFingerprint.js new file mode 100644 index 0000000..c651f61 --- /dev/null +++ b/src/node_modules/underscore/amd/_methodFingerprint.js @@ -0,0 +1,44 @@ +define(['exports', './_getLength', './isFunction', './allKeys'], function (exports, _getLength, isFunction, allKeys) { + + // Since the regular `Object.prototype.toString` type tests don't work for + // some types in IE 11, we use a fingerprinting heuristic instead, based + // on the methods. It's not great, but it's the best we got. + // The fingerprint method lists are defined below. + function ie11fingerprint(methods) { + var length = _getLength(methods); + return function(obj) { + if (obj == null) return false; + // `Map`, `WeakMap` and `Set` have no enumerable keys. + var keys = allKeys(obj); + if (_getLength(keys)) return false; + for (var i = 0; i < length; i++) { + if (!isFunction(obj[methods[i]])) return false; + } + // If we are testing against `WeakMap`, we need to ensure that + // `obj` doesn't have a `forEach` method in order to distinguish + // it from a regular `Map`. + return methods !== weakMapMethods || !isFunction(obj[forEachName]); + }; + } + + // In the interest of compact minification, we write + // each string in the fingerprints only once. + var forEachName = 'forEach', + hasName = 'has', + commonInit = ['clear', 'delete'], + mapTail = ['get', hasName, 'set']; + + // `Map`, `WeakMap` and `Set` each have slightly different + // combinations of the above sublists. + var mapMethods = commonInit.concat(forEachName, mapTail), + weakMapMethods = commonInit.concat(mapTail), + setMethods = ['add'].concat(commonInit, forEachName, hasName); + + exports.ie11fingerprint = ie11fingerprint; + exports.mapMethods = mapMethods; + exports.setMethods = setMethods; + exports.weakMapMethods = weakMapMethods; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}); diff --git a/src/node_modules/underscore/amd/_optimizeCb.js b/src/node_modules/underscore/amd/_optimizeCb.js new file mode 100644 index 0000000..0ed8c68 --- /dev/null +++ b/src/node_modules/underscore/amd/_optimizeCb.js @@ -0,0 +1,27 @@ +define(function () { + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + function optimizeCb(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + } + + return optimizeCb; + +}); diff --git a/src/node_modules/underscore/amd/_setup.js b/src/node_modules/underscore/amd/_setup.js new file mode 100644 index 0000000..97581a7 --- /dev/null +++ b/src/node_modules/underscore/amd/_setup.js @@ -0,0 +1,70 @@ +define(['exports'], function (exports) { + + // Current version. + var VERSION = '1.13.4'; + + // Establish the root object, `window` (`self`) in the browser, `global` + // on the server, or `this` in some virtual machines. We use `self` + // instead of `window` for `WebWorker` support. + var root = (typeof self == 'object' && self.self === self && self) || + (typeof global == 'object' && global.global === global && global) || + Function('return this')() || + {}; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype; + var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + + // Create quick reference variables for speed access to core prototypes. + var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // Modern feature detection. + var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + + // All **ECMAScript 5+** native function implementations that we hope to use + // are declared here. + var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + + // Create references to these builtin functions because we override them. + var _isNaN = isNaN, + _isFinite = isFinite; + + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + // The largest integer that can be represented exactly. + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + + exports.ArrayProto = ArrayProto; + exports.MAX_ARRAY_INDEX = MAX_ARRAY_INDEX; + exports.ObjProto = ObjProto; + exports.SymbolProto = SymbolProto; + exports.VERSION = VERSION; + exports._isFinite = _isFinite; + exports._isNaN = _isNaN; + exports.hasEnumBug = hasEnumBug; + exports.hasOwnProperty = hasOwnProperty; + exports.nativeCreate = nativeCreate; + exports.nativeIsArray = nativeIsArray; + exports.nativeIsView = nativeIsView; + exports.nativeKeys = nativeKeys; + exports.nonEnumerableProps = nonEnumerableProps; + exports.push = push; + exports.root = root; + exports.slice = slice; + exports.supportsArrayBuffer = supportsArrayBuffer; + exports.supportsDataView = supportsDataView; + exports.toString = toString; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}); diff --git a/src/node_modules/underscore/amd/_shallowProperty.js b/src/node_modules/underscore/amd/_shallowProperty.js new file mode 100644 index 0000000..e0ca226 --- /dev/null +++ b/src/node_modules/underscore/amd/_shallowProperty.js @@ -0,0 +1,12 @@ +define(function () { + + // Internal helper to generate a function to obtain property `key` from `obj`. + function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + } + + return shallowProperty; + +}); diff --git a/src/node_modules/underscore/amd/_stringTagBug.js b/src/node_modules/underscore/amd/_stringTagBug.js new file mode 100644 index 0000000..c4ec5b1 --- /dev/null +++ b/src/node_modules/underscore/amd/_stringTagBug.js @@ -0,0 +1,16 @@ +define(['exports', './_setup', './_hasObjectTag'], function (exports, _setup, _hasObjectTag) { + + // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. + // In IE 11, the most common among them, this problem also applies to + // `Map`, `WeakMap` and `Set`. + var hasStringTagBug = ( + _setup.supportsDataView && _hasObjectTag(new DataView(new ArrayBuffer(8))) + ), + isIE11 = (typeof Map !== 'undefined' && _hasObjectTag(new Map)); + + exports.hasStringTagBug = hasStringTagBug; + exports.isIE11 = isIE11; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}); diff --git a/src/node_modules/underscore/amd/_tagTester.js b/src/node_modules/underscore/amd/_tagTester.js new file mode 100644 index 0000000..6b1f09e --- /dev/null +++ b/src/node_modules/underscore/amd/_tagTester.js @@ -0,0 +1,13 @@ +define(['./_setup'], function (_setup) { + + // Internal function for creating a `toString`-based type tester. + function tagTester(name) { + var tag = '[object ' + name + ']'; + return function(obj) { + return _setup.toString.call(obj) === tag; + }; + } + + return tagTester; + +}); diff --git a/src/node_modules/underscore/amd/_toBufferView.js b/src/node_modules/underscore/amd/_toBufferView.js new file mode 100644 index 0000000..e9464a3 --- /dev/null +++ b/src/node_modules/underscore/amd/_toBufferView.js @@ -0,0 +1,15 @@ +define(['./_getByteLength'], function (_getByteLength) { + + // Internal function to wrap or shallow-copy an ArrayBuffer, + // typed array or DataView to a new view, reusing the buffer. + function toBufferView(bufferSource) { + return new Uint8Array( + bufferSource.buffer || bufferSource, + bufferSource.byteOffset || 0, + _getByteLength(bufferSource) + ); + } + + return toBufferView; + +}); diff --git a/src/node_modules/underscore/amd/_toPath.js b/src/node_modules/underscore/amd/_toPath.js new file mode 100644 index 0000000..e692cfd --- /dev/null +++ b/src/node_modules/underscore/amd/_toPath.js @@ -0,0 +1,11 @@ +define(['./underscore', './toPath'], function (underscore, toPath$1) { + + // Internal wrapper for `_.toPath` to enable minification. + // Similar to `cb` for `_.iteratee`. + function toPath(path) { + return underscore.toPath(path); + } + + return toPath; + +}); diff --git a/src/node_modules/underscore/amd/_unescapeMap.js b/src/node_modules/underscore/amd/_unescapeMap.js new file mode 100644 index 0000000..28cf070 --- /dev/null +++ b/src/node_modules/underscore/amd/_unescapeMap.js @@ -0,0 +1,8 @@ +define(['./invert', './_escapeMap'], function (invert, _escapeMap) { + + // Internal list of HTML entities for unescaping. + var unescapeMap = invert(_escapeMap); + + return unescapeMap; + +}); diff --git a/src/node_modules/underscore/amd/after.js b/src/node_modules/underscore/amd/after.js new file mode 100644 index 0000000..69b73c6 --- /dev/null +++ b/src/node_modules/underscore/amd/after.js @@ -0,0 +1,14 @@ +define(function () { + + // Returns a function that will only be executed on and after the Nth call. + function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + } + + return after; + +}); diff --git a/src/node_modules/underscore/amd/allKeys.js b/src/node_modules/underscore/amd/allKeys.js new file mode 100644 index 0000000..1be84f1 --- /dev/null +++ b/src/node_modules/underscore/amd/allKeys.js @@ -0,0 +1,15 @@ +define(['./isObject', './_setup', './_collectNonEnumProps'], function (isObject, _setup, _collectNonEnumProps) { + + // Retrieve all the enumerable property names of an object. + function allKeys(obj) { + if (!isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys); + return keys; + } + + return allKeys; + +}); diff --git a/src/node_modules/underscore/amd/before.js b/src/node_modules/underscore/amd/before.js new file mode 100644 index 0000000..bd856c6 --- /dev/null +++ b/src/node_modules/underscore/amd/before.js @@ -0,0 +1,18 @@ +define(function () { + + // Returns a function that will only be executed up to (but not including) the + // Nth call. + function before(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + } + + return before; + +}); diff --git a/src/node_modules/underscore/amd/bind.js b/src/node_modules/underscore/amd/bind.js new file mode 100644 index 0000000..d41ec56 --- /dev/null +++ b/src/node_modules/underscore/amd/bind.js @@ -0,0 +1,15 @@ +define(['./restArguments', './isFunction', './_executeBound'], function (restArguments, isFunction, _executeBound) { + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). + var bind = restArguments(function(func, context, args) { + if (!isFunction(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return _executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; + }); + + return bind; + +}); diff --git a/src/node_modules/underscore/amd/bindAll.js b/src/node_modules/underscore/amd/bindAll.js new file mode 100644 index 0000000..26dcef1 --- /dev/null +++ b/src/node_modules/underscore/amd/bindAll.js @@ -0,0 +1,19 @@ +define(['./restArguments', './_flatten', './bind'], function (restArguments, _flatten, bind) { + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + var bindAll = restArguments(function(obj, keys) { + keys = _flatten(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = bind(obj[key], obj); + } + return obj; + }); + + return bindAll; + +}); diff --git a/src/node_modules/underscore/amd/chain.js b/src/node_modules/underscore/amd/chain.js new file mode 100644 index 0000000..ba42101 --- /dev/null +++ b/src/node_modules/underscore/amd/chain.js @@ -0,0 +1,12 @@ +define(['./underscore'], function (underscore) { + + // Start chaining a wrapped Underscore object. + function chain(obj) { + var instance = underscore(obj); + instance._chain = true; + return instance; + } + + return chain; + +}); diff --git a/src/node_modules/underscore/amd/chunk.js b/src/node_modules/underscore/amd/chunk.js new file mode 100644 index 0000000..ed4e086 --- /dev/null +++ b/src/node_modules/underscore/amd/chunk.js @@ -0,0 +1,17 @@ +define(['./_setup'], function (_setup) { + + // Chunk a single array into multiple arrays, each containing `count` or fewer + // items. + function chunk(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(_setup.slice.call(array, i, i += count)); + } + return result; + } + + return chunk; + +}); diff --git a/src/node_modules/underscore/amd/clone.js b/src/node_modules/underscore/amd/clone.js new file mode 100644 index 0000000..1a19630 --- /dev/null +++ b/src/node_modules/underscore/amd/clone.js @@ -0,0 +1,11 @@ +define(['./isObject', './isArray', './extend'], function (isObject, isArray, extend) { + + // Create a (shallow-cloned) duplicate of an object. + function clone(obj) { + if (!isObject(obj)) return obj; + return isArray(obj) ? obj.slice() : extend({}, obj); + } + + return clone; + +}); diff --git a/src/node_modules/underscore/amd/compact.js b/src/node_modules/underscore/amd/compact.js new file mode 100644 index 0000000..202433b --- /dev/null +++ b/src/node_modules/underscore/amd/compact.js @@ -0,0 +1,10 @@ +define(['./filter'], function (filter) { + + // Trim out all falsy values from an array. + function compact(array) { + return filter(array, Boolean); + } + + return compact; + +}); diff --git a/src/node_modules/underscore/amd/compose.js b/src/node_modules/underscore/amd/compose.js new file mode 100644 index 0000000..93d8c36 --- /dev/null +++ b/src/node_modules/underscore/amd/compose.js @@ -0,0 +1,18 @@ +define(function () { + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + function compose() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; + } + + return compose; + +}); diff --git a/src/node_modules/underscore/amd/constant.js b/src/node_modules/underscore/amd/constant.js new file mode 100644 index 0000000..6d3ac2c --- /dev/null +++ b/src/node_modules/underscore/amd/constant.js @@ -0,0 +1,12 @@ +define(function () { + + // Predicate-generating function. Often useful outside of Underscore. + function constant(value) { + return function() { + return value; + }; + } + + return constant; + +}); diff --git a/src/node_modules/underscore/amd/contains.js b/src/node_modules/underscore/amd/contains.js new file mode 100644 index 0000000..578b050 --- /dev/null +++ b/src/node_modules/underscore/amd/contains.js @@ -0,0 +1,12 @@ +define(['./_isArrayLike', './values', './indexOf'], function (_isArrayLike, values, indexOf) { + + // Determine if the array or object contains a given item (using `===`). + function contains(obj, item, fromIndex, guard) { + if (!_isArrayLike(obj)) obj = values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return indexOf(obj, item, fromIndex) >= 0; + } + + return contains; + +}); diff --git a/src/node_modules/underscore/amd/countBy.js b/src/node_modules/underscore/amd/countBy.js new file mode 100644 index 0000000..0ab6422 --- /dev/null +++ b/src/node_modules/underscore/amd/countBy.js @@ -0,0 +1,12 @@ +define(['./_group', './_has'], function (_group, _has) { + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + var countBy = _group(function(result, value, key) { + if (_has(result, key)) result[key]++; else result[key] = 1; + }); + + return countBy; + +}); diff --git a/src/node_modules/underscore/amd/create.js b/src/node_modules/underscore/amd/create.js new file mode 100644 index 0000000..d5e2813 --- /dev/null +++ b/src/node_modules/underscore/amd/create.js @@ -0,0 +1,14 @@ +define(['./_baseCreate', './extendOwn'], function (_baseCreate, extendOwn) { + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + function create(prototype, props) { + var result = _baseCreate(prototype); + if (props) extendOwn(result, props); + return result; + } + + return create; + +}); diff --git a/src/node_modules/underscore/amd/debounce.js b/src/node_modules/underscore/amd/debounce.js new file mode 100644 index 0000000..1d88168 --- /dev/null +++ b/src/node_modules/underscore/amd/debounce.js @@ -0,0 +1,43 @@ +define(['./restArguments', './now'], function (restArguments, now) { + + // When a sequence of calls of the returned function ends, the argument + // function is triggered. The end of a sequence is defined by the `wait` + // parameter. If `immediate` is passed, the argument function will be + // triggered at the beginning of the sequence instead of at the end. + function debounce(func, wait, immediate) { + var timeout, previous, args, result, context; + + var later = function() { + var passed = now() - previous; + if (wait > passed) { + timeout = setTimeout(later, wait - passed); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + // This check is needed because `func` can recursively invoke `debounced`. + if (!timeout) args = context = null; + } + }; + + var debounced = restArguments(function(_args) { + context = this; + args = _args; + previous = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + if (immediate) result = func.apply(context, args); + } + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = args = context = null; + }; + + return debounced; + } + + return debounce; + +}); diff --git a/src/node_modules/underscore/amd/defaults.js b/src/node_modules/underscore/amd/defaults.js new file mode 100644 index 0000000..6903faa --- /dev/null +++ b/src/node_modules/underscore/amd/defaults.js @@ -0,0 +1,8 @@ +define(['./_createAssigner', './allKeys'], function (_createAssigner, allKeys) { + + // Fill in a given object with default properties. + var defaults = _createAssigner(allKeys, true); + + return defaults; + +}); diff --git a/src/node_modules/underscore/amd/defer.js b/src/node_modules/underscore/amd/defer.js new file mode 100644 index 0000000..ce338a7 --- /dev/null +++ b/src/node_modules/underscore/amd/defer.js @@ -0,0 +1,9 @@ +define(['./partial', './delay', './underscore'], function (partial, delay, underscore) { + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + var defer = partial(delay, underscore, 1); + + return defer; + +}); diff --git a/src/node_modules/underscore/amd/delay.js b/src/node_modules/underscore/amd/delay.js new file mode 100644 index 0000000..715d24d --- /dev/null +++ b/src/node_modules/underscore/amd/delay.js @@ -0,0 +1,13 @@ +define(['./restArguments'], function (restArguments) { + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + var delay = restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); + }); + + return delay; + +}); diff --git a/src/node_modules/underscore/amd/difference.js b/src/node_modules/underscore/amd/difference.js new file mode 100644 index 0000000..11f1902 --- /dev/null +++ b/src/node_modules/underscore/amd/difference.js @@ -0,0 +1,14 @@ +define(['./restArguments', './_flatten', './filter', './contains'], function (restArguments, _flatten, filter, contains) { + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + var difference = restArguments(function(array, rest) { + rest = _flatten(rest, true, true); + return filter(array, function(value){ + return !contains(rest, value); + }); + }); + + return difference; + +}); diff --git a/src/node_modules/underscore/amd/each.js b/src/node_modules/underscore/amd/each.js new file mode 100644 index 0000000..f5c47ab --- /dev/null +++ b/src/node_modules/underscore/amd/each.js @@ -0,0 +1,25 @@ +define(['./_optimizeCb', './_isArrayLike', './keys'], function (_optimizeCb, _isArrayLike, keys) { + + // The cornerstone for collection functions, an `each` + // implementation, aka `forEach`. + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + function each(obj, iteratee, context) { + iteratee = _optimizeCb(iteratee, context); + var i, length; + if (_isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + for (i = 0, length = _keys.length; i < length; i++) { + iteratee(obj[_keys[i]], _keys[i], obj); + } + } + return obj; + } + + return each; + +}); diff --git a/src/node_modules/underscore/amd/escape.js b/src/node_modules/underscore/amd/escape.js new file mode 100644 index 0000000..6714d12 --- /dev/null +++ b/src/node_modules/underscore/amd/escape.js @@ -0,0 +1,8 @@ +define(['./_createEscaper', './_escapeMap'], function (_createEscaper, _escapeMap) { + + // Function for escaping strings to HTML interpolation. + var _escape = _createEscaper(_escapeMap); + + return _escape; + +}); diff --git a/src/node_modules/underscore/amd/every.js b/src/node_modules/underscore/amd/every.js new file mode 100644 index 0000000..1180c44 --- /dev/null +++ b/src/node_modules/underscore/amd/every.js @@ -0,0 +1,17 @@ +define(['./_cb', './_isArrayLike', './keys'], function (_cb, _isArrayLike, keys) { + + // Determine whether all of the elements pass a truth test. + function every(obj, predicate, context) { + predicate = _cb(predicate, context); + var _keys = !_isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + } + + return every; + +}); diff --git a/src/node_modules/underscore/amd/extend.js b/src/node_modules/underscore/amd/extend.js new file mode 100644 index 0000000..35d8761 --- /dev/null +++ b/src/node_modules/underscore/amd/extend.js @@ -0,0 +1,8 @@ +define(['./_createAssigner', './allKeys'], function (_createAssigner, allKeys) { + + // Extend a given object with all the properties in passed-in object(s). + var extend = _createAssigner(allKeys); + + return extend; + +}); diff --git a/src/node_modules/underscore/amd/extendOwn.js b/src/node_modules/underscore/amd/extendOwn.js new file mode 100644 index 0000000..2e1e4b5 --- /dev/null +++ b/src/node_modules/underscore/amd/extendOwn.js @@ -0,0 +1,10 @@ +define(['./_createAssigner', './keys'], function (_createAssigner, keys) { + + // Assigns a given object with all the own properties in the passed-in + // object(s). + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + var extendOwn = _createAssigner(keys); + + return extendOwn; + +}); diff --git a/src/node_modules/underscore/amd/filter.js b/src/node_modules/underscore/amd/filter.js new file mode 100644 index 0000000..a767568 --- /dev/null +++ b/src/node_modules/underscore/amd/filter.js @@ -0,0 +1,15 @@ +define(['./_cb', './each'], function (_cb, each) { + + // Return all the elements that pass a truth test. + function filter(obj, predicate, context) { + var results = []; + predicate = _cb(predicate, context); + each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; + } + + return filter; + +}); diff --git a/src/node_modules/underscore/amd/find.js b/src/node_modules/underscore/amd/find.js new file mode 100644 index 0000000..586518d --- /dev/null +++ b/src/node_modules/underscore/amd/find.js @@ -0,0 +1,12 @@ +define(['./_isArrayLike', './findIndex', './findKey'], function (_isArrayLike, findIndex, findKey) { + + // Return the first value which passes a truth test. + function find(obj, predicate, context) { + var keyFinder = _isArrayLike(obj) ? findIndex : findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; + } + + return find; + +}); diff --git a/src/node_modules/underscore/amd/findIndex.js b/src/node_modules/underscore/amd/findIndex.js new file mode 100644 index 0000000..90d4cf3 --- /dev/null +++ b/src/node_modules/underscore/amd/findIndex.js @@ -0,0 +1,8 @@ +define(['./_createPredicateIndexFinder'], function (_createPredicateIndexFinder) { + + // Returns the first index on an array-like that passes a truth test. + var findIndex = _createPredicateIndexFinder(1); + + return findIndex; + +}); diff --git a/src/node_modules/underscore/amd/findKey.js b/src/node_modules/underscore/amd/findKey.js new file mode 100644 index 0000000..80a5beb --- /dev/null +++ b/src/node_modules/underscore/amd/findKey.js @@ -0,0 +1,15 @@ +define(['./_cb', './keys'], function (_cb, keys) { + + // Returns the first key on an object that passes a truth test. + function findKey(obj, predicate, context) { + predicate = _cb(predicate, context); + var _keys = keys(obj), key; + for (var i = 0, length = _keys.length; i < length; i++) { + key = _keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + } + + return findKey; + +}); diff --git a/src/node_modules/underscore/amd/findLastIndex.js b/src/node_modules/underscore/amd/findLastIndex.js new file mode 100644 index 0000000..f3e78a0 --- /dev/null +++ b/src/node_modules/underscore/amd/findLastIndex.js @@ -0,0 +1,8 @@ +define(['./_createPredicateIndexFinder'], function (_createPredicateIndexFinder) { + + // Returns the last index on an array-like that passes a truth test. + var findLastIndex = _createPredicateIndexFinder(-1); + + return findLastIndex; + +}); diff --git a/src/node_modules/underscore/amd/findWhere.js b/src/node_modules/underscore/amd/findWhere.js new file mode 100644 index 0000000..4069585 --- /dev/null +++ b/src/node_modules/underscore/amd/findWhere.js @@ -0,0 +1,11 @@ +define(['./find', './matcher'], function (find, matcher) { + + // Convenience version of a common use case of `_.find`: getting the first + // object containing specific `key:value` pairs. + function findWhere(obj, attrs) { + return find(obj, matcher(attrs)); + } + + return findWhere; + +}); diff --git a/src/node_modules/underscore/amd/first.js b/src/node_modules/underscore/amd/first.js new file mode 100644 index 0000000..96c5a56 --- /dev/null +++ b/src/node_modules/underscore/amd/first.js @@ -0,0 +1,13 @@ +define(['./initial'], function (initial) { + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. The **guard** check allows it to work with `_.map`. + function first(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[0]; + return initial(array, array.length - n); + } + + return first; + +}); diff --git a/src/node_modules/underscore/amd/flatten.js b/src/node_modules/underscore/amd/flatten.js new file mode 100644 index 0000000..7d2891a --- /dev/null +++ b/src/node_modules/underscore/amd/flatten.js @@ -0,0 +1,11 @@ +define(['./_flatten'], function (_flatten) { + + // Flatten out an array, either recursively (by default), or up to `depth`. + // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. + function flatten(array, depth) { + return _flatten(array, depth, false); + } + + return flatten; + +}); diff --git a/src/node_modules/underscore/amd/functions.js b/src/node_modules/underscore/amd/functions.js new file mode 100644 index 0000000..b929883 --- /dev/null +++ b/src/node_modules/underscore/amd/functions.js @@ -0,0 +1,14 @@ +define(['./isFunction'], function (isFunction) { + + // Return a sorted list of the function names available on the object. + function functions(obj) { + var names = []; + for (var key in obj) { + if (isFunction(obj[key])) names.push(key); + } + return names.sort(); + } + + return functions; + +}); diff --git a/src/node_modules/underscore/amd/get.js b/src/node_modules/underscore/amd/get.js new file mode 100644 index 0000000..1404ea0 --- /dev/null +++ b/src/node_modules/underscore/amd/get.js @@ -0,0 +1,14 @@ +define(['./_toPath', './_deepGet', './isUndefined'], function (_toPath, _deepGet, isUndefined) { + + // Get the value of the (deep) property on `path` from `object`. + // If any property in `path` does not exist or if the value is + // `undefined`, return `defaultValue` instead. + // The `path` is normalized through `_.toPath`. + function get(object, path, defaultValue) { + var value = _deepGet(object, _toPath(path)); + return isUndefined(value) ? defaultValue : value; + } + + return get; + +}); diff --git a/src/node_modules/underscore/amd/groupBy.js b/src/node_modules/underscore/amd/groupBy.js new file mode 100644 index 0000000..4374d76 --- /dev/null +++ b/src/node_modules/underscore/amd/groupBy.js @@ -0,0 +1,11 @@ +define(['./_group', './_has'], function (_group, _has) { + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + var groupBy = _group(function(result, value, key) { + if (_has(result, key)) result[key].push(value); else result[key] = [value]; + }); + + return groupBy; + +}); diff --git a/src/node_modules/underscore/amd/has.js b/src/node_modules/underscore/amd/has.js new file mode 100644 index 0000000..a81ec08 --- /dev/null +++ b/src/node_modules/underscore/amd/has.js @@ -0,0 +1,19 @@ +define(['./_has', './_toPath'], function (_has, _toPath) { + + // Shortcut function for checking if an object has a given property directly on + // itself (in other words, not on a prototype). Unlike the internal `has` + // function, this public version can also traverse nested properties. + function has(obj, path) { + path = _toPath(path); + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (!_has(obj, key)) return false; + obj = obj[key]; + } + return !!length; + } + + return has; + +}); diff --git a/src/node_modules/underscore/amd/identity.js b/src/node_modules/underscore/amd/identity.js new file mode 100644 index 0000000..fee0458 --- /dev/null +++ b/src/node_modules/underscore/amd/identity.js @@ -0,0 +1,10 @@ +define(function () { + + // Keep the identity function around for default iteratees. + function identity(value) { + return value; + } + + return identity; + +}); diff --git a/src/node_modules/underscore/amd/index-default.js b/src/node_modules/underscore/amd/index-default.js new file mode 100644 index 0000000..0f50605 --- /dev/null +++ b/src/node_modules/underscore/amd/index-default.js @@ -0,0 +1,12 @@ +define(['./index', './mixin'], function (index, mixin) { + + // Default Export + + // Add all of the Underscore functions to the wrapper object. + var _ = mixin(index); + // Legacy Node.js API. + _._ = _; + + return _; + +}); diff --git a/src/node_modules/underscore/amd/index.js b/src/node_modules/underscore/amd/index.js new file mode 100644 index 0000000..14a7179 --- /dev/null +++ b/src/node_modules/underscore/amd/index.js @@ -0,0 +1,154 @@ +define(['exports', './_setup', './restArguments', './isObject', './isNull', './isUndefined', './isBoolean', './isElement', './isString', './isNumber', './isDate', './isRegExp', './isError', './isSymbol', './isArrayBuffer', './isDataView', './isArray', './isFunction', './isArguments', './isFinite', './isNaN', './isTypedArray', './isEmpty', './isMatch', './isEqual', './isMap', './isWeakMap', './isSet', './isWeakSet', './keys', './allKeys', './values', './pairs', './invert', './functions', './extend', './extendOwn', './defaults', './create', './clone', './tap', './get', './has', './mapObject', './identity', './constant', './noop', './toPath', './property', './propertyOf', './matcher', './times', './random', './now', './escape', './unescape', './templateSettings', './template', './result', './uniqueId', './chain', './iteratee', './partial', './bind', './bindAll', './memoize', './delay', './defer', './throttle', './debounce', './wrap', './negate', './compose', './after', './before', './once', './findKey', './findIndex', './findLastIndex', './sortedIndex', './indexOf', './lastIndexOf', './find', './findWhere', './each', './map', './reduce', './reduceRight', './filter', './reject', './every', './some', './contains', './invoke', './pluck', './where', './max', './min', './shuffle', './sample', './sortBy', './groupBy', './indexBy', './countBy', './partition', './toArray', './size', './pick', './omit', './first', './initial', './last', './rest', './compact', './flatten', './without', './uniq', './union', './intersection', './difference', './unzip', './zip', './object', './range', './chunk', './mixin', './underscore-array-methods', './underscore'], function (exports, _setup, restArguments, isObject, isNull, isUndefined, isBoolean, isElement, isString, isNumber, isDate, isRegExp, isError, isSymbol, isArrayBuffer, isDataView, isArray, isFunction, isArguments, _isFinite, _isNaN, isTypedArray, isEmpty, isMatch, isEqual, isMap, isWeakMap, isSet, isWeakSet, keys, allKeys, values, pairs, invert, functions, extend, extendOwn, defaults, create, clone, tap, get, has, mapObject, identity, constant, noop, toPath, property, propertyOf, matcher, times, random, now, _escape, _unescape, templateSettings, template, result, uniqueId, chain, iteratee, partial, bind, bindAll, memoize, delay, defer, throttle, debounce, wrap, negate, compose, after, before, once, findKey, findIndex, findLastIndex, sortedIndex, indexOf, lastIndexOf, find, findWhere, each, map, reduce, reduceRight, filter, reject, every, some, contains, invoke, pluck, where, max, min, shuffle, sample, sortBy, groupBy, indexBy, countBy, partition, toArray, size, pick, omit, first, initial, last, rest, compact, flatten, without, uniq, union, intersection, difference, unzip, zip, object, range, chunk, mixin, underscoreArrayMethods, underscore) { + + // Named Exports + + exports.VERSION = _setup.VERSION; + exports.restArguments = restArguments; + exports.isObject = isObject; + exports.isNull = isNull; + exports.isUndefined = isUndefined; + exports.isBoolean = isBoolean; + exports.isElement = isElement; + exports.isString = isString; + exports.isNumber = isNumber; + exports.isDate = isDate; + exports.isRegExp = isRegExp; + exports.isError = isError; + exports.isSymbol = isSymbol; + exports.isArrayBuffer = isArrayBuffer; + exports.isDataView = isDataView; + exports.isArray = isArray; + exports.isFunction = isFunction; + exports.isArguments = isArguments; + exports.isFinite = _isFinite; + exports.isNaN = _isNaN; + exports.isTypedArray = isTypedArray; + exports.isEmpty = isEmpty; + exports.isMatch = isMatch; + exports.isEqual = isEqual; + exports.isMap = isMap; + exports.isWeakMap = isWeakMap; + exports.isSet = isSet; + exports.isWeakSet = isWeakSet; + exports.keys = keys; + exports.allKeys = allKeys; + exports.values = values; + exports.pairs = pairs; + exports.invert = invert; + exports.functions = functions; + exports.methods = functions; + exports.extend = extend; + exports.assign = extendOwn; + exports.extendOwn = extendOwn; + exports.defaults = defaults; + exports.create = create; + exports.clone = clone; + exports.tap = tap; + exports.get = get; + exports.has = has; + exports.mapObject = mapObject; + exports.identity = identity; + exports.constant = constant; + exports.noop = noop; + exports.toPath = toPath; + exports.property = property; + exports.propertyOf = propertyOf; + exports.matcher = matcher; + exports.matches = matcher; + exports.times = times; + exports.random = random; + exports.now = now; + exports.escape = _escape; + exports.unescape = _unescape; + exports.templateSettings = templateSettings; + exports.template = template; + exports.result = result; + exports.uniqueId = uniqueId; + exports.chain = chain; + exports.iteratee = iteratee; + exports.partial = partial; + exports.bind = bind; + exports.bindAll = bindAll; + exports.memoize = memoize; + exports.delay = delay; + exports.defer = defer; + exports.throttle = throttle; + exports.debounce = debounce; + exports.wrap = wrap; + exports.negate = negate; + exports.compose = compose; + exports.after = after; + exports.before = before; + exports.once = once; + exports.findKey = findKey; + exports.findIndex = findIndex; + exports.findLastIndex = findLastIndex; + exports.sortedIndex = sortedIndex; + exports.indexOf = indexOf; + exports.lastIndexOf = lastIndexOf; + exports.detect = find; + exports.find = find; + exports.findWhere = findWhere; + exports.each = each; + exports.forEach = each; + exports.collect = map; + exports.map = map; + exports.foldl = reduce; + exports.inject = reduce; + exports.reduce = reduce; + exports.foldr = reduceRight; + exports.reduceRight = reduceRight; + exports.filter = filter; + exports.select = filter; + exports.reject = reject; + exports.all = every; + exports.every = every; + exports.any = some; + exports.some = some; + exports.contains = contains; + exports.include = contains; + exports.includes = contains; + exports.invoke = invoke; + exports.pluck = pluck; + exports.where = where; + exports.max = max; + exports.min = min; + exports.shuffle = shuffle; + exports.sample = sample; + exports.sortBy = sortBy; + exports.groupBy = groupBy; + exports.indexBy = indexBy; + exports.countBy = countBy; + exports.partition = partition; + exports.toArray = toArray; + exports.size = size; + exports.pick = pick; + exports.omit = omit; + exports.first = first; + exports.head = first; + exports.take = first; + exports.initial = initial; + exports.last = last; + exports.drop = rest; + exports.rest = rest; + exports.tail = rest; + exports.compact = compact; + exports.flatten = flatten; + exports.without = without; + exports.uniq = uniq; + exports.unique = uniq; + exports.union = union; + exports.intersection = intersection; + exports.difference = difference; + exports.transpose = unzip; + exports.unzip = unzip; + exports.zip = zip; + exports.object = object; + exports.range = range; + exports.chunk = chunk; + exports.mixin = mixin; + exports.default = underscore; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}); diff --git a/src/node_modules/underscore/amd/indexBy.js b/src/node_modules/underscore/amd/indexBy.js new file mode 100644 index 0000000..dacc792 --- /dev/null +++ b/src/node_modules/underscore/amd/indexBy.js @@ -0,0 +1,11 @@ +define(['./_group'], function (_group) { + + // Indexes the object's values by a criterion, similar to `_.groupBy`, but for + // when you know that your index values will be unique. + var indexBy = _group(function(result, value, key) { + result[key] = value; + }); + + return indexBy; + +}); diff --git a/src/node_modules/underscore/amd/indexOf.js b/src/node_modules/underscore/amd/indexOf.js new file mode 100644 index 0000000..108f201 --- /dev/null +++ b/src/node_modules/underscore/amd/indexOf.js @@ -0,0 +1,11 @@ +define(['./sortedIndex', './findIndex', './_createIndexFinder'], function (sortedIndex, findIndex, _createIndexFinder) { + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + var indexOf = _createIndexFinder(1, findIndex, sortedIndex); + + return indexOf; + +}); diff --git a/src/node_modules/underscore/amd/initial.js b/src/node_modules/underscore/amd/initial.js new file mode 100644 index 0000000..ca73c1a --- /dev/null +++ b/src/node_modules/underscore/amd/initial.js @@ -0,0 +1,12 @@ +define(['./_setup'], function (_setup) { + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. + function initial(array, n, guard) { + return _setup.slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); + } + + return initial; + +}); diff --git a/src/node_modules/underscore/amd/intersection.js b/src/node_modules/underscore/amd/intersection.js new file mode 100644 index 0000000..8592d75 --- /dev/null +++ b/src/node_modules/underscore/amd/intersection.js @@ -0,0 +1,22 @@ +define(['./_getLength', './contains'], function (_getLength, contains) { + + // Produce an array that contains every item shared between all the + // passed-in arrays. + function intersection(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = _getLength(array); i < length; i++) { + var item = array[i]; + if (contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; + } + + return intersection; + +}); diff --git a/src/node_modules/underscore/amd/invert.js b/src/node_modules/underscore/amd/invert.js new file mode 100644 index 0000000..446b8cb --- /dev/null +++ b/src/node_modules/underscore/amd/invert.js @@ -0,0 +1,15 @@ +define(['./keys'], function (keys) { + + // Invert the keys and values of an object. The values must be serializable. + function invert(obj) { + var result = {}; + var _keys = keys(obj); + for (var i = 0, length = _keys.length; i < length; i++) { + result[obj[_keys[i]]] = _keys[i]; + } + return result; + } + + return invert; + +}); diff --git a/src/node_modules/underscore/amd/invoke.js b/src/node_modules/underscore/amd/invoke.js new file mode 100644 index 0000000..72684f4 --- /dev/null +++ b/src/node_modules/underscore/amd/invoke.js @@ -0,0 +1,28 @@ +define(['./restArguments', './isFunction', './map', './_deepGet', './_toPath'], function (restArguments, isFunction, map, _deepGet, _toPath) { + + // Invoke a method (with arguments) on every item in a collection. + var invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (isFunction(path)) { + func = path; + } else { + path = _toPath(path); + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = _deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); + }); + + return invoke; + +}); diff --git a/src/node_modules/underscore/amd/isArguments.js b/src/node_modules/underscore/amd/isArguments.js new file mode 100644 index 0000000..c4448f4 --- /dev/null +++ b/src/node_modules/underscore/amd/isArguments.js @@ -0,0 +1,19 @@ +define(['./_tagTester', './_has'], function (_tagTester, _has) { + + var isArguments = _tagTester('Arguments'); + + // Define a fallback version of the method in browsers (ahem, IE < 9), where + // there isn't any inspectable "Arguments" type. + (function() { + if (!isArguments(arguments)) { + isArguments = function(obj) { + return _has(obj, 'callee'); + }; + } + }()); + + var isArguments$1 = isArguments; + + return isArguments$1; + +}); diff --git a/src/node_modules/underscore/amd/isArray.js b/src/node_modules/underscore/amd/isArray.js new file mode 100644 index 0000000..ef30585 --- /dev/null +++ b/src/node_modules/underscore/amd/isArray.js @@ -0,0 +1,9 @@ +define(['./_setup', './_tagTester'], function (_setup, _tagTester) { + + // Is a given value an array? + // Delegates to ECMA5's native `Array.isArray`. + var isArray = _setup.nativeIsArray || _tagTester('Array'); + + return isArray; + +}); diff --git a/src/node_modules/underscore/amd/isArrayBuffer.js b/src/node_modules/underscore/amd/isArrayBuffer.js new file mode 100644 index 0000000..e739aa8 --- /dev/null +++ b/src/node_modules/underscore/amd/isArrayBuffer.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var isArrayBuffer = _tagTester('ArrayBuffer'); + + return isArrayBuffer; + +}); diff --git a/src/node_modules/underscore/amd/isBoolean.js b/src/node_modules/underscore/amd/isBoolean.js new file mode 100644 index 0000000..e3f1d8b --- /dev/null +++ b/src/node_modules/underscore/amd/isBoolean.js @@ -0,0 +1,10 @@ +define(['./_setup'], function (_setup) { + + // Is a given value a boolean? + function isBoolean(obj) { + return obj === true || obj === false || _setup.toString.call(obj) === '[object Boolean]'; + } + + return isBoolean; + +}); diff --git a/src/node_modules/underscore/amd/isDataView.js b/src/node_modules/underscore/amd/isDataView.js new file mode 100644 index 0000000..3668b0a --- /dev/null +++ b/src/node_modules/underscore/amd/isDataView.js @@ -0,0 +1,15 @@ +define(['./_tagTester', './isFunction', './isArrayBuffer', './_stringTagBug'], function (_tagTester, isFunction, isArrayBuffer, _stringTagBug) { + + var isDataView = _tagTester('DataView'); + + // In IE 10 - Edge 13, we need a different heuristic + // to determine whether an object is a `DataView`. + function ie10IsDataView(obj) { + return obj != null && isFunction(obj.getInt8) && isArrayBuffer(obj.buffer); + } + + var isDataView$1 = (_stringTagBug.hasStringTagBug ? ie10IsDataView : isDataView); + + return isDataView$1; + +}); diff --git a/src/node_modules/underscore/amd/isDate.js b/src/node_modules/underscore/amd/isDate.js new file mode 100644 index 0000000..8a84bcd --- /dev/null +++ b/src/node_modules/underscore/amd/isDate.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var isDate = _tagTester('Date'); + + return isDate; + +}); diff --git a/src/node_modules/underscore/amd/isElement.js b/src/node_modules/underscore/amd/isElement.js new file mode 100644 index 0000000..f1812e1 --- /dev/null +++ b/src/node_modules/underscore/amd/isElement.js @@ -0,0 +1,10 @@ +define(function () { + + // Is a given value a DOM element? + function isElement(obj) { + return !!(obj && obj.nodeType === 1); + } + + return isElement; + +}); diff --git a/src/node_modules/underscore/amd/isEmpty.js b/src/node_modules/underscore/amd/isEmpty.js new file mode 100644 index 0000000..b011916 --- /dev/null +++ b/src/node_modules/underscore/amd/isEmpty.js @@ -0,0 +1,18 @@ +define(['./_getLength', './isArray', './isString', './isArguments', './keys'], function (_getLength, isArray, isString, isArguments, keys) { + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + function isEmpty(obj) { + if (obj == null) return true; + // Skip the more expensive `toString`-based type checks if `obj` has no + // `.length`. + var length = _getLength(obj); + if (typeof length == 'number' && ( + isArray(obj) || isString(obj) || isArguments(obj) + )) return length === 0; + return _getLength(keys(obj)) === 0; + } + + return isEmpty; + +}); diff --git a/src/node_modules/underscore/amd/isEqual.js b/src/node_modules/underscore/amd/isEqual.js new file mode 100644 index 0000000..683c62f --- /dev/null +++ b/src/node_modules/underscore/amd/isEqual.js @@ -0,0 +1,133 @@ +define(['./underscore', './_setup', './_getByteLength', './isTypedArray', './isFunction', './_stringTagBug', './isDataView', './keys', './_has', './_toBufferView'], function (underscore, _setup, _getByteLength, isTypedArray, isFunction, _stringTagBug, isDataView, keys, _has, _toBufferView) { + + // We use this string twice, so give it a name for minification. + var tagDataView = '[object DataView]'; + + // Internal recursive comparison function for `_.isEqual`. + function eq(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); + } + + // Internal recursive comparison function for `_.isEqual`. + function deepEq(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof underscore) a = a._wrapped; + if (b instanceof underscore) b = b._wrapped; + // Compare `[[Class]]` names. + var className = _setup.toString.call(a); + if (className !== _setup.toString.call(b)) return false; + // Work around a bug in IE 10 - Edge 13. + if (_stringTagBug.hasStringTagBug && className == '[object Object]' && isDataView(a)) { + if (!isDataView(b)) return false; + className = tagDataView; + } + switch (className) { + // These types are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return _setup.SymbolProto.valueOf.call(a) === _setup.SymbolProto.valueOf.call(b); + case '[object ArrayBuffer]': + case tagDataView: + // Coerce to typed array so we can fall through. + return deepEq(_toBufferView(a), _toBufferView(b), aStack, bStack); + } + + var areArrays = className === '[object Array]'; + if (!areArrays && isTypedArray(a)) { + var byteLength = _getByteLength(a); + if (byteLength !== _getByteLength(b)) return false; + if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; + areArrays = true; + } + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor && + isFunction(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var _keys = keys(a), key; + length = _keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = _keys[length]; + if (!(_has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; + } + + // Perform a deep comparison to check if two objects are equal. + function isEqual(a, b) { + return eq(a, b); + } + + return isEqual; + +}); diff --git a/src/node_modules/underscore/amd/isError.js b/src/node_modules/underscore/amd/isError.js new file mode 100644 index 0000000..dd349a8 --- /dev/null +++ b/src/node_modules/underscore/amd/isError.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var isError = _tagTester('Error'); + + return isError; + +}); diff --git a/src/node_modules/underscore/amd/isFinite.js b/src/node_modules/underscore/amd/isFinite.js new file mode 100644 index 0000000..b2a8d18 --- /dev/null +++ b/src/node_modules/underscore/amd/isFinite.js @@ -0,0 +1,10 @@ +define(['./_setup', './isSymbol'], function (_setup, isSymbol) { + + // Is a given object a finite number? + function isFinite(obj) { + return !isSymbol(obj) && _setup._isFinite(obj) && !isNaN(parseFloat(obj)); + } + + return isFinite; + +}); diff --git a/src/node_modules/underscore/amd/isFunction.js b/src/node_modules/underscore/amd/isFunction.js new file mode 100644 index 0000000..4dabb90 --- /dev/null +++ b/src/node_modules/underscore/amd/isFunction.js @@ -0,0 +1,18 @@ +define(['./_tagTester', './_setup'], function (_tagTester, _setup) { + + var isFunction = _tagTester('Function'); + + // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old + // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). + var nodelist = _setup.root.document && _setup.root.document.childNodes; + if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + isFunction = function(obj) { + return typeof obj == 'function' || false; + }; + } + + var isFunction$1 = isFunction; + + return isFunction$1; + +}); diff --git a/src/node_modules/underscore/amd/isMap.js b/src/node_modules/underscore/amd/isMap.js new file mode 100644 index 0000000..c3470b4 --- /dev/null +++ b/src/node_modules/underscore/amd/isMap.js @@ -0,0 +1,7 @@ +define(['./_tagTester', './_stringTagBug', './_methodFingerprint'], function (_tagTester, _stringTagBug, _methodFingerprint) { + + var isMap = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.mapMethods) : _tagTester('Map'); + + return isMap; + +}); diff --git a/src/node_modules/underscore/amd/isMatch.js b/src/node_modules/underscore/amd/isMatch.js new file mode 100644 index 0000000..c386478 --- /dev/null +++ b/src/node_modules/underscore/amd/isMatch.js @@ -0,0 +1,17 @@ +define(['./keys'], function (keys) { + + // Returns whether an object has a given set of `key:value` pairs. + function isMatch(object, attrs) { + var _keys = keys(attrs), length = _keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = _keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + } + + return isMatch; + +}); diff --git a/src/node_modules/underscore/amd/isNaN.js b/src/node_modules/underscore/amd/isNaN.js new file mode 100644 index 0000000..01bf22d --- /dev/null +++ b/src/node_modules/underscore/amd/isNaN.js @@ -0,0 +1,10 @@ +define(['./_setup', './isNumber'], function (_setup, isNumber) { + + // Is the given value `NaN`? + function isNaN(obj) { + return isNumber(obj) && _setup._isNaN(obj); + } + + return isNaN; + +}); diff --git a/src/node_modules/underscore/amd/isNull.js b/src/node_modules/underscore/amd/isNull.js new file mode 100644 index 0000000..c8b7bc6 --- /dev/null +++ b/src/node_modules/underscore/amd/isNull.js @@ -0,0 +1,10 @@ +define(function () { + + // Is a given value equal to null? + function isNull(obj) { + return obj === null; + } + + return isNull; + +}); diff --git a/src/node_modules/underscore/amd/isNumber.js b/src/node_modules/underscore/amd/isNumber.js new file mode 100644 index 0000000..a5d0152 --- /dev/null +++ b/src/node_modules/underscore/amd/isNumber.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var isNumber = _tagTester('Number'); + + return isNumber; + +}); diff --git a/src/node_modules/underscore/amd/isObject.js b/src/node_modules/underscore/amd/isObject.js new file mode 100644 index 0000000..9a24450 --- /dev/null +++ b/src/node_modules/underscore/amd/isObject.js @@ -0,0 +1,11 @@ +define(function () { + + // Is a given variable an object? + function isObject(obj) { + var type = typeof obj; + return type === 'function' || (type === 'object' && !!obj); + } + + return isObject; + +}); diff --git a/src/node_modules/underscore/amd/isRegExp.js b/src/node_modules/underscore/amd/isRegExp.js new file mode 100644 index 0000000..b1d5ade --- /dev/null +++ b/src/node_modules/underscore/amd/isRegExp.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var isRegExp = _tagTester('RegExp'); + + return isRegExp; + +}); diff --git a/src/node_modules/underscore/amd/isSet.js b/src/node_modules/underscore/amd/isSet.js new file mode 100644 index 0000000..c04a5d8 --- /dev/null +++ b/src/node_modules/underscore/amd/isSet.js @@ -0,0 +1,7 @@ +define(['./_tagTester', './_stringTagBug', './_methodFingerprint'], function (_tagTester, _stringTagBug, _methodFingerprint) { + + var isSet = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.setMethods) : _tagTester('Set'); + + return isSet; + +}); diff --git a/src/node_modules/underscore/amd/isString.js b/src/node_modules/underscore/amd/isString.js new file mode 100644 index 0000000..dd8d9e2 --- /dev/null +++ b/src/node_modules/underscore/amd/isString.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var isString = _tagTester('String'); + + return isString; + +}); diff --git a/src/node_modules/underscore/amd/isSymbol.js b/src/node_modules/underscore/amd/isSymbol.js new file mode 100644 index 0000000..b2ebc62 --- /dev/null +++ b/src/node_modules/underscore/amd/isSymbol.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var isSymbol = _tagTester('Symbol'); + + return isSymbol; + +}); diff --git a/src/node_modules/underscore/amd/isTypedArray.js b/src/node_modules/underscore/amd/isTypedArray.js new file mode 100644 index 0000000..db728f6 --- /dev/null +++ b/src/node_modules/underscore/amd/isTypedArray.js @@ -0,0 +1,16 @@ +define(['./_setup', './isDataView', './constant', './_isBufferLike'], function (_setup, isDataView, constant, _isBufferLike) { + + // Is a given value a typed array? + var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; + function isTypedArray(obj) { + // `ArrayBuffer.isView` is the most future-proof, so use it when available. + // Otherwise, fall back on the above regular expression. + return _setup.nativeIsView ? (_setup.nativeIsView(obj) && !isDataView(obj)) : + _isBufferLike(obj) && typedArrayPattern.test(_setup.toString.call(obj)); + } + + var isTypedArray$1 = _setup.supportsArrayBuffer ? isTypedArray : constant(false); + + return isTypedArray$1; + +}); diff --git a/src/node_modules/underscore/amd/isUndefined.js b/src/node_modules/underscore/amd/isUndefined.js new file mode 100644 index 0000000..2372b0c --- /dev/null +++ b/src/node_modules/underscore/amd/isUndefined.js @@ -0,0 +1,10 @@ +define(function () { + + // Is a given variable undefined? + function isUndefined(obj) { + return obj === void 0; + } + + return isUndefined; + +}); diff --git a/src/node_modules/underscore/amd/isWeakMap.js b/src/node_modules/underscore/amd/isWeakMap.js new file mode 100644 index 0000000..cf66b26 --- /dev/null +++ b/src/node_modules/underscore/amd/isWeakMap.js @@ -0,0 +1,7 @@ +define(['./_tagTester', './_stringTagBug', './_methodFingerprint'], function (_tagTester, _stringTagBug, _methodFingerprint) { + + var isWeakMap = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.weakMapMethods) : _tagTester('WeakMap'); + + return isWeakMap; + +}); diff --git a/src/node_modules/underscore/amd/isWeakSet.js b/src/node_modules/underscore/amd/isWeakSet.js new file mode 100644 index 0000000..a725852 --- /dev/null +++ b/src/node_modules/underscore/amd/isWeakSet.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var isWeakSet = _tagTester('WeakSet'); + + return isWeakSet; + +}); diff --git a/src/node_modules/underscore/amd/iteratee.js b/src/node_modules/underscore/amd/iteratee.js new file mode 100644 index 0000000..52a1d6f --- /dev/null +++ b/src/node_modules/underscore/amd/iteratee.js @@ -0,0 +1,13 @@ +define(['./underscore', './_baseIteratee'], function (underscore, _baseIteratee) { + + // External wrapper for our callback generator. Users may customize + // `_.iteratee` if they want additional predicate/iteratee shorthand styles. + // This abstraction hides the internal-only `argCount` argument. + function iteratee(value, context) { + return _baseIteratee(value, context, Infinity); + } + underscore.iteratee = iteratee; + + return iteratee; + +}); diff --git a/src/node_modules/underscore/amd/keys.js b/src/node_modules/underscore/amd/keys.js new file mode 100644 index 0000000..6db6bf4 --- /dev/null +++ b/src/node_modules/underscore/amd/keys.js @@ -0,0 +1,17 @@ +define(['./isObject', './_setup', './_has', './_collectNonEnumProps'], function (isObject, _setup, _has, _collectNonEnumProps) { + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys`. + function keys(obj) { + if (!isObject(obj)) return []; + if (_setup.nativeKeys) return _setup.nativeKeys(obj); + var keys = []; + for (var key in obj) if (_has(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys); + return keys; + } + + return keys; + +}); diff --git a/src/node_modules/underscore/amd/last.js b/src/node_modules/underscore/amd/last.js new file mode 100644 index 0000000..dfe3df2 --- /dev/null +++ b/src/node_modules/underscore/amd/last.js @@ -0,0 +1,13 @@ +define(['./rest'], function (rest) { + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. + function last(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return rest(array, Math.max(0, array.length - n)); + } + + return last; + +}); diff --git a/src/node_modules/underscore/amd/lastIndexOf.js b/src/node_modules/underscore/amd/lastIndexOf.js new file mode 100644 index 0000000..da1c8b5 --- /dev/null +++ b/src/node_modules/underscore/amd/lastIndexOf.js @@ -0,0 +1,9 @@ +define(['./findLastIndex', './_createIndexFinder'], function (findLastIndex, _createIndexFinder) { + + // Return the position of the last occurrence of an item in an array, + // or -1 if the item is not included in the array. + var lastIndexOf = _createIndexFinder(-1, findLastIndex); + + return lastIndexOf; + +}); diff --git a/src/node_modules/underscore/amd/map.js b/src/node_modules/underscore/amd/map.js new file mode 100644 index 0000000..0a045c0 --- /dev/null +++ b/src/node_modules/underscore/amd/map.js @@ -0,0 +1,18 @@ +define(['./_cb', './_isArrayLike', './keys'], function (_cb, _isArrayLike, keys) { + + // Return the results of applying the iteratee to each element. + function map(obj, iteratee, context) { + iteratee = _cb(iteratee, context); + var _keys = !_isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + } + + return map; + +}); diff --git a/src/node_modules/underscore/amd/mapObject.js b/src/node_modules/underscore/amd/mapObject.js new file mode 100644 index 0000000..abf15a9 --- /dev/null +++ b/src/node_modules/underscore/amd/mapObject.js @@ -0,0 +1,19 @@ +define(['./_cb', './keys'], function (_cb, keys) { + + // Returns the results of applying the `iteratee` to each element of `obj`. + // In contrast to `_.map` it returns an object. + function mapObject(obj, iteratee, context) { + iteratee = _cb(iteratee, context); + var _keys = keys(obj), + length = _keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = _keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + } + + return mapObject; + +}); diff --git a/src/node_modules/underscore/amd/matcher.js b/src/node_modules/underscore/amd/matcher.js new file mode 100644 index 0000000..e5c8578 --- /dev/null +++ b/src/node_modules/underscore/amd/matcher.js @@ -0,0 +1,14 @@ +define(['./extendOwn', './isMatch'], function (extendOwn, isMatch) { + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + function matcher(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; + } + + return matcher; + +}); diff --git a/src/node_modules/underscore/amd/max.js b/src/node_modules/underscore/amd/max.js new file mode 100644 index 0000000..5d56676 --- /dev/null +++ b/src/node_modules/underscore/amd/max.js @@ -0,0 +1,30 @@ +define(['./_isArrayLike', './values', './_cb', './each'], function (_isArrayLike, values, _cb, each) { + + // Return the maximum element (or element-based computation). + function max(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = _isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = _cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; + } + + return max; + +}); diff --git a/src/node_modules/underscore/amd/memoize.js b/src/node_modules/underscore/amd/memoize.js new file mode 100644 index 0000000..ae3d473 --- /dev/null +++ b/src/node_modules/underscore/amd/memoize.js @@ -0,0 +1,17 @@ +define(['./_has'], function (_has) { + + // Memoize an expensive function by storing its results. + function memoize(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!_has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; + } + + return memoize; + +}); diff --git a/src/node_modules/underscore/amd/min.js b/src/node_modules/underscore/amd/min.js new file mode 100644 index 0000000..a298bdb --- /dev/null +++ b/src/node_modules/underscore/amd/min.js @@ -0,0 +1,30 @@ +define(['./_isArrayLike', './values', './_cb', './each'], function (_isArrayLike, values, _cb, each) { + + // Return the minimum element (or element-based computation). + function min(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = _isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = _cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || (computed === Infinity && result === Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; + } + + return min; + +}); diff --git a/src/node_modules/underscore/amd/mixin.js b/src/node_modules/underscore/amd/mixin.js new file mode 100644 index 0000000..a64604a --- /dev/null +++ b/src/node_modules/underscore/amd/mixin.js @@ -0,0 +1,18 @@ +define(['./underscore', './each', './functions', './_setup', './_chainResult'], function (underscore, each, functions, _setup, _chainResult) { + + // Add your own custom functions to the Underscore object. + function mixin(obj) { + each(functions(obj), function(name) { + var func = underscore[name] = obj[name]; + underscore.prototype[name] = function() { + var args = [this._wrapped]; + _setup.push.apply(args, arguments); + return _chainResult(this, func.apply(underscore, args)); + }; + }); + return underscore; + } + + return mixin; + +}); diff --git a/src/node_modules/underscore/amd/negate.js b/src/node_modules/underscore/amd/negate.js new file mode 100644 index 0000000..420113d --- /dev/null +++ b/src/node_modules/underscore/amd/negate.js @@ -0,0 +1,12 @@ +define(function () { + + // Returns a negated version of the passed-in predicate. + function negate(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; + } + + return negate; + +}); diff --git a/src/node_modules/underscore/amd/noop.js b/src/node_modules/underscore/amd/noop.js new file mode 100644 index 0000000..df96fc5 --- /dev/null +++ b/src/node_modules/underscore/amd/noop.js @@ -0,0 +1,8 @@ +define(function () { + + // Predicate-generating function. Often useful outside of Underscore. + function noop(){} + + return noop; + +}); diff --git a/src/node_modules/underscore/amd/now.js b/src/node_modules/underscore/amd/now.js new file mode 100644 index 0000000..a59807a --- /dev/null +++ b/src/node_modules/underscore/amd/now.js @@ -0,0 +1,10 @@ +define(function () { + + // A (possibly faster) way to get the current timestamp as an integer. + var now = Date.now || function() { + return new Date().getTime(); + }; + + return now; + +}); diff --git a/src/node_modules/underscore/amd/object.js b/src/node_modules/underscore/amd/object.js new file mode 100644 index 0000000..0286252 --- /dev/null +++ b/src/node_modules/underscore/amd/object.js @@ -0,0 +1,20 @@ +define(['./_getLength'], function (_getLength) { + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. Passing by pairs is the reverse of `_.pairs`. + function object(list, values) { + var result = {}; + for (var i = 0, length = _getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + } + + return object; + +}); diff --git a/src/node_modules/underscore/amd/omit.js b/src/node_modules/underscore/amd/omit.js new file mode 100644 index 0000000..81d691c --- /dev/null +++ b/src/node_modules/underscore/amd/omit.js @@ -0,0 +1,20 @@ +define(['./restArguments', './isFunction', './negate', './map', './_flatten', './contains', './pick'], function (restArguments, isFunction, negate, map, _flatten, contains, pick) { + + // Return a copy of the object without the disallowed properties. + var omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (isFunction(iteratee)) { + iteratee = negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = map(_flatten(keys, false, false), String); + iteratee = function(value, key) { + return !contains(keys, key); + }; + } + return pick(obj, iteratee, context); + }); + + return omit; + +}); diff --git a/src/node_modules/underscore/amd/once.js b/src/node_modules/underscore/amd/once.js new file mode 100644 index 0000000..4fc1ddf --- /dev/null +++ b/src/node_modules/underscore/amd/once.js @@ -0,0 +1,9 @@ +define(['./partial', './before'], function (partial, before) { + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + var once = partial(before, 2); + + return once; + +}); diff --git a/src/node_modules/underscore/amd/pairs.js b/src/node_modules/underscore/amd/pairs.js new file mode 100644 index 0000000..4757681 --- /dev/null +++ b/src/node_modules/underscore/amd/pairs.js @@ -0,0 +1,17 @@ +define(['./keys'], function (keys) { + + // Convert an object into a list of `[key, value]` pairs. + // The opposite of `_.object` with one argument. + function pairs(obj) { + var _keys = keys(obj); + var length = _keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [_keys[i], obj[_keys[i]]]; + } + return pairs; + } + + return pairs; + +}); diff --git a/src/node_modules/underscore/amd/partial.js b/src/node_modules/underscore/amd/partial.js new file mode 100644 index 0000000..64f95df --- /dev/null +++ b/src/node_modules/underscore/amd/partial.js @@ -0,0 +1,25 @@ +define(['./restArguments', './_executeBound', './underscore'], function (restArguments, _executeBound, underscore) { + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. `_` acts + // as a placeholder by default, allowing any combination of arguments to be + // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. + var partial = restArguments(function(func, boundArgs) { + var placeholder = partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return _executeBound(func, bound, this, this, args); + }; + return bound; + }); + + partial.placeholder = underscore; + + return partial; + +}); diff --git a/src/node_modules/underscore/amd/partition.js b/src/node_modules/underscore/amd/partition.js new file mode 100644 index 0000000..a87e5fb --- /dev/null +++ b/src/node_modules/underscore/amd/partition.js @@ -0,0 +1,11 @@ +define(['./_group'], function (_group) { + + // Split a collection into two arrays: one whose elements all pass the given + // truth test, and one whose elements all do not pass the truth test. + var partition = _group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); + }, true); + + return partition; + +}); diff --git a/src/node_modules/underscore/amd/pick.js b/src/node_modules/underscore/amd/pick.js new file mode 100644 index 0000000..1d4d89a --- /dev/null +++ b/src/node_modules/underscore/amd/pick.js @@ -0,0 +1,25 @@ +define(['./restArguments', './isFunction', './_optimizeCb', './allKeys', './_keyInObj', './_flatten'], function (restArguments, isFunction, _optimizeCb, allKeys, _keyInObj, _flatten) { + + // Return a copy of the object only containing the allowed properties. + var pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (isFunction(iteratee)) { + if (keys.length > 1) iteratee = _optimizeCb(iteratee, keys[1]); + keys = allKeys(obj); + } else { + iteratee = _keyInObj; + keys = _flatten(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }); + + return pick; + +}); diff --git a/src/node_modules/underscore/amd/pluck.js b/src/node_modules/underscore/amd/pluck.js new file mode 100644 index 0000000..d93d80c --- /dev/null +++ b/src/node_modules/underscore/amd/pluck.js @@ -0,0 +1,10 @@ +define(['./map', './property'], function (map, property) { + + // Convenience version of a common use case of `_.map`: fetching a property. + function pluck(obj, key) { + return map(obj, property(key)); + } + + return pluck; + +}); diff --git a/src/node_modules/underscore/amd/property.js b/src/node_modules/underscore/amd/property.js new file mode 100644 index 0000000..94c6ccc --- /dev/null +++ b/src/node_modules/underscore/amd/property.js @@ -0,0 +1,14 @@ +define(['./_deepGet', './_toPath'], function (_deepGet, _toPath) { + + // Creates a function that, when passed an object, will traverse that object’s + // properties down the given `path`, specified as an array of keys or indices. + function property(path) { + path = _toPath(path); + return function(obj) { + return _deepGet(obj, path); + }; + } + + return property; + +}); diff --git a/src/node_modules/underscore/amd/propertyOf.js b/src/node_modules/underscore/amd/propertyOf.js new file mode 100644 index 0000000..13cfb75 --- /dev/null +++ b/src/node_modules/underscore/amd/propertyOf.js @@ -0,0 +1,13 @@ +define(['./noop', './get'], function (noop, get) { + + // Generates a function for a given object that returns a given property. + function propertyOf(obj) { + if (obj == null) return noop; + return function(path) { + return get(obj, path); + }; + } + + return propertyOf; + +}); diff --git a/src/node_modules/underscore/amd/random.js b/src/node_modules/underscore/amd/random.js new file mode 100644 index 0000000..ba82815 --- /dev/null +++ b/src/node_modules/underscore/amd/random.js @@ -0,0 +1,14 @@ +define(function () { + + // Return a random integer between `min` and `max` (inclusive). + function random(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + } + + return random; + +}); diff --git a/src/node_modules/underscore/amd/range.js b/src/node_modules/underscore/amd/range.js new file mode 100644 index 0000000..47eb9ed --- /dev/null +++ b/src/node_modules/underscore/amd/range.js @@ -0,0 +1,27 @@ +define(function () { + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](https://docs.python.org/library/functions.html#range). + function range(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; + } + + return range; + +}); diff --git a/src/node_modules/underscore/amd/reduce.js b/src/node_modules/underscore/amd/reduce.js new file mode 100644 index 0000000..2aae8ca --- /dev/null +++ b/src/node_modules/underscore/amd/reduce.js @@ -0,0 +1,9 @@ +define(['./_createReduce'], function (_createReduce) { + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. + var reduce = _createReduce(1); + + return reduce; + +}); diff --git a/src/node_modules/underscore/amd/reduceRight.js b/src/node_modules/underscore/amd/reduceRight.js new file mode 100644 index 0000000..ccb1739 --- /dev/null +++ b/src/node_modules/underscore/amd/reduceRight.js @@ -0,0 +1,8 @@ +define(['./_createReduce'], function (_createReduce) { + + // The right-associative version of reduce, also known as `foldr`. + var reduceRight = _createReduce(-1); + + return reduceRight; + +}); diff --git a/src/node_modules/underscore/amd/reject.js b/src/node_modules/underscore/amd/reject.js new file mode 100644 index 0000000..acc91cf --- /dev/null +++ b/src/node_modules/underscore/amd/reject.js @@ -0,0 +1,10 @@ +define(['./filter', './negate', './_cb'], function (filter, negate, _cb) { + + // Return all the elements for which a truth test fails. + function reject(obj, predicate, context) { + return filter(obj, negate(_cb(predicate)), context); + } + + return reject; + +}); diff --git a/src/node_modules/underscore/amd/rest.js b/src/node_modules/underscore/amd/rest.js new file mode 100644 index 0000000..ecf6b74 --- /dev/null +++ b/src/node_modules/underscore/amd/rest.js @@ -0,0 +1,12 @@ +define(['./_setup'], function (_setup) { + + // Returns everything but the first entry of the `array`. Especially useful on + // the `arguments` object. Passing an **n** will return the rest N values in the + // `array`. + function rest(array, n, guard) { + return _setup.slice.call(array, n == null || guard ? 1 : n); + } + + return rest; + +}); diff --git a/src/node_modules/underscore/amd/restArguments.js b/src/node_modules/underscore/amd/restArguments.js new file mode 100644 index 0000000..dd71274 --- /dev/null +++ b/src/node_modules/underscore/amd/restArguments.js @@ -0,0 +1,33 @@ +define(function () { + + // Some functions take a variable number of arguments, or a few expected + // arguments at the beginning and then a variable number of values to operate + // on. This helper accumulates all remaining arguments past the function’s + // argument length (or an explicit `startIndex`), into an array that becomes + // the last argument. Similar to ES6’s "rest parameter". + function restArguments(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; + } + + return restArguments; + +}); diff --git a/src/node_modules/underscore/amd/result.js b/src/node_modules/underscore/amd/result.js new file mode 100644 index 0000000..093a911 --- /dev/null +++ b/src/node_modules/underscore/amd/result.js @@ -0,0 +1,25 @@ +define(['./isFunction', './_toPath'], function (isFunction, _toPath) { + + // Traverses the children of `obj` along `path`. If a child is a function, it + // is invoked with its parent as context. Returns the value of the final + // child, or `fallback` if any child is undefined. + function result(obj, path, fallback) { + path = _toPath(path); + var length = path.length; + if (!length) { + return isFunction(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = isFunction(prop) ? prop.call(obj) : prop; + } + return obj; + } + + return result; + +}); diff --git a/src/node_modules/underscore/amd/sample.js b/src/node_modules/underscore/amd/sample.js new file mode 100644 index 0000000..0189bb5 --- /dev/null +++ b/src/node_modules/underscore/amd/sample.js @@ -0,0 +1,27 @@ +define(['./_isArrayLike', './values', './_getLength', './random', './toArray'], function (_isArrayLike, values, _getLength, random, toArray) { + + // Sample **n** random values from a collection using the modern version of the + // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `_.map`. + function sample(obj, n, guard) { + if (n == null || guard) { + if (!_isArrayLike(obj)) obj = values(obj); + return obj[random(obj.length - 1)]; + } + var sample = toArray(obj); + var length = _getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); + } + + return sample; + +}); diff --git a/src/node_modules/underscore/amd/shuffle.js b/src/node_modules/underscore/amd/shuffle.js new file mode 100644 index 0000000..ff14021 --- /dev/null +++ b/src/node_modules/underscore/amd/shuffle.js @@ -0,0 +1,10 @@ +define(['./sample'], function (sample) { + + // Shuffle a collection. + function shuffle(obj) { + return sample(obj, Infinity); + } + + return shuffle; + +}); diff --git a/src/node_modules/underscore/amd/size.js b/src/node_modules/underscore/amd/size.js new file mode 100644 index 0000000..b741f4e --- /dev/null +++ b/src/node_modules/underscore/amd/size.js @@ -0,0 +1,11 @@ +define(['./_isArrayLike', './keys'], function (_isArrayLike, keys) { + + // Return the number of elements in a collection. + function size(obj) { + if (obj == null) return 0; + return _isArrayLike(obj) ? obj.length : keys(obj).length; + } + + return size; + +}); diff --git a/src/node_modules/underscore/amd/some.js b/src/node_modules/underscore/amd/some.js new file mode 100644 index 0000000..bb4e966 --- /dev/null +++ b/src/node_modules/underscore/amd/some.js @@ -0,0 +1,17 @@ +define(['./_cb', './_isArrayLike', './keys'], function (_cb, _isArrayLike, keys) { + + // Determine if at least one element in the object passes a truth test. + function some(obj, predicate, context) { + predicate = _cb(predicate, context); + var _keys = !_isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; + } + + return some; + +}); diff --git a/src/node_modules/underscore/amd/sortBy.js b/src/node_modules/underscore/amd/sortBy.js new file mode 100644 index 0000000..a4af6cb --- /dev/null +++ b/src/node_modules/underscore/amd/sortBy.js @@ -0,0 +1,26 @@ +define(['./_cb', './pluck', './map'], function (_cb, pluck, map) { + + // Sort the object's values by a criterion produced by an iteratee. + function sortBy(obj, iteratee, context) { + var index = 0; + iteratee = _cb(iteratee, context); + return pluck(map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + } + + return sortBy; + +}); diff --git a/src/node_modules/underscore/amd/sortedIndex.js b/src/node_modules/underscore/amd/sortedIndex.js new file mode 100644 index 0000000..83aac9e --- /dev/null +++ b/src/node_modules/underscore/amd/sortedIndex.js @@ -0,0 +1,18 @@ +define(['./_cb', './_getLength'], function (_cb, _getLength) { + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + function sortedIndex(array, obj, iteratee, context) { + iteratee = _cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = _getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; + } + + return sortedIndex; + +}); diff --git a/src/node_modules/underscore/amd/tap.js b/src/node_modules/underscore/amd/tap.js new file mode 100644 index 0000000..8605d10 --- /dev/null +++ b/src/node_modules/underscore/amd/tap.js @@ -0,0 +1,13 @@ +define(function () { + + // Invokes `interceptor` with the `obj` and then returns `obj`. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + function tap(obj, interceptor) { + interceptor(obj); + return obj; + } + + return tap; + +}); diff --git a/src/node_modules/underscore/amd/template.js b/src/node_modules/underscore/amd/template.js new file mode 100644 index 0000000..65695ba --- /dev/null +++ b/src/node_modules/underscore/amd/template.js @@ -0,0 +1,103 @@ +define(['./defaults', './underscore', './templateSettings'], function (defaults, underscore, templateSettings) { + + // When customizing `_.templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + + function escapeChar(match) { + return '\\' + escapes[match]; + } + + // In order to prevent third-party code injection through + // `_.templateSettings.variable`, we test it against the following regular + // expression. It is intentionally a bit more liberal than just matching valid + // identifiers, but still prevents possible loopholes through defaults or + // destructuring assignment. + var bareIdentifier = /^\s*(\w|\$)+\s*$/; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + // NB: `oldSettings` only exists for backwards compatibility. + function template(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = defaults({}, settings, underscore.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(argument, '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, underscore); + }; + + // Provide the compiled source as a convenience for precompilation. + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; + } + + return template; + +}); diff --git a/src/node_modules/underscore/amd/templateSettings.js b/src/node_modules/underscore/amd/templateSettings.js new file mode 100644 index 0000000..94abcb5 --- /dev/null +++ b/src/node_modules/underscore/amd/templateSettings.js @@ -0,0 +1,13 @@ +define(['./underscore'], function (underscore) { + + // By default, Underscore uses ERB-style template delimiters. Change the + // following template settings to use alternative delimiters. + var templateSettings = underscore.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g + }; + + return templateSettings; + +}); diff --git a/src/node_modules/underscore/amd/throttle.js b/src/node_modules/underscore/amd/throttle.js new file mode 100644 index 0000000..555100a --- /dev/null +++ b/src/node_modules/underscore/amd/throttle.js @@ -0,0 +1,51 @@ +define(['./now'], function (now) { + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var _now = now(); + if (!previous && options.leading === false) previous = _now; + var remaining = wait - (_now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = _now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; + } + + return throttle; + +}); diff --git a/src/node_modules/underscore/amd/times.js b/src/node_modules/underscore/amd/times.js new file mode 100644 index 0000000..d70145d --- /dev/null +++ b/src/node_modules/underscore/amd/times.js @@ -0,0 +1,13 @@ +define(['./_optimizeCb'], function (_optimizeCb) { + + // Run a function **n** times. + function times(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = _optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; + } + + return times; + +}); diff --git a/src/node_modules/underscore/amd/toArray.js b/src/node_modules/underscore/amd/toArray.js new file mode 100644 index 0000000..27b4169 --- /dev/null +++ b/src/node_modules/underscore/amd/toArray.js @@ -0,0 +1,18 @@ +define(['./isArray', './_setup', './isString', './_isArrayLike', './map', './identity', './values'], function (isArray, _setup, isString, _isArrayLike, map, identity, values) { + + // Safely create a real, live array from anything iterable. + var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; + function toArray(obj) { + if (!obj) return []; + if (isArray(obj)) return _setup.slice.call(obj); + if (isString(obj)) { + // Keep surrogate pair characters together. + return obj.match(reStrSymbol); + } + if (_isArrayLike(obj)) return map(obj, identity); + return values(obj); + } + + return toArray; + +}); diff --git a/src/node_modules/underscore/amd/toPath.js b/src/node_modules/underscore/amd/toPath.js new file mode 100644 index 0000000..e2dfb23 --- /dev/null +++ b/src/node_modules/underscore/amd/toPath.js @@ -0,0 +1,12 @@ +define(['./underscore', './isArray'], function (underscore, isArray) { + + // Normalize a (deep) property `path` to array. + // Like `_.iteratee`, this function can be customized. + function toPath(path) { + return isArray(path) ? path : [path]; + } + underscore.toPath = toPath; + + return toPath; + +}); diff --git a/src/node_modules/underscore/amd/underscore-array-methods.js b/src/node_modules/underscore/amd/underscore-array-methods.js new file mode 100644 index 0000000..bb56875 --- /dev/null +++ b/src/node_modules/underscore/amd/underscore-array-methods.js @@ -0,0 +1,30 @@ +define(['./underscore', './each', './_setup', './_chainResult'], function (underscore, each, _setup, _chainResult) { + + // Add all mutator `Array` functions to the wrapper. + each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = _setup.ArrayProto[name]; + underscore.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) { + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) { + delete obj[0]; + } + } + return _chainResult(this, obj); + }; + }); + + // Add all accessor `Array` functions to the wrapper. + each(['concat', 'join', 'slice'], function(name) { + var method = _setup.ArrayProto[name]; + underscore.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) obj = method.apply(obj, arguments); + return _chainResult(this, obj); + }; + }); + + return underscore; + +}); diff --git a/src/node_modules/underscore/amd/underscore.js b/src/node_modules/underscore/amd/underscore.js new file mode 100644 index 0000000..03492ab --- /dev/null +++ b/src/node_modules/underscore/amd/underscore.js @@ -0,0 +1,29 @@ +define(['./_setup'], function (_setup) { + + // If Underscore is called as a function, it returns a wrapped object that can + // be used OO-style. This wrapper holds altered versions of all functions added + // through `_.mixin`. Wrapped objects may be chained. + function _(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; + } + + _.VERSION = _setup.VERSION; + + // Extracts the result from a wrapped and chained object. + _.prototype.value = function() { + return this._wrapped; + }; + + // Provide unwrapping proxies for some methods used in engine operations + // such as arithmetic and JSON stringification. + _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; + + _.prototype.toString = function() { + return String(this._wrapped); + }; + + return _; + +}); diff --git a/src/node_modules/underscore/amd/unescape.js b/src/node_modules/underscore/amd/unescape.js new file mode 100644 index 0000000..b48d444 --- /dev/null +++ b/src/node_modules/underscore/amd/unescape.js @@ -0,0 +1,8 @@ +define(['./_createEscaper', './_unescapeMap'], function (_createEscaper, _unescapeMap) { + + // Function for unescaping strings from HTML interpolation. + var _unescape = _createEscaper(_unescapeMap); + + return _unescape; + +}); diff --git a/src/node_modules/underscore/amd/union.js b/src/node_modules/underscore/amd/union.js new file mode 100644 index 0000000..67884ba --- /dev/null +++ b/src/node_modules/underscore/amd/union.js @@ -0,0 +1,11 @@ +define(['./restArguments', './uniq', './_flatten'], function (restArguments, uniq, _flatten) { + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + var union = restArguments(function(arrays) { + return uniq(_flatten(arrays, true, true)); + }); + + return union; + +}); diff --git a/src/node_modules/underscore/amd/uniq.js b/src/node_modules/underscore/amd/uniq.js new file mode 100644 index 0000000..5e05e41 --- /dev/null +++ b/src/node_modules/underscore/amd/uniq.js @@ -0,0 +1,37 @@ +define(['./isBoolean', './_cb', './_getLength', './contains'], function (isBoolean, _cb, _getLength, contains) { + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // The faster algorithm will not work with an iteratee if the iteratee + // is not a one-to-one function, so providing an iteratee will disable + // the faster algorithm. + function uniq(array, isSorted, iteratee, context) { + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = _cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = _getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!contains(result, value)) { + result.push(value); + } + } + return result; + } + + return uniq; + +}); diff --git a/src/node_modules/underscore/amd/uniqueId.js b/src/node_modules/underscore/amd/uniqueId.js new file mode 100644 index 0000000..4c99d64 --- /dev/null +++ b/src/node_modules/underscore/amd/uniqueId.js @@ -0,0 +1,13 @@ +define(function () { + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + } + + return uniqueId; + +}); diff --git a/src/node_modules/underscore/amd/unzip.js b/src/node_modules/underscore/amd/unzip.js new file mode 100644 index 0000000..2823223 --- /dev/null +++ b/src/node_modules/underscore/amd/unzip.js @@ -0,0 +1,17 @@ +define(['./max', './_getLength', './pluck'], function (max, _getLength, pluck) { + + // Complement of zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices. + function unzip(array) { + var length = (array && max(array, _getLength).length) || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = pluck(array, index); + } + return result; + } + + return unzip; + +}); diff --git a/src/node_modules/underscore/amd/values.js b/src/node_modules/underscore/amd/values.js new file mode 100644 index 0000000..f42830a --- /dev/null +++ b/src/node_modules/underscore/amd/values.js @@ -0,0 +1,16 @@ +define(['./keys'], function (keys) { + + // Retrieve the values of an object's properties. + function values(obj) { + var _keys = keys(obj); + var length = _keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[_keys[i]]; + } + return values; + } + + return values; + +}); diff --git a/src/node_modules/underscore/amd/where.js b/src/node_modules/underscore/amd/where.js new file mode 100644 index 0000000..a9d8b25 --- /dev/null +++ b/src/node_modules/underscore/amd/where.js @@ -0,0 +1,11 @@ +define(['./filter', './matcher'], function (filter, matcher) { + + // Convenience version of a common use case of `_.filter`: selecting only + // objects containing specific `key:value` pairs. + function where(obj, attrs) { + return filter(obj, matcher(attrs)); + } + + return where; + +}); diff --git a/src/node_modules/underscore/amd/without.js b/src/node_modules/underscore/amd/without.js new file mode 100644 index 0000000..eb0ac62 --- /dev/null +++ b/src/node_modules/underscore/amd/without.js @@ -0,0 +1,10 @@ +define(['./restArguments', './difference'], function (restArguments, difference) { + + // Return a version of the array that does not contain the specified value(s). + var without = restArguments(function(array, otherArrays) { + return difference(array, otherArrays); + }); + + return without; + +}); diff --git a/src/node_modules/underscore/amd/wrap.js b/src/node_modules/underscore/amd/wrap.js new file mode 100644 index 0000000..25f1995 --- /dev/null +++ b/src/node_modules/underscore/amd/wrap.js @@ -0,0 +1,12 @@ +define(['./partial'], function (partial) { + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + function wrap(func, wrapper) { + return partial(wrapper, func); + } + + return wrap; + +}); diff --git a/src/node_modules/underscore/amd/zip.js b/src/node_modules/underscore/amd/zip.js new file mode 100644 index 0000000..25e61fe --- /dev/null +++ b/src/node_modules/underscore/amd/zip.js @@ -0,0 +1,9 @@ +define(['./restArguments', './unzip'], function (restArguments, unzip) { + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + var zip = restArguments(unzip); + + return zip; + +}); diff --git a/src/node_modules/underscore/cjs/_baseCreate.js b/src/node_modules/underscore/cjs/_baseCreate.js new file mode 100644 index 0000000..aacc4f4 --- /dev/null +++ b/src/node_modules/underscore/cjs/_baseCreate.js @@ -0,0 +1,20 @@ +var isObject = require('./isObject.js'); +var _setup = require('./_setup.js'); + +// Create a naked function reference for surrogate-prototype-swapping. +function ctor() { + return function(){}; +} + +// An internal function for creating a new object that inherits from another. +function baseCreate(prototype) { + if (!isObject(prototype)) return {}; + if (_setup.nativeCreate) return _setup.nativeCreate(prototype); + var Ctor = ctor(); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; +} + +module.exports = baseCreate; diff --git a/src/node_modules/underscore/cjs/_baseIteratee.js b/src/node_modules/underscore/cjs/_baseIteratee.js new file mode 100644 index 0000000..a826d1a --- /dev/null +++ b/src/node_modules/underscore/cjs/_baseIteratee.js @@ -0,0 +1,19 @@ +var identity = require('./identity.js'); +var isFunction = require('./isFunction.js'); +var isObject = require('./isObject.js'); +var isArray = require('./isArray.js'); +var matcher = require('./matcher.js'); +var property = require('./property.js'); +var _optimizeCb = require('./_optimizeCb.js'); + +// An internal function to generate callbacks that can be applied to each +// element in a collection, returning the desired result — either `_.identity`, +// an arbitrary callback, a property matcher, or a property accessor. +function baseIteratee(value, context, argCount) { + if (value == null) return identity; + if (isFunction(value)) return _optimizeCb(value, context, argCount); + if (isObject(value) && !isArray(value)) return matcher(value); + return property(value); +} + +module.exports = baseIteratee; diff --git a/src/node_modules/underscore/cjs/_cb.js b/src/node_modules/underscore/cjs/_cb.js new file mode 100644 index 0000000..8b5d389 --- /dev/null +++ b/src/node_modules/underscore/cjs/_cb.js @@ -0,0 +1,12 @@ +var underscore = require('./underscore.js'); +var _baseIteratee = require('./_baseIteratee.js'); +var iteratee = require('./iteratee.js'); + +// The function we call internally to generate a callback. It invokes +// `_.iteratee` if overridden, otherwise `baseIteratee`. +function cb(value, context, argCount) { + if (underscore.iteratee !== iteratee) return underscore.iteratee(value, context); + return _baseIteratee(value, context, argCount); +} + +module.exports = cb; diff --git a/src/node_modules/underscore/cjs/_chainResult.js b/src/node_modules/underscore/cjs/_chainResult.js new file mode 100644 index 0000000..8670e3d --- /dev/null +++ b/src/node_modules/underscore/cjs/_chainResult.js @@ -0,0 +1,8 @@ +var underscore = require('./underscore.js'); + +// Helper function to continue chaining intermediate results. +function chainResult(instance, obj) { + return instance._chain ? underscore(obj).chain() : obj; +} + +module.exports = chainResult; diff --git a/src/node_modules/underscore/cjs/_collectNonEnumProps.js b/src/node_modules/underscore/cjs/_collectNonEnumProps.js new file mode 100644 index 0000000..6e62c91 --- /dev/null +++ b/src/node_modules/underscore/cjs/_collectNonEnumProps.js @@ -0,0 +1,42 @@ +var _setup = require('./_setup.js'); +var isFunction = require('./isFunction.js'); +var _has = require('./_has.js'); + +// Internal helper to create a simple lookup structure. +// `collectNonEnumProps` used to depend on `_.contains`, but this led to +// circular imports. `emulatedSet` is a one-off solution that only works for +// arrays of strings. +function emulatedSet(keys) { + var hash = {}; + for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; + return { + contains: function(key) { return hash[key] === true; }, + push: function(key) { + hash[key] = true; + return keys.push(key); + } + }; +} + +// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't +// be iterated by `for key in ...` and thus missed. Extends `keys` in place if +// needed. +function collectNonEnumProps(obj, keys) { + keys = emulatedSet(keys); + var nonEnumIdx = _setup.nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (isFunction(constructor) && constructor.prototype) || _setup.ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (_has(obj, prop) && !keys.contains(prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = _setup.nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { + keys.push(prop); + } + } +} + +module.exports = collectNonEnumProps; diff --git a/src/node_modules/underscore/cjs/_createAssigner.js b/src/node_modules/underscore/cjs/_createAssigner.js new file mode 100644 index 0000000..13fa0dd --- /dev/null +++ b/src/node_modules/underscore/cjs/_createAssigner.js @@ -0,0 +1,20 @@ +// An internal function for creating assigner functions. +function createAssigner(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; +} + +module.exports = createAssigner; diff --git a/src/node_modules/underscore/cjs/_createEscaper.js b/src/node_modules/underscore/cjs/_createEscaper.js new file mode 100644 index 0000000..c3b7ac4 --- /dev/null +++ b/src/node_modules/underscore/cjs/_createEscaper.js @@ -0,0 +1,19 @@ +var keys = require('./keys.js'); + +// Internal helper to generate functions for escaping and unescaping strings +// to/from HTML interpolation. +function createEscaper(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; +} + +module.exports = createEscaper; diff --git a/src/node_modules/underscore/cjs/_createIndexFinder.js b/src/node_modules/underscore/cjs/_createIndexFinder.js new file mode 100644 index 0000000..7f39039 --- /dev/null +++ b/src/node_modules/underscore/cjs/_createIndexFinder.js @@ -0,0 +1,30 @@ +var _getLength = require('./_getLength.js'); +var _setup = require('./_setup.js'); +var _isNaN = require('./isNaN.js'); + +// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. +function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = _getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(_setup.slice.call(array, i, length), _isNaN); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; +} + +module.exports = createIndexFinder; diff --git a/src/node_modules/underscore/cjs/_createPredicateIndexFinder.js b/src/node_modules/underscore/cjs/_createPredicateIndexFinder.js new file mode 100644 index 0000000..e954419 --- /dev/null +++ b/src/node_modules/underscore/cjs/_createPredicateIndexFinder.js @@ -0,0 +1,17 @@ +var _cb = require('./_cb.js'); +var _getLength = require('./_getLength.js'); + +// Internal function to generate `_.findIndex` and `_.findLastIndex`. +function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = _cb(predicate, context); + var length = _getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; +} + +module.exports = createPredicateIndexFinder; diff --git a/src/node_modules/underscore/cjs/_createReduce.js b/src/node_modules/underscore/cjs/_createReduce.js new file mode 100644 index 0000000..fb24608 --- /dev/null +++ b/src/node_modules/underscore/cjs/_createReduce.js @@ -0,0 +1,30 @@ +var _isArrayLike = require('./_isArrayLike.js'); +var keys = require('./keys.js'); +var _optimizeCb = require('./_optimizeCb.js'); + +// Internal helper to create a reducing function, iterating left or right. +function createReduce(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var _keys = !_isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[_keys ? _keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = _keys ? _keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, _optimizeCb(iteratee, context, 4), memo, initial); + }; +} + +module.exports = createReduce; diff --git a/src/node_modules/underscore/cjs/_createSizePropertyCheck.js b/src/node_modules/underscore/cjs/_createSizePropertyCheck.js new file mode 100644 index 0000000..7271129 --- /dev/null +++ b/src/node_modules/underscore/cjs/_createSizePropertyCheck.js @@ -0,0 +1,11 @@ +var _setup = require('./_setup.js'); + +// Common internal logic for `isArrayLike` and `isBufferLike`. +function createSizePropertyCheck(getSizeProperty) { + return function(collection) { + var sizeProperty = getSizeProperty(collection); + return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= _setup.MAX_ARRAY_INDEX; + } +} + +module.exports = createSizePropertyCheck; diff --git a/src/node_modules/underscore/cjs/_deepGet.js b/src/node_modules/underscore/cjs/_deepGet.js new file mode 100644 index 0000000..9017058 --- /dev/null +++ b/src/node_modules/underscore/cjs/_deepGet.js @@ -0,0 +1,11 @@ +// Internal function to obtain a nested property in `obj` along `path`. +function deepGet(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; +} + +module.exports = deepGet; diff --git a/src/node_modules/underscore/cjs/_escapeMap.js b/src/node_modules/underscore/cjs/_escapeMap.js new file mode 100644 index 0000000..821501e --- /dev/null +++ b/src/node_modules/underscore/cjs/_escapeMap.js @@ -0,0 +1,11 @@ +// Internal list of HTML entities for escaping. +var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' +}; + +module.exports = escapeMap; diff --git a/src/node_modules/underscore/cjs/_executeBound.js b/src/node_modules/underscore/cjs/_executeBound.js new file mode 100644 index 0000000..de0220e --- /dev/null +++ b/src/node_modules/underscore/cjs/_executeBound.js @@ -0,0 +1,15 @@ +var _baseCreate = require('./_baseCreate.js'); +var isObject = require('./isObject.js'); + +// Internal function to execute `sourceFunc` bound to `context` with optional +// `args`. Determines whether to execute a function as a constructor or as a +// normal function. +function executeBound(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = _baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (isObject(result)) return result; + return self; +} + +module.exports = executeBound; diff --git a/src/node_modules/underscore/cjs/_flatten.js b/src/node_modules/underscore/cjs/_flatten.js new file mode 100644 index 0000000..830221d --- /dev/null +++ b/src/node_modules/underscore/cjs/_flatten.js @@ -0,0 +1,33 @@ +var _getLength = require('./_getLength.js'); +var _isArrayLike = require('./_isArrayLike.js'); +var isArray = require('./isArray.js'); +var isArguments = require('./isArguments.js'); + +// Internal implementation of a recursive `flatten` function. +function flatten(input, depth, strict, output) { + output = output || []; + if (!depth && depth !== 0) { + depth = Infinity; + } else if (depth <= 0) { + return output.concat(input); + } + var idx = output.length; + for (var i = 0, length = _getLength(input); i < length; i++) { + var value = input[i]; + if (_isArrayLike(value) && (isArray(value) || isArguments(value))) { + // Flatten current level of array or arguments object. + if (depth > 1) { + flatten(value, depth - 1, strict, output); + idx = output.length; + } else { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; +} + +module.exports = flatten; diff --git a/src/node_modules/underscore/cjs/_getByteLength.js b/src/node_modules/underscore/cjs/_getByteLength.js new file mode 100644 index 0000000..49acd7f --- /dev/null +++ b/src/node_modules/underscore/cjs/_getByteLength.js @@ -0,0 +1,6 @@ +var _shallowProperty = require('./_shallowProperty.js'); + +// Internal helper to obtain the `byteLength` property of an object. +var getByteLength = _shallowProperty('byteLength'); + +module.exports = getByteLength; diff --git a/src/node_modules/underscore/cjs/_getLength.js b/src/node_modules/underscore/cjs/_getLength.js new file mode 100644 index 0000000..1ad7092 --- /dev/null +++ b/src/node_modules/underscore/cjs/_getLength.js @@ -0,0 +1,6 @@ +var _shallowProperty = require('./_shallowProperty.js'); + +// Internal helper to obtain the `length` property of an object. +var getLength = _shallowProperty('length'); + +module.exports = getLength; diff --git a/src/node_modules/underscore/cjs/_group.js b/src/node_modules/underscore/cjs/_group.js new file mode 100644 index 0000000..cb1f5a8 --- /dev/null +++ b/src/node_modules/underscore/cjs/_group.js @@ -0,0 +1,17 @@ +var _cb = require('./_cb.js'); +var each = require('./each.js'); + +// An internal function used for aggregate "group by" operations. +function group(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = _cb(iteratee, context); + each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; +} + +module.exports = group; diff --git a/src/node_modules/underscore/cjs/_has.js b/src/node_modules/underscore/cjs/_has.js new file mode 100644 index 0000000..6540346 --- /dev/null +++ b/src/node_modules/underscore/cjs/_has.js @@ -0,0 +1,8 @@ +var _setup = require('./_setup.js'); + +// Internal function to check whether `key` is an own property name of `obj`. +function has(obj, key) { + return obj != null && _setup.hasOwnProperty.call(obj, key); +} + +module.exports = has; diff --git a/src/node_modules/underscore/cjs/_hasObjectTag.js b/src/node_modules/underscore/cjs/_hasObjectTag.js new file mode 100644 index 0000000..fb71452 --- /dev/null +++ b/src/node_modules/underscore/cjs/_hasObjectTag.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var hasObjectTag = _tagTester('Object'); + +module.exports = hasObjectTag; diff --git a/src/node_modules/underscore/cjs/_isArrayLike.js b/src/node_modules/underscore/cjs/_isArrayLike.js new file mode 100644 index 0000000..b835307 --- /dev/null +++ b/src/node_modules/underscore/cjs/_isArrayLike.js @@ -0,0 +1,10 @@ +var _createSizePropertyCheck = require('./_createSizePropertyCheck.js'); +var _getLength = require('./_getLength.js'); + +// Internal helper for collection methods to determine whether a collection +// should be iterated as an array or as an object. +// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength +// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 +var isArrayLike = _createSizePropertyCheck(_getLength); + +module.exports = isArrayLike; diff --git a/src/node_modules/underscore/cjs/_isBufferLike.js b/src/node_modules/underscore/cjs/_isBufferLike.js new file mode 100644 index 0000000..bf919aa --- /dev/null +++ b/src/node_modules/underscore/cjs/_isBufferLike.js @@ -0,0 +1,8 @@ +var _createSizePropertyCheck = require('./_createSizePropertyCheck.js'); +var _getByteLength = require('./_getByteLength.js'); + +// Internal helper to determine whether we should spend extensive checks against +// `ArrayBuffer` et al. +var isBufferLike = _createSizePropertyCheck(_getByteLength); + +module.exports = isBufferLike; diff --git a/src/node_modules/underscore/cjs/_keyInObj.js b/src/node_modules/underscore/cjs/_keyInObj.js new file mode 100644 index 0000000..12adc82 --- /dev/null +++ b/src/node_modules/underscore/cjs/_keyInObj.js @@ -0,0 +1,7 @@ +// Internal `_.pick` helper function to determine whether `key` is an enumerable +// property name of `obj`. +function keyInObj(value, key, obj) { + return key in obj; +} + +module.exports = keyInObj; diff --git a/src/node_modules/underscore/cjs/_methodFingerprint.js b/src/node_modules/underscore/cjs/_methodFingerprint.js new file mode 100644 index 0000000..26028c9 --- /dev/null +++ b/src/node_modules/underscore/cjs/_methodFingerprint.js @@ -0,0 +1,44 @@ +Object.defineProperty(exports, '__esModule', { value: true }); + +var _getLength = require('./_getLength.js'); +var isFunction = require('./isFunction.js'); +var allKeys = require('./allKeys.js'); + +// Since the regular `Object.prototype.toString` type tests don't work for +// some types in IE 11, we use a fingerprinting heuristic instead, based +// on the methods. It's not great, but it's the best we got. +// The fingerprint method lists are defined below. +function ie11fingerprint(methods) { + var length = _getLength(methods); + return function(obj) { + if (obj == null) return false; + // `Map`, `WeakMap` and `Set` have no enumerable keys. + var keys = allKeys(obj); + if (_getLength(keys)) return false; + for (var i = 0; i < length; i++) { + if (!isFunction(obj[methods[i]])) return false; + } + // If we are testing against `WeakMap`, we need to ensure that + // `obj` doesn't have a `forEach` method in order to distinguish + // it from a regular `Map`. + return methods !== weakMapMethods || !isFunction(obj[forEachName]); + }; +} + +// In the interest of compact minification, we write +// each string in the fingerprints only once. +var forEachName = 'forEach', + hasName = 'has', + commonInit = ['clear', 'delete'], + mapTail = ['get', hasName, 'set']; + +// `Map`, `WeakMap` and `Set` each have slightly different +// combinations of the above sublists. +var mapMethods = commonInit.concat(forEachName, mapTail), + weakMapMethods = commonInit.concat(mapTail), + setMethods = ['add'].concat(commonInit, forEachName, hasName); + +exports.ie11fingerprint = ie11fingerprint; +exports.mapMethods = mapMethods; +exports.setMethods = setMethods; +exports.weakMapMethods = weakMapMethods; diff --git a/src/node_modules/underscore/cjs/_optimizeCb.js b/src/node_modules/underscore/cjs/_optimizeCb.js new file mode 100644 index 0000000..e6c2538 --- /dev/null +++ b/src/node_modules/underscore/cjs/_optimizeCb.js @@ -0,0 +1,23 @@ +// Internal function that returns an efficient (for current engines) version +// of the passed-in callback, to be repeatedly applied in other Underscore +// functions. +function optimizeCb(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; +} + +module.exports = optimizeCb; diff --git a/src/node_modules/underscore/cjs/_setup.js b/src/node_modules/underscore/cjs/_setup.js new file mode 100644 index 0000000..5fdfb5c --- /dev/null +++ b/src/node_modules/underscore/cjs/_setup.js @@ -0,0 +1,66 @@ +Object.defineProperty(exports, '__esModule', { value: true }); + +// Current version. +var VERSION = '1.13.4'; + +// Establish the root object, `window` (`self`) in the browser, `global` +// on the server, or `this` in some virtual machines. We use `self` +// instead of `window` for `WebWorker` support. +var root = (typeof self == 'object' && self.self === self && self) || + (typeof global == 'object' && global.global === global && global) || + Function('return this')() || + {}; + +// Save bytes in the minified (but not gzipped) version: +var ArrayProto = Array.prototype, ObjProto = Object.prototype; +var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + +// Create quick reference variables for speed access to core prototypes. +var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + +// Modern feature detection. +var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + +// All **ECMAScript 5+** native function implementations that we hope to use +// are declared here. +var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + +// Create references to these builtin functions because we override them. +var _isNaN = isNaN, + _isFinite = isFinite; + +// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. +var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); +var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + +// The largest integer that can be represented exactly. +var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + +exports.ArrayProto = ArrayProto; +exports.MAX_ARRAY_INDEX = MAX_ARRAY_INDEX; +exports.ObjProto = ObjProto; +exports.SymbolProto = SymbolProto; +exports.VERSION = VERSION; +exports._isFinite = _isFinite; +exports._isNaN = _isNaN; +exports.hasEnumBug = hasEnumBug; +exports.hasOwnProperty = hasOwnProperty; +exports.nativeCreate = nativeCreate; +exports.nativeIsArray = nativeIsArray; +exports.nativeIsView = nativeIsView; +exports.nativeKeys = nativeKeys; +exports.nonEnumerableProps = nonEnumerableProps; +exports.push = push; +exports.root = root; +exports.slice = slice; +exports.supportsArrayBuffer = supportsArrayBuffer; +exports.supportsDataView = supportsDataView; +exports.toString = toString; diff --git a/src/node_modules/underscore/cjs/_shallowProperty.js b/src/node_modules/underscore/cjs/_shallowProperty.js new file mode 100644 index 0000000..aabdc62 --- /dev/null +++ b/src/node_modules/underscore/cjs/_shallowProperty.js @@ -0,0 +1,8 @@ +// Internal helper to generate a function to obtain property `key` from `obj`. +function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; +} + +module.exports = shallowProperty; diff --git a/src/node_modules/underscore/cjs/_stringTagBug.js b/src/node_modules/underscore/cjs/_stringTagBug.js new file mode 100644 index 0000000..b5b21ca --- /dev/null +++ b/src/node_modules/underscore/cjs/_stringTagBug.js @@ -0,0 +1,15 @@ +Object.defineProperty(exports, '__esModule', { value: true }); + +var _setup = require('./_setup.js'); +var _hasObjectTag = require('./_hasObjectTag.js'); + +// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. +// In IE 11, the most common among them, this problem also applies to +// `Map`, `WeakMap` and `Set`. +var hasStringTagBug = ( + _setup.supportsDataView && _hasObjectTag(new DataView(new ArrayBuffer(8))) + ), + isIE11 = (typeof Map !== 'undefined' && _hasObjectTag(new Map)); + +exports.hasStringTagBug = hasStringTagBug; +exports.isIE11 = isIE11; diff --git a/src/node_modules/underscore/cjs/_tagTester.js b/src/node_modules/underscore/cjs/_tagTester.js new file mode 100644 index 0000000..2578e9b --- /dev/null +++ b/src/node_modules/underscore/cjs/_tagTester.js @@ -0,0 +1,11 @@ +var _setup = require('./_setup.js'); + +// Internal function for creating a `toString`-based type tester. +function tagTester(name) { + var tag = '[object ' + name + ']'; + return function(obj) { + return _setup.toString.call(obj) === tag; + }; +} + +module.exports = tagTester; diff --git a/src/node_modules/underscore/cjs/_toBufferView.js b/src/node_modules/underscore/cjs/_toBufferView.js new file mode 100644 index 0000000..3ad4e88 --- /dev/null +++ b/src/node_modules/underscore/cjs/_toBufferView.js @@ -0,0 +1,13 @@ +var _getByteLength = require('./_getByteLength.js'); + +// Internal function to wrap or shallow-copy an ArrayBuffer, +// typed array or DataView to a new view, reusing the buffer. +function toBufferView(bufferSource) { + return new Uint8Array( + bufferSource.buffer || bufferSource, + bufferSource.byteOffset || 0, + _getByteLength(bufferSource) + ); +} + +module.exports = toBufferView; diff --git a/src/node_modules/underscore/cjs/_toPath.js b/src/node_modules/underscore/cjs/_toPath.js new file mode 100644 index 0000000..33f1fa7 --- /dev/null +++ b/src/node_modules/underscore/cjs/_toPath.js @@ -0,0 +1,10 @@ +var underscore = require('./underscore.js'); +require('./toPath.js'); + +// Internal wrapper for `_.toPath` to enable minification. +// Similar to `cb` for `_.iteratee`. +function toPath(path) { + return underscore.toPath(path); +} + +module.exports = toPath; diff --git a/src/node_modules/underscore/cjs/_unescapeMap.js b/src/node_modules/underscore/cjs/_unescapeMap.js new file mode 100644 index 0000000..b2f68c8 --- /dev/null +++ b/src/node_modules/underscore/cjs/_unescapeMap.js @@ -0,0 +1,7 @@ +var invert = require('./invert.js'); +var _escapeMap = require('./_escapeMap.js'); + +// Internal list of HTML entities for unescaping. +var unescapeMap = invert(_escapeMap); + +module.exports = unescapeMap; diff --git a/src/node_modules/underscore/cjs/after.js b/src/node_modules/underscore/cjs/after.js new file mode 100644 index 0000000..c047e20 --- /dev/null +++ b/src/node_modules/underscore/cjs/after.js @@ -0,0 +1,10 @@ +// Returns a function that will only be executed on and after the Nth call. +function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; +} + +module.exports = after; diff --git a/src/node_modules/underscore/cjs/allKeys.js b/src/node_modules/underscore/cjs/allKeys.js new file mode 100644 index 0000000..1eb5e84 --- /dev/null +++ b/src/node_modules/underscore/cjs/allKeys.js @@ -0,0 +1,15 @@ +var isObject = require('./isObject.js'); +var _setup = require('./_setup.js'); +var _collectNonEnumProps = require('./_collectNonEnumProps.js'); + +// Retrieve all the enumerable property names of an object. +function allKeys(obj) { + if (!isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys); + return keys; +} + +module.exports = allKeys; diff --git a/src/node_modules/underscore/cjs/before.js b/src/node_modules/underscore/cjs/before.js new file mode 100644 index 0000000..714a31e --- /dev/null +++ b/src/node_modules/underscore/cjs/before.js @@ -0,0 +1,14 @@ +// Returns a function that will only be executed up to (but not including) the +// Nth call. +function before(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; +} + +module.exports = before; diff --git a/src/node_modules/underscore/cjs/bind.js b/src/node_modules/underscore/cjs/bind.js new file mode 100644 index 0000000..59bc5ee --- /dev/null +++ b/src/node_modules/underscore/cjs/bind.js @@ -0,0 +1,15 @@ +var restArguments = require('./restArguments.js'); +var isFunction = require('./isFunction.js'); +var _executeBound = require('./_executeBound.js'); + +// Create a function bound to a given object (assigning `this`, and arguments, +// optionally). +var bind = restArguments(function(func, context, args) { + if (!isFunction(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return _executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; +}); + +module.exports = bind; diff --git a/src/node_modules/underscore/cjs/bindAll.js b/src/node_modules/underscore/cjs/bindAll.js new file mode 100644 index 0000000..12c1402 --- /dev/null +++ b/src/node_modules/underscore/cjs/bindAll.js @@ -0,0 +1,19 @@ +var restArguments = require('./restArguments.js'); +var _flatten = require('./_flatten.js'); +var bind = require('./bind.js'); + +// Bind a number of an object's methods to that object. Remaining arguments +// are the method names to be bound. Useful for ensuring that all callbacks +// defined on an object belong to it. +var bindAll = restArguments(function(obj, keys) { + keys = _flatten(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = bind(obj[key], obj); + } + return obj; +}); + +module.exports = bindAll; diff --git a/src/node_modules/underscore/cjs/chain.js b/src/node_modules/underscore/cjs/chain.js new file mode 100644 index 0000000..07e35ea --- /dev/null +++ b/src/node_modules/underscore/cjs/chain.js @@ -0,0 +1,10 @@ +var underscore = require('./underscore.js'); + +// Start chaining a wrapped Underscore object. +function chain(obj) { + var instance = underscore(obj); + instance._chain = true; + return instance; +} + +module.exports = chain; diff --git a/src/node_modules/underscore/cjs/chunk.js b/src/node_modules/underscore/cjs/chunk.js new file mode 100644 index 0000000..3e10d88 --- /dev/null +++ b/src/node_modules/underscore/cjs/chunk.js @@ -0,0 +1,15 @@ +var _setup = require('./_setup.js'); + +// Chunk a single array into multiple arrays, each containing `count` or fewer +// items. +function chunk(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(_setup.slice.call(array, i, i += count)); + } + return result; +} + +module.exports = chunk; diff --git a/src/node_modules/underscore/cjs/clone.js b/src/node_modules/underscore/cjs/clone.js new file mode 100644 index 0000000..91b3e5b --- /dev/null +++ b/src/node_modules/underscore/cjs/clone.js @@ -0,0 +1,11 @@ +var isObject = require('./isObject.js'); +var isArray = require('./isArray.js'); +var extend = require('./extend.js'); + +// Create a (shallow-cloned) duplicate of an object. +function clone(obj) { + if (!isObject(obj)) return obj; + return isArray(obj) ? obj.slice() : extend({}, obj); +} + +module.exports = clone; diff --git a/src/node_modules/underscore/cjs/compact.js b/src/node_modules/underscore/cjs/compact.js new file mode 100644 index 0000000..8fd210e --- /dev/null +++ b/src/node_modules/underscore/cjs/compact.js @@ -0,0 +1,8 @@ +var filter = require('./filter.js'); + +// Trim out all falsy values from an array. +function compact(array) { + return filter(array, Boolean); +} + +module.exports = compact; diff --git a/src/node_modules/underscore/cjs/compose.js b/src/node_modules/underscore/cjs/compose.js new file mode 100644 index 0000000..f95f890 --- /dev/null +++ b/src/node_modules/underscore/cjs/compose.js @@ -0,0 +1,14 @@ +// Returns a function that is the composition of a list of functions, each +// consuming the return value of the function that follows. +function compose() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; +} + +module.exports = compose; diff --git a/src/node_modules/underscore/cjs/constant.js b/src/node_modules/underscore/cjs/constant.js new file mode 100644 index 0000000..0b2904b --- /dev/null +++ b/src/node_modules/underscore/cjs/constant.js @@ -0,0 +1,8 @@ +// Predicate-generating function. Often useful outside of Underscore. +function constant(value) { + return function() { + return value; + }; +} + +module.exports = constant; diff --git a/src/node_modules/underscore/cjs/contains.js b/src/node_modules/underscore/cjs/contains.js new file mode 100644 index 0000000..bfe1341 --- /dev/null +++ b/src/node_modules/underscore/cjs/contains.js @@ -0,0 +1,12 @@ +var _isArrayLike = require('./_isArrayLike.js'); +var values = require('./values.js'); +var indexOf = require('./indexOf.js'); + +// Determine if the array or object contains a given item (using `===`). +function contains(obj, item, fromIndex, guard) { + if (!_isArrayLike(obj)) obj = values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return indexOf(obj, item, fromIndex) >= 0; +} + +module.exports = contains; diff --git a/src/node_modules/underscore/cjs/countBy.js b/src/node_modules/underscore/cjs/countBy.js new file mode 100644 index 0000000..8880326 --- /dev/null +++ b/src/node_modules/underscore/cjs/countBy.js @@ -0,0 +1,11 @@ +var _group = require('./_group.js'); +var _has = require('./_has.js'); + +// Counts instances of an object that group by a certain criterion. Pass +// either a string attribute to count by, or a function that returns the +// criterion. +var countBy = _group(function(result, value, key) { + if (_has(result, key)) result[key]++; else result[key] = 1; +}); + +module.exports = countBy; diff --git a/src/node_modules/underscore/cjs/create.js b/src/node_modules/underscore/cjs/create.js new file mode 100644 index 0000000..6833218 --- /dev/null +++ b/src/node_modules/underscore/cjs/create.js @@ -0,0 +1,13 @@ +var _baseCreate = require('./_baseCreate.js'); +var extendOwn = require('./extendOwn.js'); + +// Creates an object that inherits from the given prototype object. +// If additional properties are provided then they will be added to the +// created object. +function create(prototype, props) { + var result = _baseCreate(prototype); + if (props) extendOwn(result, props); + return result; +} + +module.exports = create; diff --git a/src/node_modules/underscore/cjs/debounce.js b/src/node_modules/underscore/cjs/debounce.js new file mode 100644 index 0000000..517086c --- /dev/null +++ b/src/node_modules/underscore/cjs/debounce.js @@ -0,0 +1,42 @@ +var restArguments = require('./restArguments.js'); +var now = require('./now.js'); + +// When a sequence of calls of the returned function ends, the argument +// function is triggered. The end of a sequence is defined by the `wait` +// parameter. If `immediate` is passed, the argument function will be +// triggered at the beginning of the sequence instead of at the end. +function debounce(func, wait, immediate) { + var timeout, previous, args, result, context; + + var later = function() { + var passed = now() - previous; + if (wait > passed) { + timeout = setTimeout(later, wait - passed); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + // This check is needed because `func` can recursively invoke `debounced`. + if (!timeout) args = context = null; + } + }; + + var debounced = restArguments(function(_args) { + context = this; + args = _args; + previous = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + if (immediate) result = func.apply(context, args); + } + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = args = context = null; + }; + + return debounced; +} + +module.exports = debounce; diff --git a/src/node_modules/underscore/cjs/defaults.js b/src/node_modules/underscore/cjs/defaults.js new file mode 100644 index 0000000..180cdd1 --- /dev/null +++ b/src/node_modules/underscore/cjs/defaults.js @@ -0,0 +1,7 @@ +var _createAssigner = require('./_createAssigner.js'); +var allKeys = require('./allKeys.js'); + +// Fill in a given object with default properties. +var defaults = _createAssigner(allKeys, true); + +module.exports = defaults; diff --git a/src/node_modules/underscore/cjs/defer.js b/src/node_modules/underscore/cjs/defer.js new file mode 100644 index 0000000..2f1ef25 --- /dev/null +++ b/src/node_modules/underscore/cjs/defer.js @@ -0,0 +1,9 @@ +var partial = require('./partial.js'); +var delay = require('./delay.js'); +var underscore = require('./underscore.js'); + +// Defers a function, scheduling it to run after the current call stack has +// cleared. +var defer = partial(delay, underscore, 1); + +module.exports = defer; diff --git a/src/node_modules/underscore/cjs/delay.js b/src/node_modules/underscore/cjs/delay.js new file mode 100644 index 0000000..49b5387 --- /dev/null +++ b/src/node_modules/underscore/cjs/delay.js @@ -0,0 +1,11 @@ +var restArguments = require('./restArguments.js'); + +// Delays a function for the given number of milliseconds, and then calls +// it with the arguments supplied. +var delay = restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); +}); + +module.exports = delay; diff --git a/src/node_modules/underscore/cjs/difference.js b/src/node_modules/underscore/cjs/difference.js new file mode 100644 index 0000000..8e472d6 --- /dev/null +++ b/src/node_modules/underscore/cjs/difference.js @@ -0,0 +1,15 @@ +var restArguments = require('./restArguments.js'); +var _flatten = require('./_flatten.js'); +var filter = require('./filter.js'); +var contains = require('./contains.js'); + +// Take the difference between one array and a number of other arrays. +// Only the elements present in just the first array will remain. +var difference = restArguments(function(array, rest) { + rest = _flatten(rest, true, true); + return filter(array, function(value){ + return !contains(rest, value); + }); +}); + +module.exports = difference; diff --git a/src/node_modules/underscore/cjs/each.js b/src/node_modules/underscore/cjs/each.js new file mode 100644 index 0000000..f6fa21e --- /dev/null +++ b/src/node_modules/underscore/cjs/each.js @@ -0,0 +1,25 @@ +var _optimizeCb = require('./_optimizeCb.js'); +var _isArrayLike = require('./_isArrayLike.js'); +var keys = require('./keys.js'); + +// The cornerstone for collection functions, an `each` +// implementation, aka `forEach`. +// Handles raw objects in addition to array-likes. Treats all +// sparse array-likes as if they were dense. +function each(obj, iteratee, context) { + iteratee = _optimizeCb(iteratee, context); + var i, length; + if (_isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + for (i = 0, length = _keys.length; i < length; i++) { + iteratee(obj[_keys[i]], _keys[i], obj); + } + } + return obj; +} + +module.exports = each; diff --git a/src/node_modules/underscore/cjs/escape.js b/src/node_modules/underscore/cjs/escape.js new file mode 100644 index 0000000..0f29ef8 --- /dev/null +++ b/src/node_modules/underscore/cjs/escape.js @@ -0,0 +1,7 @@ +var _createEscaper = require('./_createEscaper.js'); +var _escapeMap = require('./_escapeMap.js'); + +// Function for escaping strings to HTML interpolation. +var _escape = _createEscaper(_escapeMap); + +module.exports = _escape; diff --git a/src/node_modules/underscore/cjs/every.js b/src/node_modules/underscore/cjs/every.js new file mode 100644 index 0000000..d078695 --- /dev/null +++ b/src/node_modules/underscore/cjs/every.js @@ -0,0 +1,17 @@ +var _cb = require('./_cb.js'); +var _isArrayLike = require('./_isArrayLike.js'); +var keys = require('./keys.js'); + +// Determine whether all of the elements pass a truth test. +function every(obj, predicate, context) { + predicate = _cb(predicate, context); + var _keys = !_isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; +} + +module.exports = every; diff --git a/src/node_modules/underscore/cjs/extend.js b/src/node_modules/underscore/cjs/extend.js new file mode 100644 index 0000000..7c5511c --- /dev/null +++ b/src/node_modules/underscore/cjs/extend.js @@ -0,0 +1,7 @@ +var _createAssigner = require('./_createAssigner.js'); +var allKeys = require('./allKeys.js'); + +// Extend a given object with all the properties in passed-in object(s). +var extend = _createAssigner(allKeys); + +module.exports = extend; diff --git a/src/node_modules/underscore/cjs/extendOwn.js b/src/node_modules/underscore/cjs/extendOwn.js new file mode 100644 index 0000000..337195a --- /dev/null +++ b/src/node_modules/underscore/cjs/extendOwn.js @@ -0,0 +1,9 @@ +var _createAssigner = require('./_createAssigner.js'); +var keys = require('./keys.js'); + +// Assigns a given object with all the own properties in the passed-in +// object(s). +// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) +var extendOwn = _createAssigner(keys); + +module.exports = extendOwn; diff --git a/src/node_modules/underscore/cjs/filter.js b/src/node_modules/underscore/cjs/filter.js new file mode 100644 index 0000000..ba1a063 --- /dev/null +++ b/src/node_modules/underscore/cjs/filter.js @@ -0,0 +1,14 @@ +var _cb = require('./_cb.js'); +var each = require('./each.js'); + +// Return all the elements that pass a truth test. +function filter(obj, predicate, context) { + var results = []; + predicate = _cb(predicate, context); + each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; +} + +module.exports = filter; diff --git a/src/node_modules/underscore/cjs/find.js b/src/node_modules/underscore/cjs/find.js new file mode 100644 index 0000000..03728b4 --- /dev/null +++ b/src/node_modules/underscore/cjs/find.js @@ -0,0 +1,12 @@ +var _isArrayLike = require('./_isArrayLike.js'); +var findIndex = require('./findIndex.js'); +var findKey = require('./findKey.js'); + +// Return the first value which passes a truth test. +function find(obj, predicate, context) { + var keyFinder = _isArrayLike(obj) ? findIndex : findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; +} + +module.exports = find; diff --git a/src/node_modules/underscore/cjs/findIndex.js b/src/node_modules/underscore/cjs/findIndex.js new file mode 100644 index 0000000..e5a1fec --- /dev/null +++ b/src/node_modules/underscore/cjs/findIndex.js @@ -0,0 +1,6 @@ +var _createPredicateIndexFinder = require('./_createPredicateIndexFinder.js'); + +// Returns the first index on an array-like that passes a truth test. +var findIndex = _createPredicateIndexFinder(1); + +module.exports = findIndex; diff --git a/src/node_modules/underscore/cjs/findKey.js b/src/node_modules/underscore/cjs/findKey.js new file mode 100644 index 0000000..4f2c291 --- /dev/null +++ b/src/node_modules/underscore/cjs/findKey.js @@ -0,0 +1,14 @@ +var _cb = require('./_cb.js'); +var keys = require('./keys.js'); + +// Returns the first key on an object that passes a truth test. +function findKey(obj, predicate, context) { + predicate = _cb(predicate, context); + var _keys = keys(obj), key; + for (var i = 0, length = _keys.length; i < length; i++) { + key = _keys[i]; + if (predicate(obj[key], key, obj)) return key; + } +} + +module.exports = findKey; diff --git a/src/node_modules/underscore/cjs/findLastIndex.js b/src/node_modules/underscore/cjs/findLastIndex.js new file mode 100644 index 0000000..c9165cb --- /dev/null +++ b/src/node_modules/underscore/cjs/findLastIndex.js @@ -0,0 +1,6 @@ +var _createPredicateIndexFinder = require('./_createPredicateIndexFinder.js'); + +// Returns the last index on an array-like that passes a truth test. +var findLastIndex = _createPredicateIndexFinder(-1); + +module.exports = findLastIndex; diff --git a/src/node_modules/underscore/cjs/findWhere.js b/src/node_modules/underscore/cjs/findWhere.js new file mode 100644 index 0000000..cf66e0d --- /dev/null +++ b/src/node_modules/underscore/cjs/findWhere.js @@ -0,0 +1,10 @@ +var find = require('./find.js'); +var matcher = require('./matcher.js'); + +// Convenience version of a common use case of `_.find`: getting the first +// object containing specific `key:value` pairs. +function findWhere(obj, attrs) { + return find(obj, matcher(attrs)); +} + +module.exports = findWhere; diff --git a/src/node_modules/underscore/cjs/first.js b/src/node_modules/underscore/cjs/first.js new file mode 100644 index 0000000..82b6846 --- /dev/null +++ b/src/node_modules/underscore/cjs/first.js @@ -0,0 +1,11 @@ +var initial = require('./initial.js'); + +// Get the first element of an array. Passing **n** will return the first N +// values in the array. The **guard** check allows it to work with `_.map`. +function first(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[0]; + return initial(array, array.length - n); +} + +module.exports = first; diff --git a/src/node_modules/underscore/cjs/flatten.js b/src/node_modules/underscore/cjs/flatten.js new file mode 100644 index 0000000..b887839 --- /dev/null +++ b/src/node_modules/underscore/cjs/flatten.js @@ -0,0 +1,9 @@ +var _flatten = require('./_flatten.js'); + +// Flatten out an array, either recursively (by default), or up to `depth`. +// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. +function flatten(array, depth) { + return _flatten(array, depth, false); +} + +module.exports = flatten; diff --git a/src/node_modules/underscore/cjs/functions.js b/src/node_modules/underscore/cjs/functions.js new file mode 100644 index 0000000..f9afb43 --- /dev/null +++ b/src/node_modules/underscore/cjs/functions.js @@ -0,0 +1,12 @@ +var isFunction = require('./isFunction.js'); + +// Return a sorted list of the function names available on the object. +function functions(obj) { + var names = []; + for (var key in obj) { + if (isFunction(obj[key])) names.push(key); + } + return names.sort(); +} + +module.exports = functions; diff --git a/src/node_modules/underscore/cjs/get.js b/src/node_modules/underscore/cjs/get.js new file mode 100644 index 0000000..0f57fe0 --- /dev/null +++ b/src/node_modules/underscore/cjs/get.js @@ -0,0 +1,14 @@ +var _toPath = require('./_toPath.js'); +var _deepGet = require('./_deepGet.js'); +var isUndefined = require('./isUndefined.js'); + +// Get the value of the (deep) property on `path` from `object`. +// If any property in `path` does not exist or if the value is +// `undefined`, return `defaultValue` instead. +// The `path` is normalized through `_.toPath`. +function get(object, path, defaultValue) { + var value = _deepGet(object, _toPath(path)); + return isUndefined(value) ? defaultValue : value; +} + +module.exports = get; diff --git a/src/node_modules/underscore/cjs/groupBy.js b/src/node_modules/underscore/cjs/groupBy.js new file mode 100644 index 0000000..f152f9d --- /dev/null +++ b/src/node_modules/underscore/cjs/groupBy.js @@ -0,0 +1,10 @@ +var _group = require('./_group.js'); +var _has = require('./_has.js'); + +// Groups the object's values by a criterion. Pass either a string attribute +// to group by, or a function that returns the criterion. +var groupBy = _group(function(result, value, key) { + if (_has(result, key)) result[key].push(value); else result[key] = [value]; +}); + +module.exports = groupBy; diff --git a/src/node_modules/underscore/cjs/has.js b/src/node_modules/underscore/cjs/has.js new file mode 100644 index 0000000..26c123d --- /dev/null +++ b/src/node_modules/underscore/cjs/has.js @@ -0,0 +1,18 @@ +var _has = require('./_has.js'); +var _toPath = require('./_toPath.js'); + +// Shortcut function for checking if an object has a given property directly on +// itself (in other words, not on a prototype). Unlike the internal `has` +// function, this public version can also traverse nested properties. +function has(obj, path) { + path = _toPath(path); + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (!_has(obj, key)) return false; + obj = obj[key]; + } + return !!length; +} + +module.exports = has; diff --git a/src/node_modules/underscore/cjs/identity.js b/src/node_modules/underscore/cjs/identity.js new file mode 100644 index 0000000..d65566a --- /dev/null +++ b/src/node_modules/underscore/cjs/identity.js @@ -0,0 +1,6 @@ +// Keep the identity function around for default iteratees. +function identity(value) { + return value; +} + +module.exports = identity; diff --git a/src/node_modules/underscore/cjs/index-default.js b/src/node_modules/underscore/cjs/index-default.js new file mode 100644 index 0000000..4685949 --- /dev/null +++ b/src/node_modules/underscore/cjs/index-default.js @@ -0,0 +1,11 @@ +var index = require('./index.js'); +var mixin = require('./mixin.js'); + +// Default Export + +// Add all of the Underscore functions to the wrapper object. +var _ = mixin(index); +// Legacy Node.js API. +_._ = _; + +module.exports = _; diff --git a/src/node_modules/underscore/cjs/index.js b/src/node_modules/underscore/cjs/index.js new file mode 100644 index 0000000..cb06a75 --- /dev/null +++ b/src/node_modules/underscore/cjs/index.js @@ -0,0 +1,278 @@ +Object.defineProperty(exports, '__esModule', { value: true }); + +var _setup = require('./_setup.js'); +var restArguments = require('./restArguments.js'); +var isObject = require('./isObject.js'); +var isNull = require('./isNull.js'); +var isUndefined = require('./isUndefined.js'); +var isBoolean = require('./isBoolean.js'); +var isElement = require('./isElement.js'); +var isString = require('./isString.js'); +var isNumber = require('./isNumber.js'); +var isDate = require('./isDate.js'); +var isRegExp = require('./isRegExp.js'); +var isError = require('./isError.js'); +var isSymbol = require('./isSymbol.js'); +var isArrayBuffer = require('./isArrayBuffer.js'); +var isDataView = require('./isDataView.js'); +var isArray = require('./isArray.js'); +var isFunction = require('./isFunction.js'); +var isArguments = require('./isArguments.js'); +var _isFinite = require('./isFinite.js'); +var _isNaN = require('./isNaN.js'); +var isTypedArray = require('./isTypedArray.js'); +var isEmpty = require('./isEmpty.js'); +var isMatch = require('./isMatch.js'); +var isEqual = require('./isEqual.js'); +var isMap = require('./isMap.js'); +var isWeakMap = require('./isWeakMap.js'); +var isSet = require('./isSet.js'); +var isWeakSet = require('./isWeakSet.js'); +var keys = require('./keys.js'); +var allKeys = require('./allKeys.js'); +var values = require('./values.js'); +var pairs = require('./pairs.js'); +var invert = require('./invert.js'); +var functions = require('./functions.js'); +var extend = require('./extend.js'); +var extendOwn = require('./extendOwn.js'); +var defaults = require('./defaults.js'); +var create = require('./create.js'); +var clone = require('./clone.js'); +var tap = require('./tap.js'); +var get = require('./get.js'); +var has = require('./has.js'); +var mapObject = require('./mapObject.js'); +var identity = require('./identity.js'); +var constant = require('./constant.js'); +var noop = require('./noop.js'); +var toPath = require('./toPath.js'); +var property = require('./property.js'); +var propertyOf = require('./propertyOf.js'); +var matcher = require('./matcher.js'); +var times = require('./times.js'); +var random = require('./random.js'); +var now = require('./now.js'); +var _escape = require('./escape.js'); +var _unescape = require('./unescape.js'); +var templateSettings = require('./templateSettings.js'); +var template = require('./template.js'); +var result = require('./result.js'); +var uniqueId = require('./uniqueId.js'); +var chain = require('./chain.js'); +var iteratee = require('./iteratee.js'); +var partial = require('./partial.js'); +var bind = require('./bind.js'); +var bindAll = require('./bindAll.js'); +var memoize = require('./memoize.js'); +var delay = require('./delay.js'); +var defer = require('./defer.js'); +var throttle = require('./throttle.js'); +var debounce = require('./debounce.js'); +var wrap = require('./wrap.js'); +var negate = require('./negate.js'); +var compose = require('./compose.js'); +var after = require('./after.js'); +var before = require('./before.js'); +var once = require('./once.js'); +var findKey = require('./findKey.js'); +var findIndex = require('./findIndex.js'); +var findLastIndex = require('./findLastIndex.js'); +var sortedIndex = require('./sortedIndex.js'); +var indexOf = require('./indexOf.js'); +var lastIndexOf = require('./lastIndexOf.js'); +var find = require('./find.js'); +var findWhere = require('./findWhere.js'); +var each = require('./each.js'); +var map = require('./map.js'); +var reduce = require('./reduce.js'); +var reduceRight = require('./reduceRight.js'); +var filter = require('./filter.js'); +var reject = require('./reject.js'); +var every = require('./every.js'); +var some = require('./some.js'); +var contains = require('./contains.js'); +var invoke = require('./invoke.js'); +var pluck = require('./pluck.js'); +var where = require('./where.js'); +var max = require('./max.js'); +var min = require('./min.js'); +var shuffle = require('./shuffle.js'); +var sample = require('./sample.js'); +var sortBy = require('./sortBy.js'); +var groupBy = require('./groupBy.js'); +var indexBy = require('./indexBy.js'); +var countBy = require('./countBy.js'); +var partition = require('./partition.js'); +var toArray = require('./toArray.js'); +var size = require('./size.js'); +var pick = require('./pick.js'); +var omit = require('./omit.js'); +var first = require('./first.js'); +var initial = require('./initial.js'); +var last = require('./last.js'); +var rest = require('./rest.js'); +var compact = require('./compact.js'); +var flatten = require('./flatten.js'); +var without = require('./without.js'); +var uniq = require('./uniq.js'); +var union = require('./union.js'); +var intersection = require('./intersection.js'); +var difference = require('./difference.js'); +var unzip = require('./unzip.js'); +var zip = require('./zip.js'); +var object = require('./object.js'); +var range = require('./range.js'); +var chunk = require('./chunk.js'); +var mixin = require('./mixin.js'); +require('./underscore-array-methods.js'); +var underscore = require('./underscore.js'); + +// Named Exports + +exports.VERSION = _setup.VERSION; +exports.restArguments = restArguments; +exports.isObject = isObject; +exports.isNull = isNull; +exports.isUndefined = isUndefined; +exports.isBoolean = isBoolean; +exports.isElement = isElement; +exports.isString = isString; +exports.isNumber = isNumber; +exports.isDate = isDate; +exports.isRegExp = isRegExp; +exports.isError = isError; +exports.isSymbol = isSymbol; +exports.isArrayBuffer = isArrayBuffer; +exports.isDataView = isDataView; +exports.isArray = isArray; +exports.isFunction = isFunction; +exports.isArguments = isArguments; +exports.isFinite = _isFinite; +exports.isNaN = _isNaN; +exports.isTypedArray = isTypedArray; +exports.isEmpty = isEmpty; +exports.isMatch = isMatch; +exports.isEqual = isEqual; +exports.isMap = isMap; +exports.isWeakMap = isWeakMap; +exports.isSet = isSet; +exports.isWeakSet = isWeakSet; +exports.keys = keys; +exports.allKeys = allKeys; +exports.values = values; +exports.pairs = pairs; +exports.invert = invert; +exports.functions = functions; +exports.methods = functions; +exports.extend = extend; +exports.assign = extendOwn; +exports.extendOwn = extendOwn; +exports.defaults = defaults; +exports.create = create; +exports.clone = clone; +exports.tap = tap; +exports.get = get; +exports.has = has; +exports.mapObject = mapObject; +exports.identity = identity; +exports.constant = constant; +exports.noop = noop; +exports.toPath = toPath; +exports.property = property; +exports.propertyOf = propertyOf; +exports.matcher = matcher; +exports.matches = matcher; +exports.times = times; +exports.random = random; +exports.now = now; +exports.escape = _escape; +exports.unescape = _unescape; +exports.templateSettings = templateSettings; +exports.template = template; +exports.result = result; +exports.uniqueId = uniqueId; +exports.chain = chain; +exports.iteratee = iteratee; +exports.partial = partial; +exports.bind = bind; +exports.bindAll = bindAll; +exports.memoize = memoize; +exports.delay = delay; +exports.defer = defer; +exports.throttle = throttle; +exports.debounce = debounce; +exports.wrap = wrap; +exports.negate = negate; +exports.compose = compose; +exports.after = after; +exports.before = before; +exports.once = once; +exports.findKey = findKey; +exports.findIndex = findIndex; +exports.findLastIndex = findLastIndex; +exports.sortedIndex = sortedIndex; +exports.indexOf = indexOf; +exports.lastIndexOf = lastIndexOf; +exports.detect = find; +exports.find = find; +exports.findWhere = findWhere; +exports.each = each; +exports.forEach = each; +exports.collect = map; +exports.map = map; +exports.foldl = reduce; +exports.inject = reduce; +exports.reduce = reduce; +exports.foldr = reduceRight; +exports.reduceRight = reduceRight; +exports.filter = filter; +exports.select = filter; +exports.reject = reject; +exports.all = every; +exports.every = every; +exports.any = some; +exports.some = some; +exports.contains = contains; +exports.include = contains; +exports.includes = contains; +exports.invoke = invoke; +exports.pluck = pluck; +exports.where = where; +exports.max = max; +exports.min = min; +exports.shuffle = shuffle; +exports.sample = sample; +exports.sortBy = sortBy; +exports.groupBy = groupBy; +exports.indexBy = indexBy; +exports.countBy = countBy; +exports.partition = partition; +exports.toArray = toArray; +exports.size = size; +exports.pick = pick; +exports.omit = omit; +exports.first = first; +exports.head = first; +exports.take = first; +exports.initial = initial; +exports.last = last; +exports.drop = rest; +exports.rest = rest; +exports.tail = rest; +exports.compact = compact; +exports.flatten = flatten; +exports.without = without; +exports.uniq = uniq; +exports.unique = uniq; +exports.union = union; +exports.intersection = intersection; +exports.difference = difference; +exports.transpose = unzip; +exports.unzip = unzip; +exports.zip = zip; +exports.object = object; +exports.range = range; +exports.chunk = chunk; +exports.mixin = mixin; +exports.default = underscore; diff --git a/src/node_modules/underscore/cjs/indexBy.js b/src/node_modules/underscore/cjs/indexBy.js new file mode 100644 index 0000000..89ff21a --- /dev/null +++ b/src/node_modules/underscore/cjs/indexBy.js @@ -0,0 +1,9 @@ +var _group = require('./_group.js'); + +// Indexes the object's values by a criterion, similar to `_.groupBy`, but for +// when you know that your index values will be unique. +var indexBy = _group(function(result, value, key) { + result[key] = value; +}); + +module.exports = indexBy; diff --git a/src/node_modules/underscore/cjs/indexOf.js b/src/node_modules/underscore/cjs/indexOf.js new file mode 100644 index 0000000..ef3352b --- /dev/null +++ b/src/node_modules/underscore/cjs/indexOf.js @@ -0,0 +1,11 @@ +var sortedIndex = require('./sortedIndex.js'); +var findIndex = require('./findIndex.js'); +var _createIndexFinder = require('./_createIndexFinder.js'); + +// Return the position of the first occurrence of an item in an array, +// or -1 if the item is not included in the array. +// If the array is large and already in sort order, pass `true` +// for **isSorted** to use binary search. +var indexOf = _createIndexFinder(1, findIndex, sortedIndex); + +module.exports = indexOf; diff --git a/src/node_modules/underscore/cjs/initial.js b/src/node_modules/underscore/cjs/initial.js new file mode 100644 index 0000000..9db2cd2 --- /dev/null +++ b/src/node_modules/underscore/cjs/initial.js @@ -0,0 +1,10 @@ +var _setup = require('./_setup.js'); + +// Returns everything but the last entry of the array. Especially useful on +// the arguments object. Passing **n** will return all the values in +// the array, excluding the last N. +function initial(array, n, guard) { + return _setup.slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); +} + +module.exports = initial; diff --git a/src/node_modules/underscore/cjs/intersection.js b/src/node_modules/underscore/cjs/intersection.js new file mode 100644 index 0000000..e28fe2f --- /dev/null +++ b/src/node_modules/underscore/cjs/intersection.js @@ -0,0 +1,21 @@ +var _getLength = require('./_getLength.js'); +var contains = require('./contains.js'); + +// Produce an array that contains every item shared between all the +// passed-in arrays. +function intersection(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = _getLength(array); i < length; i++) { + var item = array[i]; + if (contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; +} + +module.exports = intersection; diff --git a/src/node_modules/underscore/cjs/invert.js b/src/node_modules/underscore/cjs/invert.js new file mode 100644 index 0000000..a0c5150 --- /dev/null +++ b/src/node_modules/underscore/cjs/invert.js @@ -0,0 +1,13 @@ +var keys = require('./keys.js'); + +// Invert the keys and values of an object. The values must be serializable. +function invert(obj) { + var result = {}; + var _keys = keys(obj); + for (var i = 0, length = _keys.length; i < length; i++) { + result[obj[_keys[i]]] = _keys[i]; + } + return result; +} + +module.exports = invert; diff --git a/src/node_modules/underscore/cjs/invoke.js b/src/node_modules/underscore/cjs/invoke.js new file mode 100644 index 0000000..e2f1267 --- /dev/null +++ b/src/node_modules/underscore/cjs/invoke.js @@ -0,0 +1,30 @@ +var restArguments = require('./restArguments.js'); +var isFunction = require('./isFunction.js'); +var map = require('./map.js'); +var _deepGet = require('./_deepGet.js'); +var _toPath = require('./_toPath.js'); + +// Invoke a method (with arguments) on every item in a collection. +var invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (isFunction(path)) { + func = path; + } else { + path = _toPath(path); + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = _deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); +}); + +module.exports = invoke; diff --git a/src/node_modules/underscore/cjs/isArguments.js b/src/node_modules/underscore/cjs/isArguments.js new file mode 100644 index 0000000..8b33b11 --- /dev/null +++ b/src/node_modules/underscore/cjs/isArguments.js @@ -0,0 +1,18 @@ +var _tagTester = require('./_tagTester.js'); +var _has = require('./_has.js'); + +var isArguments = _tagTester('Arguments'); + +// Define a fallback version of the method in browsers (ahem, IE < 9), where +// there isn't any inspectable "Arguments" type. +(function() { + if (!isArguments(arguments)) { + isArguments = function(obj) { + return _has(obj, 'callee'); + }; + } +}()); + +var isArguments$1 = isArguments; + +module.exports = isArguments$1; diff --git a/src/node_modules/underscore/cjs/isArray.js b/src/node_modules/underscore/cjs/isArray.js new file mode 100644 index 0000000..abcdad3 --- /dev/null +++ b/src/node_modules/underscore/cjs/isArray.js @@ -0,0 +1,8 @@ +var _setup = require('./_setup.js'); +var _tagTester = require('./_tagTester.js'); + +// Is a given value an array? +// Delegates to ECMA5's native `Array.isArray`. +var isArray = _setup.nativeIsArray || _tagTester('Array'); + +module.exports = isArray; diff --git a/src/node_modules/underscore/cjs/isArrayBuffer.js b/src/node_modules/underscore/cjs/isArrayBuffer.js new file mode 100644 index 0000000..c69523f --- /dev/null +++ b/src/node_modules/underscore/cjs/isArrayBuffer.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var isArrayBuffer = _tagTester('ArrayBuffer'); + +module.exports = isArrayBuffer; diff --git a/src/node_modules/underscore/cjs/isBoolean.js b/src/node_modules/underscore/cjs/isBoolean.js new file mode 100644 index 0000000..29b82d8 --- /dev/null +++ b/src/node_modules/underscore/cjs/isBoolean.js @@ -0,0 +1,8 @@ +var _setup = require('./_setup.js'); + +// Is a given value a boolean? +function isBoolean(obj) { + return obj === true || obj === false || _setup.toString.call(obj) === '[object Boolean]'; +} + +module.exports = isBoolean; diff --git a/src/node_modules/underscore/cjs/isDataView.js b/src/node_modules/underscore/cjs/isDataView.js new file mode 100644 index 0000000..e74b6ec --- /dev/null +++ b/src/node_modules/underscore/cjs/isDataView.js @@ -0,0 +1,16 @@ +var _tagTester = require('./_tagTester.js'); +var isFunction = require('./isFunction.js'); +var isArrayBuffer = require('./isArrayBuffer.js'); +var _stringTagBug = require('./_stringTagBug.js'); + +var isDataView = _tagTester('DataView'); + +// In IE 10 - Edge 13, we need a different heuristic +// to determine whether an object is a `DataView`. +function ie10IsDataView(obj) { + return obj != null && isFunction(obj.getInt8) && isArrayBuffer(obj.buffer); +} + +var isDataView$1 = (_stringTagBug.hasStringTagBug ? ie10IsDataView : isDataView); + +module.exports = isDataView$1; diff --git a/src/node_modules/underscore/cjs/isDate.js b/src/node_modules/underscore/cjs/isDate.js new file mode 100644 index 0000000..e342bc9 --- /dev/null +++ b/src/node_modules/underscore/cjs/isDate.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var isDate = _tagTester('Date'); + +module.exports = isDate; diff --git a/src/node_modules/underscore/cjs/isElement.js b/src/node_modules/underscore/cjs/isElement.js new file mode 100644 index 0000000..13b63cc --- /dev/null +++ b/src/node_modules/underscore/cjs/isElement.js @@ -0,0 +1,6 @@ +// Is a given value a DOM element? +function isElement(obj) { + return !!(obj && obj.nodeType === 1); +} + +module.exports = isElement; diff --git a/src/node_modules/underscore/cjs/isEmpty.js b/src/node_modules/underscore/cjs/isEmpty.js new file mode 100644 index 0000000..2f1e315 --- /dev/null +++ b/src/node_modules/underscore/cjs/isEmpty.js @@ -0,0 +1,20 @@ +var _getLength = require('./_getLength.js'); +var isArray = require('./isArray.js'); +var isString = require('./isString.js'); +var isArguments = require('./isArguments.js'); +var keys = require('./keys.js'); + +// Is a given array, string, or object empty? +// An "empty" object has no enumerable own-properties. +function isEmpty(obj) { + if (obj == null) return true; + // Skip the more expensive `toString`-based type checks if `obj` has no + // `.length`. + var length = _getLength(obj); + if (typeof length == 'number' && ( + isArray(obj) || isString(obj) || isArguments(obj) + )) return length === 0; + return _getLength(keys(obj)) === 0; +} + +module.exports = isEmpty; diff --git a/src/node_modules/underscore/cjs/isEqual.js b/src/node_modules/underscore/cjs/isEqual.js new file mode 100644 index 0000000..34bf5e6 --- /dev/null +++ b/src/node_modules/underscore/cjs/isEqual.js @@ -0,0 +1,140 @@ +var underscore = require('./underscore.js'); +var _setup = require('./_setup.js'); +var _getByteLength = require('./_getByteLength.js'); +var isTypedArray = require('./isTypedArray.js'); +var isFunction = require('./isFunction.js'); +var _stringTagBug = require('./_stringTagBug.js'); +var isDataView = require('./isDataView.js'); +var keys = require('./keys.js'); +var _has = require('./_has.js'); +var _toBufferView = require('./_toBufferView.js'); + +// We use this string twice, so give it a name for minification. +var tagDataView = '[object DataView]'; + +// Internal recursive comparison function for `_.isEqual`. +function eq(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); +} + +// Internal recursive comparison function for `_.isEqual`. +function deepEq(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof underscore) a = a._wrapped; + if (b instanceof underscore) b = b._wrapped; + // Compare `[[Class]]` names. + var className = _setup.toString.call(a); + if (className !== _setup.toString.call(b)) return false; + // Work around a bug in IE 10 - Edge 13. + if (_stringTagBug.hasStringTagBug && className == '[object Object]' && isDataView(a)) { + if (!isDataView(b)) return false; + className = tagDataView; + } + switch (className) { + // These types are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return _setup.SymbolProto.valueOf.call(a) === _setup.SymbolProto.valueOf.call(b); + case '[object ArrayBuffer]': + case tagDataView: + // Coerce to typed array so we can fall through. + return deepEq(_toBufferView(a), _toBufferView(b), aStack, bStack); + } + + var areArrays = className === '[object Array]'; + if (!areArrays && isTypedArray(a)) { + var byteLength = _getByteLength(a); + if (byteLength !== _getByteLength(b)) return false; + if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; + areArrays = true; + } + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor && + isFunction(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var _keys = keys(a), key; + length = _keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = _keys[length]; + if (!(_has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; +} + +// Perform a deep comparison to check if two objects are equal. +function isEqual(a, b) { + return eq(a, b); +} + +module.exports = isEqual; diff --git a/src/node_modules/underscore/cjs/isError.js b/src/node_modules/underscore/cjs/isError.js new file mode 100644 index 0000000..a2df914 --- /dev/null +++ b/src/node_modules/underscore/cjs/isError.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var isError = _tagTester('Error'); + +module.exports = isError; diff --git a/src/node_modules/underscore/cjs/isFinite.js b/src/node_modules/underscore/cjs/isFinite.js new file mode 100644 index 0000000..5359c3a --- /dev/null +++ b/src/node_modules/underscore/cjs/isFinite.js @@ -0,0 +1,9 @@ +var _setup = require('./_setup.js'); +var isSymbol = require('./isSymbol.js'); + +// Is a given object a finite number? +function isFinite(obj) { + return !isSymbol(obj) && _setup._isFinite(obj) && !isNaN(parseFloat(obj)); +} + +module.exports = isFinite; diff --git a/src/node_modules/underscore/cjs/isFunction.js b/src/node_modules/underscore/cjs/isFunction.js new file mode 100644 index 0000000..a1c5968 --- /dev/null +++ b/src/node_modules/underscore/cjs/isFunction.js @@ -0,0 +1,17 @@ +var _tagTester = require('./_tagTester.js'); +var _setup = require('./_setup.js'); + +var isFunction = _tagTester('Function'); + +// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old +// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). +var nodelist = _setup.root.document && _setup.root.document.childNodes; +if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + isFunction = function(obj) { + return typeof obj == 'function' || false; + }; +} + +var isFunction$1 = isFunction; + +module.exports = isFunction$1; diff --git a/src/node_modules/underscore/cjs/isMap.js b/src/node_modules/underscore/cjs/isMap.js new file mode 100644 index 0000000..a7dfb03 --- /dev/null +++ b/src/node_modules/underscore/cjs/isMap.js @@ -0,0 +1,7 @@ +var _tagTester = require('./_tagTester.js'); +var _stringTagBug = require('./_stringTagBug.js'); +var _methodFingerprint = require('./_methodFingerprint.js'); + +var isMap = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.mapMethods) : _tagTester('Map'); + +module.exports = isMap; diff --git a/src/node_modules/underscore/cjs/isMatch.js b/src/node_modules/underscore/cjs/isMatch.js new file mode 100644 index 0000000..7b6c500 --- /dev/null +++ b/src/node_modules/underscore/cjs/isMatch.js @@ -0,0 +1,15 @@ +var keys = require('./keys.js'); + +// Returns whether an object has a given set of `key:value` pairs. +function isMatch(object, attrs) { + var _keys = keys(attrs), length = _keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = _keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; +} + +module.exports = isMatch; diff --git a/src/node_modules/underscore/cjs/isNaN.js b/src/node_modules/underscore/cjs/isNaN.js new file mode 100644 index 0000000..f6ade7e --- /dev/null +++ b/src/node_modules/underscore/cjs/isNaN.js @@ -0,0 +1,9 @@ +var _setup = require('./_setup.js'); +var isNumber = require('./isNumber.js'); + +// Is the given value `NaN`? +function isNaN(obj) { + return isNumber(obj) && _setup._isNaN(obj); +} + +module.exports = isNaN; diff --git a/src/node_modules/underscore/cjs/isNull.js b/src/node_modules/underscore/cjs/isNull.js new file mode 100644 index 0000000..43705a4 --- /dev/null +++ b/src/node_modules/underscore/cjs/isNull.js @@ -0,0 +1,6 @@ +// Is a given value equal to null? +function isNull(obj) { + return obj === null; +} + +module.exports = isNull; diff --git a/src/node_modules/underscore/cjs/isNumber.js b/src/node_modules/underscore/cjs/isNumber.js new file mode 100644 index 0000000..52d5b44 --- /dev/null +++ b/src/node_modules/underscore/cjs/isNumber.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var isNumber = _tagTester('Number'); + +module.exports = isNumber; diff --git a/src/node_modules/underscore/cjs/isObject.js b/src/node_modules/underscore/cjs/isObject.js new file mode 100644 index 0000000..6f9ae3b --- /dev/null +++ b/src/node_modules/underscore/cjs/isObject.js @@ -0,0 +1,7 @@ +// Is a given variable an object? +function isObject(obj) { + var type = typeof obj; + return type === 'function' || (type === 'object' && !!obj); +} + +module.exports = isObject; diff --git a/src/node_modules/underscore/cjs/isRegExp.js b/src/node_modules/underscore/cjs/isRegExp.js new file mode 100644 index 0000000..3026bab --- /dev/null +++ b/src/node_modules/underscore/cjs/isRegExp.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var isRegExp = _tagTester('RegExp'); + +module.exports = isRegExp; diff --git a/src/node_modules/underscore/cjs/isSet.js b/src/node_modules/underscore/cjs/isSet.js new file mode 100644 index 0000000..a28c1d9 --- /dev/null +++ b/src/node_modules/underscore/cjs/isSet.js @@ -0,0 +1,7 @@ +var _tagTester = require('./_tagTester.js'); +var _stringTagBug = require('./_stringTagBug.js'); +var _methodFingerprint = require('./_methodFingerprint.js'); + +var isSet = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.setMethods) : _tagTester('Set'); + +module.exports = isSet; diff --git a/src/node_modules/underscore/cjs/isString.js b/src/node_modules/underscore/cjs/isString.js new file mode 100644 index 0000000..c7c3887 --- /dev/null +++ b/src/node_modules/underscore/cjs/isString.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var isString = _tagTester('String'); + +module.exports = isString; diff --git a/src/node_modules/underscore/cjs/isSymbol.js b/src/node_modules/underscore/cjs/isSymbol.js new file mode 100644 index 0000000..140a54e --- /dev/null +++ b/src/node_modules/underscore/cjs/isSymbol.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var isSymbol = _tagTester('Symbol'); + +module.exports = isSymbol; diff --git a/src/node_modules/underscore/cjs/isTypedArray.js b/src/node_modules/underscore/cjs/isTypedArray.js new file mode 100644 index 0000000..c3b467f --- /dev/null +++ b/src/node_modules/underscore/cjs/isTypedArray.js @@ -0,0 +1,17 @@ +var _setup = require('./_setup.js'); +var isDataView = require('./isDataView.js'); +var constant = require('./constant.js'); +var _isBufferLike = require('./_isBufferLike.js'); + +// Is a given value a typed array? +var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; +function isTypedArray(obj) { + // `ArrayBuffer.isView` is the most future-proof, so use it when available. + // Otherwise, fall back on the above regular expression. + return _setup.nativeIsView ? (_setup.nativeIsView(obj) && !isDataView(obj)) : + _isBufferLike(obj) && typedArrayPattern.test(_setup.toString.call(obj)); +} + +var isTypedArray$1 = _setup.supportsArrayBuffer ? isTypedArray : constant(false); + +module.exports = isTypedArray$1; diff --git a/src/node_modules/underscore/cjs/isUndefined.js b/src/node_modules/underscore/cjs/isUndefined.js new file mode 100644 index 0000000..e59c968 --- /dev/null +++ b/src/node_modules/underscore/cjs/isUndefined.js @@ -0,0 +1,6 @@ +// Is a given variable undefined? +function isUndefined(obj) { + return obj === void 0; +} + +module.exports = isUndefined; diff --git a/src/node_modules/underscore/cjs/isWeakMap.js b/src/node_modules/underscore/cjs/isWeakMap.js new file mode 100644 index 0000000..ee3c10e --- /dev/null +++ b/src/node_modules/underscore/cjs/isWeakMap.js @@ -0,0 +1,7 @@ +var _tagTester = require('./_tagTester.js'); +var _stringTagBug = require('./_stringTagBug.js'); +var _methodFingerprint = require('./_methodFingerprint.js'); + +var isWeakMap = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.weakMapMethods) : _tagTester('WeakMap'); + +module.exports = isWeakMap; diff --git a/src/node_modules/underscore/cjs/isWeakSet.js b/src/node_modules/underscore/cjs/isWeakSet.js new file mode 100644 index 0000000..06104ea --- /dev/null +++ b/src/node_modules/underscore/cjs/isWeakSet.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var isWeakSet = _tagTester('WeakSet'); + +module.exports = isWeakSet; diff --git a/src/node_modules/underscore/cjs/iteratee.js b/src/node_modules/underscore/cjs/iteratee.js new file mode 100644 index 0000000..52b5275 --- /dev/null +++ b/src/node_modules/underscore/cjs/iteratee.js @@ -0,0 +1,12 @@ +var underscore = require('./underscore.js'); +var _baseIteratee = require('./_baseIteratee.js'); + +// External wrapper for our callback generator. Users may customize +// `_.iteratee` if they want additional predicate/iteratee shorthand styles. +// This abstraction hides the internal-only `argCount` argument. +function iteratee(value, context) { + return _baseIteratee(value, context, Infinity); +} +underscore.iteratee = iteratee; + +module.exports = iteratee; diff --git a/src/node_modules/underscore/cjs/keys.js b/src/node_modules/underscore/cjs/keys.js new file mode 100644 index 0000000..9caff25 --- /dev/null +++ b/src/node_modules/underscore/cjs/keys.js @@ -0,0 +1,18 @@ +var isObject = require('./isObject.js'); +var _setup = require('./_setup.js'); +var _has = require('./_has.js'); +var _collectNonEnumProps = require('./_collectNonEnumProps.js'); + +// Retrieve the names of an object's own properties. +// Delegates to **ECMAScript 5**'s native `Object.keys`. +function keys(obj) { + if (!isObject(obj)) return []; + if (_setup.nativeKeys) return _setup.nativeKeys(obj); + var keys = []; + for (var key in obj) if (_has(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys); + return keys; +} + +module.exports = keys; diff --git a/src/node_modules/underscore/cjs/last.js b/src/node_modules/underscore/cjs/last.js new file mode 100644 index 0000000..9a9ff6d --- /dev/null +++ b/src/node_modules/underscore/cjs/last.js @@ -0,0 +1,11 @@ +var rest = require('./rest.js'); + +// Get the last element of an array. Passing **n** will return the last N +// values in the array. +function last(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return rest(array, Math.max(0, array.length - n)); +} + +module.exports = last; diff --git a/src/node_modules/underscore/cjs/lastIndexOf.js b/src/node_modules/underscore/cjs/lastIndexOf.js new file mode 100644 index 0000000..d7af858 --- /dev/null +++ b/src/node_modules/underscore/cjs/lastIndexOf.js @@ -0,0 +1,8 @@ +var findLastIndex = require('./findLastIndex.js'); +var _createIndexFinder = require('./_createIndexFinder.js'); + +// Return the position of the last occurrence of an item in an array, +// or -1 if the item is not included in the array. +var lastIndexOf = _createIndexFinder(-1, findLastIndex); + +module.exports = lastIndexOf; diff --git a/src/node_modules/underscore/cjs/map.js b/src/node_modules/underscore/cjs/map.js new file mode 100644 index 0000000..e44d51d --- /dev/null +++ b/src/node_modules/underscore/cjs/map.js @@ -0,0 +1,18 @@ +var _cb = require('./_cb.js'); +var _isArrayLike = require('./_isArrayLike.js'); +var keys = require('./keys.js'); + +// Return the results of applying the iteratee to each element. +function map(obj, iteratee, context) { + iteratee = _cb(iteratee, context); + var _keys = !_isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} + +module.exports = map; diff --git a/src/node_modules/underscore/cjs/mapObject.js b/src/node_modules/underscore/cjs/mapObject.js new file mode 100644 index 0000000..883caa7 --- /dev/null +++ b/src/node_modules/underscore/cjs/mapObject.js @@ -0,0 +1,18 @@ +var _cb = require('./_cb.js'); +var keys = require('./keys.js'); + +// Returns the results of applying the `iteratee` to each element of `obj`. +// In contrast to `_.map` it returns an object. +function mapObject(obj, iteratee, context) { + iteratee = _cb(iteratee, context); + var _keys = keys(obj), + length = _keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = _keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} + +module.exports = mapObject; diff --git a/src/node_modules/underscore/cjs/matcher.js b/src/node_modules/underscore/cjs/matcher.js new file mode 100644 index 0000000..579f8a8 --- /dev/null +++ b/src/node_modules/underscore/cjs/matcher.js @@ -0,0 +1,13 @@ +var extendOwn = require('./extendOwn.js'); +var isMatch = require('./isMatch.js'); + +// Returns a predicate for checking whether an object has a given set of +// `key:value` pairs. +function matcher(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; +} + +module.exports = matcher; diff --git a/src/node_modules/underscore/cjs/max.js b/src/node_modules/underscore/cjs/max.js new file mode 100644 index 0000000..2b06f51 --- /dev/null +++ b/src/node_modules/underscore/cjs/max.js @@ -0,0 +1,31 @@ +var _isArrayLike = require('./_isArrayLike.js'); +var values = require('./values.js'); +var _cb = require('./_cb.js'); +var each = require('./each.js'); + +// Return the maximum element (or element-based computation). +function max(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = _isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = _cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} + +module.exports = max; diff --git a/src/node_modules/underscore/cjs/memoize.js b/src/node_modules/underscore/cjs/memoize.js new file mode 100644 index 0000000..9d5b4e2 --- /dev/null +++ b/src/node_modules/underscore/cjs/memoize.js @@ -0,0 +1,15 @@ +var _has = require('./_has.js'); + +// Memoize an expensive function by storing its results. +function memoize(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!_has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; +} + +module.exports = memoize; diff --git a/src/node_modules/underscore/cjs/min.js b/src/node_modules/underscore/cjs/min.js new file mode 100644 index 0000000..17de77d --- /dev/null +++ b/src/node_modules/underscore/cjs/min.js @@ -0,0 +1,31 @@ +var _isArrayLike = require('./_isArrayLike.js'); +var values = require('./values.js'); +var _cb = require('./_cb.js'); +var each = require('./each.js'); + +// Return the minimum element (or element-based computation). +function min(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = _isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = _cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || (computed === Infinity && result === Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} + +module.exports = min; diff --git a/src/node_modules/underscore/cjs/mixin.js b/src/node_modules/underscore/cjs/mixin.js new file mode 100644 index 0000000..a0fbb3a --- /dev/null +++ b/src/node_modules/underscore/cjs/mixin.js @@ -0,0 +1,20 @@ +var underscore = require('./underscore.js'); +var each = require('./each.js'); +var functions = require('./functions.js'); +var _setup = require('./_setup.js'); +var _chainResult = require('./_chainResult.js'); + +// Add your own custom functions to the Underscore object. +function mixin(obj) { + each(functions(obj), function(name) { + var func = underscore[name] = obj[name]; + underscore.prototype[name] = function() { + var args = [this._wrapped]; + _setup.push.apply(args, arguments); + return _chainResult(this, func.apply(underscore, args)); + }; + }); + return underscore; +} + +module.exports = mixin; diff --git a/src/node_modules/underscore/cjs/negate.js b/src/node_modules/underscore/cjs/negate.js new file mode 100644 index 0000000..d4a22ed --- /dev/null +++ b/src/node_modules/underscore/cjs/negate.js @@ -0,0 +1,8 @@ +// Returns a negated version of the passed-in predicate. +function negate(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; +} + +module.exports = negate; diff --git a/src/node_modules/underscore/cjs/noop.js b/src/node_modules/underscore/cjs/noop.js new file mode 100644 index 0000000..4d355ba --- /dev/null +++ b/src/node_modules/underscore/cjs/noop.js @@ -0,0 +1,4 @@ +// Predicate-generating function. Often useful outside of Underscore. +function noop(){} + +module.exports = noop; diff --git a/src/node_modules/underscore/cjs/now.js b/src/node_modules/underscore/cjs/now.js new file mode 100644 index 0000000..746e66e --- /dev/null +++ b/src/node_modules/underscore/cjs/now.js @@ -0,0 +1,6 @@ +// A (possibly faster) way to get the current timestamp as an integer. +var now = Date.now || function() { + return new Date().getTime(); +}; + +module.exports = now; diff --git a/src/node_modules/underscore/cjs/object.js b/src/node_modules/underscore/cjs/object.js new file mode 100644 index 0000000..583b320 --- /dev/null +++ b/src/node_modules/underscore/cjs/object.js @@ -0,0 +1,18 @@ +var _getLength = require('./_getLength.js'); + +// Converts lists into objects. Pass either a single array of `[key, value]` +// pairs, or two parallel arrays of the same length -- one of keys, and one of +// the corresponding values. Passing by pairs is the reverse of `_.pairs`. +function object(list, values) { + var result = {}; + for (var i = 0, length = _getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; +} + +module.exports = object; diff --git a/src/node_modules/underscore/cjs/omit.js b/src/node_modules/underscore/cjs/omit.js new file mode 100644 index 0000000..b80651b --- /dev/null +++ b/src/node_modules/underscore/cjs/omit.js @@ -0,0 +1,24 @@ +var restArguments = require('./restArguments.js'); +var isFunction = require('./isFunction.js'); +var negate = require('./negate.js'); +var map = require('./map.js'); +var _flatten = require('./_flatten.js'); +var contains = require('./contains.js'); +var pick = require('./pick.js'); + +// Return a copy of the object without the disallowed properties. +var omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (isFunction(iteratee)) { + iteratee = negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = map(_flatten(keys, false, false), String); + iteratee = function(value, key) { + return !contains(keys, key); + }; + } + return pick(obj, iteratee, context); +}); + +module.exports = omit; diff --git a/src/node_modules/underscore/cjs/once.js b/src/node_modules/underscore/cjs/once.js new file mode 100644 index 0000000..d9cb81d --- /dev/null +++ b/src/node_modules/underscore/cjs/once.js @@ -0,0 +1,8 @@ +var partial = require('./partial.js'); +var before = require('./before.js'); + +// Returns a function that will be executed at most one time, no matter how +// often you call it. Useful for lazy initialization. +var once = partial(before, 2); + +module.exports = once; diff --git a/src/node_modules/underscore/cjs/pairs.js b/src/node_modules/underscore/cjs/pairs.js new file mode 100644 index 0000000..399243e --- /dev/null +++ b/src/node_modules/underscore/cjs/pairs.js @@ -0,0 +1,15 @@ +var keys = require('./keys.js'); + +// Convert an object into a list of `[key, value]` pairs. +// The opposite of `_.object` with one argument. +function pairs(obj) { + var _keys = keys(obj); + var length = _keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [_keys[i], obj[_keys[i]]]; + } + return pairs; +} + +module.exports = pairs; diff --git a/src/node_modules/underscore/cjs/partial.js b/src/node_modules/underscore/cjs/partial.js new file mode 100644 index 0000000..d6f5bd8 --- /dev/null +++ b/src/node_modules/underscore/cjs/partial.js @@ -0,0 +1,25 @@ +var restArguments = require('./restArguments.js'); +var _executeBound = require('./_executeBound.js'); +var underscore = require('./underscore.js'); + +// Partially apply a function by creating a version that has had some of its +// arguments pre-filled, without changing its dynamic `this` context. `_` acts +// as a placeholder by default, allowing any combination of arguments to be +// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. +var partial = restArguments(function(func, boundArgs) { + var placeholder = partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return _executeBound(func, bound, this, this, args); + }; + return bound; +}); + +partial.placeholder = underscore; + +module.exports = partial; diff --git a/src/node_modules/underscore/cjs/partition.js b/src/node_modules/underscore/cjs/partition.js new file mode 100644 index 0000000..294786f --- /dev/null +++ b/src/node_modules/underscore/cjs/partition.js @@ -0,0 +1,9 @@ +var _group = require('./_group.js'); + +// Split a collection into two arrays: one whose elements all pass the given +// truth test, and one whose elements all do not pass the truth test. +var partition = _group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); +}, true); + +module.exports = partition; diff --git a/src/node_modules/underscore/cjs/pick.js b/src/node_modules/underscore/cjs/pick.js new file mode 100644 index 0000000..df74220 --- /dev/null +++ b/src/node_modules/underscore/cjs/pick.js @@ -0,0 +1,28 @@ +var restArguments = require('./restArguments.js'); +var isFunction = require('./isFunction.js'); +var _optimizeCb = require('./_optimizeCb.js'); +var allKeys = require('./allKeys.js'); +var _keyInObj = require('./_keyInObj.js'); +var _flatten = require('./_flatten.js'); + +// Return a copy of the object only containing the allowed properties. +var pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (isFunction(iteratee)) { + if (keys.length > 1) iteratee = _optimizeCb(iteratee, keys[1]); + keys = allKeys(obj); + } else { + iteratee = _keyInObj; + keys = _flatten(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; +}); + +module.exports = pick; diff --git a/src/node_modules/underscore/cjs/pluck.js b/src/node_modules/underscore/cjs/pluck.js new file mode 100644 index 0000000..043c1b4 --- /dev/null +++ b/src/node_modules/underscore/cjs/pluck.js @@ -0,0 +1,9 @@ +var map = require('./map.js'); +var property = require('./property.js'); + +// Convenience version of a common use case of `_.map`: fetching a property. +function pluck(obj, key) { + return map(obj, property(key)); +} + +module.exports = pluck; diff --git a/src/node_modules/underscore/cjs/property.js b/src/node_modules/underscore/cjs/property.js new file mode 100644 index 0000000..e7b069d --- /dev/null +++ b/src/node_modules/underscore/cjs/property.js @@ -0,0 +1,13 @@ +var _deepGet = require('./_deepGet.js'); +var _toPath = require('./_toPath.js'); + +// Creates a function that, when passed an object, will traverse that object’s +// properties down the given `path`, specified as an array of keys or indices. +function property(path) { + path = _toPath(path); + return function(obj) { + return _deepGet(obj, path); + }; +} + +module.exports = property; diff --git a/src/node_modules/underscore/cjs/propertyOf.js b/src/node_modules/underscore/cjs/propertyOf.js new file mode 100644 index 0000000..2039a32 --- /dev/null +++ b/src/node_modules/underscore/cjs/propertyOf.js @@ -0,0 +1,12 @@ +var noop = require('./noop.js'); +var get = require('./get.js'); + +// Generates a function for a given object that returns a given property. +function propertyOf(obj) { + if (obj == null) return noop; + return function(path) { + return get(obj, path); + }; +} + +module.exports = propertyOf; diff --git a/src/node_modules/underscore/cjs/random.js b/src/node_modules/underscore/cjs/random.js new file mode 100644 index 0000000..cb9a0ab --- /dev/null +++ b/src/node_modules/underscore/cjs/random.js @@ -0,0 +1,10 @@ +// Return a random integer between `min` and `max` (inclusive). +function random(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); +} + +module.exports = random; diff --git a/src/node_modules/underscore/cjs/range.js b/src/node_modules/underscore/cjs/range.js new file mode 100644 index 0000000..7a5a241 --- /dev/null +++ b/src/node_modules/underscore/cjs/range.js @@ -0,0 +1,23 @@ +// Generate an integer Array containing an arithmetic progression. A port of +// the native Python `range()` function. See +// [the Python documentation](https://docs.python.org/library/functions.html#range). +function range(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; +} + +module.exports = range; diff --git a/src/node_modules/underscore/cjs/reduce.js b/src/node_modules/underscore/cjs/reduce.js new file mode 100644 index 0000000..170b1b0 --- /dev/null +++ b/src/node_modules/underscore/cjs/reduce.js @@ -0,0 +1,7 @@ +var _createReduce = require('./_createReduce.js'); + +// **Reduce** builds up a single result from a list of values, aka `inject`, +// or `foldl`. +var reduce = _createReduce(1); + +module.exports = reduce; diff --git a/src/node_modules/underscore/cjs/reduceRight.js b/src/node_modules/underscore/cjs/reduceRight.js new file mode 100644 index 0000000..52413d7 --- /dev/null +++ b/src/node_modules/underscore/cjs/reduceRight.js @@ -0,0 +1,6 @@ +var _createReduce = require('./_createReduce.js'); + +// The right-associative version of reduce, also known as `foldr`. +var reduceRight = _createReduce(-1); + +module.exports = reduceRight; diff --git a/src/node_modules/underscore/cjs/reject.js b/src/node_modules/underscore/cjs/reject.js new file mode 100644 index 0000000..8608b63 --- /dev/null +++ b/src/node_modules/underscore/cjs/reject.js @@ -0,0 +1,10 @@ +var filter = require('./filter.js'); +var negate = require('./negate.js'); +var _cb = require('./_cb.js'); + +// Return all the elements for which a truth test fails. +function reject(obj, predicate, context) { + return filter(obj, negate(_cb(predicate)), context); +} + +module.exports = reject; diff --git a/src/node_modules/underscore/cjs/rest.js b/src/node_modules/underscore/cjs/rest.js new file mode 100644 index 0000000..4ce7662 --- /dev/null +++ b/src/node_modules/underscore/cjs/rest.js @@ -0,0 +1,10 @@ +var _setup = require('./_setup.js'); + +// Returns everything but the first entry of the `array`. Especially useful on +// the `arguments` object. Passing an **n** will return the rest N values in the +// `array`. +function rest(array, n, guard) { + return _setup.slice.call(array, n == null || guard ? 1 : n); +} + +module.exports = rest; diff --git a/src/node_modules/underscore/cjs/restArguments.js b/src/node_modules/underscore/cjs/restArguments.js new file mode 100644 index 0000000..b292cb4 --- /dev/null +++ b/src/node_modules/underscore/cjs/restArguments.js @@ -0,0 +1,29 @@ +// Some functions take a variable number of arguments, or a few expected +// arguments at the beginning and then a variable number of values to operate +// on. This helper accumulates all remaining arguments past the function’s +// argument length (or an explicit `startIndex`), into an array that becomes +// the last argument. Similar to ES6’s "rest parameter". +function restArguments(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; +} + +module.exports = restArguments; diff --git a/src/node_modules/underscore/cjs/result.js b/src/node_modules/underscore/cjs/result.js new file mode 100644 index 0000000..7bd3fb6 --- /dev/null +++ b/src/node_modules/underscore/cjs/result.js @@ -0,0 +1,24 @@ +var isFunction = require('./isFunction.js'); +var _toPath = require('./_toPath.js'); + +// Traverses the children of `obj` along `path`. If a child is a function, it +// is invoked with its parent as context. Returns the value of the final +// child, or `fallback` if any child is undefined. +function result(obj, path, fallback) { + path = _toPath(path); + var length = path.length; + if (!length) { + return isFunction(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = isFunction(prop) ? prop.call(obj) : prop; + } + return obj; +} + +module.exports = result; diff --git a/src/node_modules/underscore/cjs/sample.js b/src/node_modules/underscore/cjs/sample.js new file mode 100644 index 0000000..c640ff4 --- /dev/null +++ b/src/node_modules/underscore/cjs/sample.js @@ -0,0 +1,29 @@ +var _isArrayLike = require('./_isArrayLike.js'); +var values = require('./values.js'); +var _getLength = require('./_getLength.js'); +var random = require('./random.js'); +var toArray = require('./toArray.js'); + +// Sample **n** random values from a collection using the modern version of the +// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). +// If **n** is not specified, returns a single random element. +// The internal `guard` argument allows it to work with `_.map`. +function sample(obj, n, guard) { + if (n == null || guard) { + if (!_isArrayLike(obj)) obj = values(obj); + return obj[random(obj.length - 1)]; + } + var sample = toArray(obj); + var length = _getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); +} + +module.exports = sample; diff --git a/src/node_modules/underscore/cjs/shuffle.js b/src/node_modules/underscore/cjs/shuffle.js new file mode 100644 index 0000000..2694917 --- /dev/null +++ b/src/node_modules/underscore/cjs/shuffle.js @@ -0,0 +1,8 @@ +var sample = require('./sample.js'); + +// Shuffle a collection. +function shuffle(obj) { + return sample(obj, Infinity); +} + +module.exports = shuffle; diff --git a/src/node_modules/underscore/cjs/size.js b/src/node_modules/underscore/cjs/size.js new file mode 100644 index 0000000..a65f4c0 --- /dev/null +++ b/src/node_modules/underscore/cjs/size.js @@ -0,0 +1,10 @@ +var _isArrayLike = require('./_isArrayLike.js'); +var keys = require('./keys.js'); + +// Return the number of elements in a collection. +function size(obj) { + if (obj == null) return 0; + return _isArrayLike(obj) ? obj.length : keys(obj).length; +} + +module.exports = size; diff --git a/src/node_modules/underscore/cjs/some.js b/src/node_modules/underscore/cjs/some.js new file mode 100644 index 0000000..346752e --- /dev/null +++ b/src/node_modules/underscore/cjs/some.js @@ -0,0 +1,17 @@ +var _cb = require('./_cb.js'); +var _isArrayLike = require('./_isArrayLike.js'); +var keys = require('./keys.js'); + +// Determine if at least one element in the object passes a truth test. +function some(obj, predicate, context) { + predicate = _cb(predicate, context); + var _keys = !_isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; +} + +module.exports = some; diff --git a/src/node_modules/underscore/cjs/sortBy.js b/src/node_modules/underscore/cjs/sortBy.js new file mode 100644 index 0000000..28dae07 --- /dev/null +++ b/src/node_modules/underscore/cjs/sortBy.js @@ -0,0 +1,26 @@ +var _cb = require('./_cb.js'); +var pluck = require('./pluck.js'); +var map = require('./map.js'); + +// Sort the object's values by a criterion produced by an iteratee. +function sortBy(obj, iteratee, context) { + var index = 0; + iteratee = _cb(iteratee, context); + return pluck(map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); +} + +module.exports = sortBy; diff --git a/src/node_modules/underscore/cjs/sortedIndex.js b/src/node_modules/underscore/cjs/sortedIndex.js new file mode 100644 index 0000000..1f26171 --- /dev/null +++ b/src/node_modules/underscore/cjs/sortedIndex.js @@ -0,0 +1,17 @@ +var _cb = require('./_cb.js'); +var _getLength = require('./_getLength.js'); + +// Use a comparator function to figure out the smallest index at which +// an object should be inserted so as to maintain order. Uses binary search. +function sortedIndex(array, obj, iteratee, context) { + iteratee = _cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = _getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; +} + +module.exports = sortedIndex; diff --git a/src/node_modules/underscore/cjs/tap.js b/src/node_modules/underscore/cjs/tap.js new file mode 100644 index 0000000..3dc681f --- /dev/null +++ b/src/node_modules/underscore/cjs/tap.js @@ -0,0 +1,9 @@ +// Invokes `interceptor` with the `obj` and then returns `obj`. +// The primary purpose of this method is to "tap into" a method chain, in +// order to perform operations on intermediate results within the chain. +function tap(obj, interceptor) { + interceptor(obj); + return obj; +} + +module.exports = tap; diff --git a/src/node_modules/underscore/cjs/template.js b/src/node_modules/underscore/cjs/template.js new file mode 100644 index 0000000..cf626aa --- /dev/null +++ b/src/node_modules/underscore/cjs/template.js @@ -0,0 +1,103 @@ +var defaults = require('./defaults.js'); +var underscore = require('./underscore.js'); +require('./templateSettings.js'); + +// When customizing `_.templateSettings`, if you don't want to define an +// interpolation, evaluation or escaping regex, we need one that is +// guaranteed not to match. +var noMatch = /(.)^/; + +// Certain characters need to be escaped so that they can be put into a +// string literal. +var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' +}; + +var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + +function escapeChar(match) { + return '\\' + escapes[match]; +} + +// In order to prevent third-party code injection through +// `_.templateSettings.variable`, we test it against the following regular +// expression. It is intentionally a bit more liberal than just matching valid +// identifiers, but still prevents possible loopholes through defaults or +// destructuring assignment. +var bareIdentifier = /^\s*(\w|\$)+\s*$/; + +// JavaScript micro-templating, similar to John Resig's implementation. +// Underscore templating handles arbitrary delimiters, preserves whitespace, +// and correctly escapes quotes within interpolated code. +// NB: `oldSettings` only exists for backwards compatibility. +function template(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = defaults({}, settings, underscore.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(argument, '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, underscore); + }; + + // Provide the compiled source as a convenience for precompilation. + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; +} + +module.exports = template; diff --git a/src/node_modules/underscore/cjs/templateSettings.js b/src/node_modules/underscore/cjs/templateSettings.js new file mode 100644 index 0000000..4b55798 --- /dev/null +++ b/src/node_modules/underscore/cjs/templateSettings.js @@ -0,0 +1,11 @@ +var underscore = require('./underscore.js'); + +// By default, Underscore uses ERB-style template delimiters. Change the +// following template settings to use alternative delimiters. +var templateSettings = underscore.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g +}; + +module.exports = templateSettings; diff --git a/src/node_modules/underscore/cjs/throttle.js b/src/node_modules/underscore/cjs/throttle.js new file mode 100644 index 0000000..3b013d9 --- /dev/null +++ b/src/node_modules/underscore/cjs/throttle.js @@ -0,0 +1,49 @@ +var now = require('./now.js'); + +// Returns a function, that, when invoked, will only be triggered at most once +// during a given window of time. Normally, the throttled function will run +// as much as it can, without ever going more than once per `wait` duration; +// but if you'd like to disable the execution on the leading edge, pass +// `{leading: false}`. To disable execution on the trailing edge, ditto. +function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var _now = now(); + if (!previous && options.leading === false) previous = _now; + var remaining = wait - (_now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = _now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; +} + +module.exports = throttle; diff --git a/src/node_modules/underscore/cjs/times.js b/src/node_modules/underscore/cjs/times.js new file mode 100644 index 0000000..0a36b79 --- /dev/null +++ b/src/node_modules/underscore/cjs/times.js @@ -0,0 +1,11 @@ +var _optimizeCb = require('./_optimizeCb.js'); + +// Run a function **n** times. +function times(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = _optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; +} + +module.exports = times; diff --git a/src/node_modules/underscore/cjs/toArray.js b/src/node_modules/underscore/cjs/toArray.js new file mode 100644 index 0000000..4f29a05 --- /dev/null +++ b/src/node_modules/underscore/cjs/toArray.js @@ -0,0 +1,22 @@ +var isArray = require('./isArray.js'); +var _setup = require('./_setup.js'); +var isString = require('./isString.js'); +var _isArrayLike = require('./_isArrayLike.js'); +var map = require('./map.js'); +var identity = require('./identity.js'); +var values = require('./values.js'); + +// Safely create a real, live array from anything iterable. +var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; +function toArray(obj) { + if (!obj) return []; + if (isArray(obj)) return _setup.slice.call(obj); + if (isString(obj)) { + // Keep surrogate pair characters together. + return obj.match(reStrSymbol); + } + if (_isArrayLike(obj)) return map(obj, identity); + return values(obj); +} + +module.exports = toArray; diff --git a/src/node_modules/underscore/cjs/toPath.js b/src/node_modules/underscore/cjs/toPath.js new file mode 100644 index 0000000..94f41c9 --- /dev/null +++ b/src/node_modules/underscore/cjs/toPath.js @@ -0,0 +1,11 @@ +var underscore = require('./underscore.js'); +var isArray = require('./isArray.js'); + +// Normalize a (deep) property `path` to array. +// Like `_.iteratee`, this function can be customized. +function toPath(path) { + return isArray(path) ? path : [path]; +} +underscore.toPath = toPath; + +module.exports = toPath; diff --git a/src/node_modules/underscore/cjs/underscore-array-methods.js b/src/node_modules/underscore/cjs/underscore-array-methods.js new file mode 100644 index 0000000..baf2d18 --- /dev/null +++ b/src/node_modules/underscore/cjs/underscore-array-methods.js @@ -0,0 +1,31 @@ +var underscore = require('./underscore.js'); +var each = require('./each.js'); +var _setup = require('./_setup.js'); +var _chainResult = require('./_chainResult.js'); + +// Add all mutator `Array` functions to the wrapper. +each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = _setup.ArrayProto[name]; + underscore.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) { + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) { + delete obj[0]; + } + } + return _chainResult(this, obj); + }; +}); + +// Add all accessor `Array` functions to the wrapper. +each(['concat', 'join', 'slice'], function(name) { + var method = _setup.ArrayProto[name]; + underscore.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) obj = method.apply(obj, arguments); + return _chainResult(this, obj); + }; +}); + +module.exports = underscore; diff --git a/src/node_modules/underscore/cjs/underscore.js b/src/node_modules/underscore/cjs/underscore.js new file mode 100644 index 0000000..d3cf809 --- /dev/null +++ b/src/node_modules/underscore/cjs/underscore.js @@ -0,0 +1,27 @@ +var _setup = require('./_setup.js'); + +// If Underscore is called as a function, it returns a wrapped object that can +// be used OO-style. This wrapper holds altered versions of all functions added +// through `_.mixin`. Wrapped objects may be chained. +function _(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; +} + +_.VERSION = _setup.VERSION; + +// Extracts the result from a wrapped and chained object. +_.prototype.value = function() { + return this._wrapped; +}; + +// Provide unwrapping proxies for some methods used in engine operations +// such as arithmetic and JSON stringification. +_.prototype.valueOf = _.prototype.toJSON = _.prototype.value; + +_.prototype.toString = function() { + return String(this._wrapped); +}; + +module.exports = _; diff --git a/src/node_modules/underscore/cjs/unescape.js b/src/node_modules/underscore/cjs/unescape.js new file mode 100644 index 0000000..2d5a597 --- /dev/null +++ b/src/node_modules/underscore/cjs/unescape.js @@ -0,0 +1,7 @@ +var _createEscaper = require('./_createEscaper.js'); +var _unescapeMap = require('./_unescapeMap.js'); + +// Function for unescaping strings from HTML interpolation. +var _unescape = _createEscaper(_unescapeMap); + +module.exports = _unescape; diff --git a/src/node_modules/underscore/cjs/union.js b/src/node_modules/underscore/cjs/union.js new file mode 100644 index 0000000..fb15bcb --- /dev/null +++ b/src/node_modules/underscore/cjs/union.js @@ -0,0 +1,11 @@ +var restArguments = require('./restArguments.js'); +var uniq = require('./uniq.js'); +var _flatten = require('./_flatten.js'); + +// Produce an array that contains the union: each distinct element from all of +// the passed-in arrays. +var union = restArguments(function(arrays) { + return uniq(_flatten(arrays, true, true)); +}); + +module.exports = union; diff --git a/src/node_modules/underscore/cjs/uniq.js b/src/node_modules/underscore/cjs/uniq.js new file mode 100644 index 0000000..2e8f683 --- /dev/null +++ b/src/node_modules/underscore/cjs/uniq.js @@ -0,0 +1,38 @@ +var isBoolean = require('./isBoolean.js'); +var _cb = require('./_cb.js'); +var _getLength = require('./_getLength.js'); +var contains = require('./contains.js'); + +// Produce a duplicate-free version of the array. If the array has already +// been sorted, you have the option of using a faster algorithm. +// The faster algorithm will not work with an iteratee if the iteratee +// is not a one-to-one function, so providing an iteratee will disable +// the faster algorithm. +function uniq(array, isSorted, iteratee, context) { + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = _cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = _getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!contains(result, value)) { + result.push(value); + } + } + return result; +} + +module.exports = uniq; diff --git a/src/node_modules/underscore/cjs/uniqueId.js b/src/node_modules/underscore/cjs/uniqueId.js new file mode 100644 index 0000000..e639e83 --- /dev/null +++ b/src/node_modules/underscore/cjs/uniqueId.js @@ -0,0 +1,9 @@ +// Generate a unique integer id (unique within the entire client session). +// Useful for temporary DOM ids. +var idCounter = 0; +function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; +} + +module.exports = uniqueId; diff --git a/src/node_modules/underscore/cjs/unzip.js b/src/node_modules/underscore/cjs/unzip.js new file mode 100644 index 0000000..2493e54 --- /dev/null +++ b/src/node_modules/underscore/cjs/unzip.js @@ -0,0 +1,17 @@ +var max = require('./max.js'); +var _getLength = require('./_getLength.js'); +var pluck = require('./pluck.js'); + +// Complement of zip. Unzip accepts an array of arrays and groups +// each array's elements on shared indices. +function unzip(array) { + var length = (array && max(array, _getLength).length) || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = pluck(array, index); + } + return result; +} + +module.exports = unzip; diff --git a/src/node_modules/underscore/cjs/values.js b/src/node_modules/underscore/cjs/values.js new file mode 100644 index 0000000..393c8b7 --- /dev/null +++ b/src/node_modules/underscore/cjs/values.js @@ -0,0 +1,14 @@ +var keys = require('./keys.js'); + +// Retrieve the values of an object's properties. +function values(obj) { + var _keys = keys(obj); + var length = _keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[_keys[i]]; + } + return values; +} + +module.exports = values; diff --git a/src/node_modules/underscore/cjs/where.js b/src/node_modules/underscore/cjs/where.js new file mode 100644 index 0000000..94ccfe7 --- /dev/null +++ b/src/node_modules/underscore/cjs/where.js @@ -0,0 +1,10 @@ +var filter = require('./filter.js'); +var matcher = require('./matcher.js'); + +// Convenience version of a common use case of `_.filter`: selecting only +// objects containing specific `key:value` pairs. +function where(obj, attrs) { + return filter(obj, matcher(attrs)); +} + +module.exports = where; diff --git a/src/node_modules/underscore/cjs/without.js b/src/node_modules/underscore/cjs/without.js new file mode 100644 index 0000000..5eaa4cd --- /dev/null +++ b/src/node_modules/underscore/cjs/without.js @@ -0,0 +1,9 @@ +var restArguments = require('./restArguments.js'); +var difference = require('./difference.js'); + +// Return a version of the array that does not contain the specified value(s). +var without = restArguments(function(array, otherArrays) { + return difference(array, otherArrays); +}); + +module.exports = without; diff --git a/src/node_modules/underscore/cjs/wrap.js b/src/node_modules/underscore/cjs/wrap.js new file mode 100644 index 0000000..e95d5a7 --- /dev/null +++ b/src/node_modules/underscore/cjs/wrap.js @@ -0,0 +1,10 @@ +var partial = require('./partial.js'); + +// Returns the first function passed as an argument to the second, +// allowing you to adjust arguments, run code before and after, and +// conditionally execute the original function. +function wrap(func, wrapper) { + return partial(wrapper, func); +} + +module.exports = wrap; diff --git a/src/node_modules/underscore/cjs/zip.js b/src/node_modules/underscore/cjs/zip.js new file mode 100644 index 0000000..70cbd3b --- /dev/null +++ b/src/node_modules/underscore/cjs/zip.js @@ -0,0 +1,8 @@ +var restArguments = require('./restArguments.js'); +var unzip = require('./unzip.js'); + +// Zip together multiple lists into a single array -- elements that share +// an index go together. +var zip = restArguments(unzip); + +module.exports = zip; diff --git a/src/node_modules/underscore/modules/.eslintrc b/src/node_modules/underscore/modules/.eslintrc new file mode 100644 index 0000000..23961d5 --- /dev/null +++ b/src/node_modules/underscore/modules/.eslintrc @@ -0,0 +1,21 @@ +{ + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module", + }, + "plugins": [ + "import" + ], + "extends": [ + "plugin:import/errors" + ], + "rules": { + // ExtendScript wrongly gives equal precedence to && and ||. #2949 + "no-mixed-operators": [ + "error", + { + "groups": [["&&", "||"]] + } + ] + } +} diff --git a/src/node_modules/underscore/modules/_baseCreate.js b/src/node_modules/underscore/modules/_baseCreate.js new file mode 100644 index 0000000..032a972 --- /dev/null +++ b/src/node_modules/underscore/modules/_baseCreate.js @@ -0,0 +1,18 @@ +import isObject from './isObject.js'; +import { nativeCreate } from './_setup.js'; + +// Create a naked function reference for surrogate-prototype-swapping. +function ctor() { + return function(){}; +} + +// An internal function for creating a new object that inherits from another. +export default function baseCreate(prototype) { + if (!isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + var Ctor = ctor(); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; +} diff --git a/src/node_modules/underscore/modules/_baseIteratee.js b/src/node_modules/underscore/modules/_baseIteratee.js new file mode 100644 index 0000000..c276ebe --- /dev/null +++ b/src/node_modules/underscore/modules/_baseIteratee.js @@ -0,0 +1,17 @@ +import identity from './identity.js'; +import isFunction from './isFunction.js'; +import isObject from './isObject.js'; +import isArray from './isArray.js'; +import matcher from './matcher.js'; +import property from './property.js'; +import optimizeCb from './_optimizeCb.js'; + +// An internal function to generate callbacks that can be applied to each +// element in a collection, returning the desired result — either `_.identity`, +// an arbitrary callback, a property matcher, or a property accessor. +export default function baseIteratee(value, context, argCount) { + if (value == null) return identity; + if (isFunction(value)) return optimizeCb(value, context, argCount); + if (isObject(value) && !isArray(value)) return matcher(value); + return property(value); +} diff --git a/src/node_modules/underscore/modules/_cb.js b/src/node_modules/underscore/modules/_cb.js new file mode 100644 index 0000000..9b8b555 --- /dev/null +++ b/src/node_modules/underscore/modules/_cb.js @@ -0,0 +1,10 @@ +import _ from './underscore.js'; +import baseIteratee from './_baseIteratee.js'; +import iteratee from './iteratee.js'; + +// The function we call internally to generate a callback. It invokes +// `_.iteratee` if overridden, otherwise `baseIteratee`. +export default function cb(value, context, argCount) { + if (_.iteratee !== iteratee) return _.iteratee(value, context); + return baseIteratee(value, context, argCount); +} diff --git a/src/node_modules/underscore/modules/_chainResult.js b/src/node_modules/underscore/modules/_chainResult.js new file mode 100644 index 0000000..b786520 --- /dev/null +++ b/src/node_modules/underscore/modules/_chainResult.js @@ -0,0 +1,6 @@ +import _ from './underscore.js'; + +// Helper function to continue chaining intermediate results. +export default function chainResult(instance, obj) { + return instance._chain ? _(obj).chain() : obj; +} diff --git a/src/node_modules/underscore/modules/_collectNonEnumProps.js b/src/node_modules/underscore/modules/_collectNonEnumProps.js new file mode 100644 index 0000000..eed0f7b --- /dev/null +++ b/src/node_modules/underscore/modules/_collectNonEnumProps.js @@ -0,0 +1,40 @@ +import { nonEnumerableProps, ObjProto } from './_setup.js'; +import isFunction from './isFunction.js'; +import has from './_has.js'; + +// Internal helper to create a simple lookup structure. +// `collectNonEnumProps` used to depend on `_.contains`, but this led to +// circular imports. `emulatedSet` is a one-off solution that only works for +// arrays of strings. +function emulatedSet(keys) { + var hash = {}; + for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; + return { + contains: function(key) { return hash[key] === true; }, + push: function(key) { + hash[key] = true; + return keys.push(key); + } + }; +} + +// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't +// be iterated by `for key in ...` and thus missed. Extends `keys` in place if +// needed. +export default function collectNonEnumProps(obj, keys) { + keys = emulatedSet(keys); + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (isFunction(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (has(obj, prop) && !keys.contains(prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { + keys.push(prop); + } + } +} diff --git a/src/node_modules/underscore/modules/_createAssigner.js b/src/node_modules/underscore/modules/_createAssigner.js new file mode 100644 index 0000000..b102393 --- /dev/null +++ b/src/node_modules/underscore/modules/_createAssigner.js @@ -0,0 +1,18 @@ +// An internal function for creating assigner functions. +export default function createAssigner(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; +} diff --git a/src/node_modules/underscore/modules/_createEscaper.js b/src/node_modules/underscore/modules/_createEscaper.js new file mode 100644 index 0000000..3828b56 --- /dev/null +++ b/src/node_modules/underscore/modules/_createEscaper.js @@ -0,0 +1,17 @@ +import keys from './keys.js'; + +// Internal helper to generate functions for escaping and unescaping strings +// to/from HTML interpolation. +export default function createEscaper(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; +} diff --git a/src/node_modules/underscore/modules/_createIndexFinder.js b/src/node_modules/underscore/modules/_createIndexFinder.js new file mode 100644 index 0000000..eadedef --- /dev/null +++ b/src/node_modules/underscore/modules/_createIndexFinder.js @@ -0,0 +1,28 @@ +import getLength from './_getLength.js'; +import { slice } from './_setup.js'; +import isNaN from './isNaN.js'; + +// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. +export default function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), isNaN); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; +} diff --git a/src/node_modules/underscore/modules/_createPredicateIndexFinder.js b/src/node_modules/underscore/modules/_createPredicateIndexFinder.js new file mode 100644 index 0000000..c065948 --- /dev/null +++ b/src/node_modules/underscore/modules/_createPredicateIndexFinder.js @@ -0,0 +1,15 @@ +import cb from './_cb.js'; +import getLength from './_getLength.js'; + +// Internal function to generate `_.findIndex` and `_.findLastIndex`. +export default function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; +} diff --git a/src/node_modules/underscore/modules/_createReduce.js b/src/node_modules/underscore/modules/_createReduce.js new file mode 100644 index 0000000..20f4ee1 --- /dev/null +++ b/src/node_modules/underscore/modules/_createReduce.js @@ -0,0 +1,28 @@ +import isArrayLike from './_isArrayLike.js'; +import keys from './keys.js'; +import optimizeCb from './_optimizeCb.js'; + +// Internal helper to create a reducing function, iterating left or right. +export default function createReduce(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[_keys ? _keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = _keys ? _keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); + }; +} diff --git a/src/node_modules/underscore/modules/_createSizePropertyCheck.js b/src/node_modules/underscore/modules/_createSizePropertyCheck.js new file mode 100644 index 0000000..cc38007 --- /dev/null +++ b/src/node_modules/underscore/modules/_createSizePropertyCheck.js @@ -0,0 +1,9 @@ +import { MAX_ARRAY_INDEX } from './_setup.js'; + +// Common internal logic for `isArrayLike` and `isBufferLike`. +export default function createSizePropertyCheck(getSizeProperty) { + return function(collection) { + var sizeProperty = getSizeProperty(collection); + return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX; + } +} diff --git a/src/node_modules/underscore/modules/_deepGet.js b/src/node_modules/underscore/modules/_deepGet.js new file mode 100644 index 0000000..42bbec3 --- /dev/null +++ b/src/node_modules/underscore/modules/_deepGet.js @@ -0,0 +1,9 @@ +// Internal function to obtain a nested property in `obj` along `path`. +export default function deepGet(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; +} diff --git a/src/node_modules/underscore/modules/_escapeMap.js b/src/node_modules/underscore/modules/_escapeMap.js new file mode 100644 index 0000000..cc9d615 --- /dev/null +++ b/src/node_modules/underscore/modules/_escapeMap.js @@ -0,0 +1,9 @@ +// Internal list of HTML entities for escaping. +export default { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' +}; diff --git a/src/node_modules/underscore/modules/_executeBound.js b/src/node_modules/underscore/modules/_executeBound.js new file mode 100644 index 0000000..f54fa78 --- /dev/null +++ b/src/node_modules/underscore/modules/_executeBound.js @@ -0,0 +1,13 @@ +import baseCreate from './_baseCreate.js'; +import isObject from './isObject.js'; + +// Internal function to execute `sourceFunc` bound to `context` with optional +// `args`. Determines whether to execute a function as a constructor or as a +// normal function. +export default function executeBound(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (isObject(result)) return result; + return self; +} diff --git a/src/node_modules/underscore/modules/_flatten.js b/src/node_modules/underscore/modules/_flatten.js new file mode 100644 index 0000000..1767a8b --- /dev/null +++ b/src/node_modules/underscore/modules/_flatten.js @@ -0,0 +1,31 @@ +import getLength from './_getLength.js'; +import isArrayLike from './_isArrayLike.js'; +import isArray from './isArray.js'; +import isArguments from './isArguments.js'; + +// Internal implementation of a recursive `flatten` function. +export default function flatten(input, depth, strict, output) { + output = output || []; + if (!depth && depth !== 0) { + depth = Infinity; + } else if (depth <= 0) { + return output.concat(input); + } + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (isArray(value) || isArguments(value))) { + // Flatten current level of array or arguments object. + if (depth > 1) { + flatten(value, depth - 1, strict, output); + idx = output.length; + } else { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; +} diff --git a/src/node_modules/underscore/modules/_getByteLength.js b/src/node_modules/underscore/modules/_getByteLength.js new file mode 100644 index 0000000..11e4528 --- /dev/null +++ b/src/node_modules/underscore/modules/_getByteLength.js @@ -0,0 +1,4 @@ +import shallowProperty from './_shallowProperty.js'; + +// Internal helper to obtain the `byteLength` property of an object. +export default shallowProperty('byteLength'); diff --git a/src/node_modules/underscore/modules/_getLength.js b/src/node_modules/underscore/modules/_getLength.js new file mode 100644 index 0000000..090b156 --- /dev/null +++ b/src/node_modules/underscore/modules/_getLength.js @@ -0,0 +1,4 @@ +import shallowProperty from './_shallowProperty.js'; + +// Internal helper to obtain the `length` property of an object. +export default shallowProperty('length'); diff --git a/src/node_modules/underscore/modules/_group.js b/src/node_modules/underscore/modules/_group.js new file mode 100644 index 0000000..8fdd985 --- /dev/null +++ b/src/node_modules/underscore/modules/_group.js @@ -0,0 +1,15 @@ +import cb from './_cb.js'; +import each from './each.js'; + +// An internal function used for aggregate "group by" operations. +export default function group(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = cb(iteratee, context); + each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; +} diff --git a/src/node_modules/underscore/modules/_has.js b/src/node_modules/underscore/modules/_has.js new file mode 100644 index 0000000..0636181 --- /dev/null +++ b/src/node_modules/underscore/modules/_has.js @@ -0,0 +1,6 @@ +import { hasOwnProperty } from './_setup.js'; + +// Internal function to check whether `key` is an own property name of `obj`. +export default function has(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); +} diff --git a/src/node_modules/underscore/modules/_hasObjectTag.js b/src/node_modules/underscore/modules/_hasObjectTag.js new file mode 100644 index 0000000..85db78c --- /dev/null +++ b/src/node_modules/underscore/modules/_hasObjectTag.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('Object'); diff --git a/src/node_modules/underscore/modules/_isArrayLike.js b/src/node_modules/underscore/modules/_isArrayLike.js new file mode 100644 index 0000000..a87fe48 --- /dev/null +++ b/src/node_modules/underscore/modules/_isArrayLike.js @@ -0,0 +1,8 @@ +import createSizePropertyCheck from './_createSizePropertyCheck.js'; +import getLength from './_getLength.js'; + +// Internal helper for collection methods to determine whether a collection +// should be iterated as an array or as an object. +// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength +// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 +export default createSizePropertyCheck(getLength); diff --git a/src/node_modules/underscore/modules/_isBufferLike.js b/src/node_modules/underscore/modules/_isBufferLike.js new file mode 100644 index 0000000..8cab6ee --- /dev/null +++ b/src/node_modules/underscore/modules/_isBufferLike.js @@ -0,0 +1,6 @@ +import createSizePropertyCheck from './_createSizePropertyCheck.js'; +import getByteLength from './_getByteLength.js'; + +// Internal helper to determine whether we should spend extensive checks against +// `ArrayBuffer` et al. +export default createSizePropertyCheck(getByteLength); diff --git a/src/node_modules/underscore/modules/_keyInObj.js b/src/node_modules/underscore/modules/_keyInObj.js new file mode 100644 index 0000000..f72a851 --- /dev/null +++ b/src/node_modules/underscore/modules/_keyInObj.js @@ -0,0 +1,5 @@ +// Internal `_.pick` helper function to determine whether `key` is an enumerable +// property name of `obj`. +export default function keyInObj(value, key, obj) { + return key in obj; +} diff --git a/src/node_modules/underscore/modules/_methodFingerprint.js b/src/node_modules/underscore/modules/_methodFingerprint.js new file mode 100644 index 0000000..a1ebff3 --- /dev/null +++ b/src/node_modules/underscore/modules/_methodFingerprint.js @@ -0,0 +1,37 @@ +import getLength from './_getLength.js'; +import isFunction from './isFunction.js'; +import allKeys from './allKeys.js'; + +// Since the regular `Object.prototype.toString` type tests don't work for +// some types in IE 11, we use a fingerprinting heuristic instead, based +// on the methods. It's not great, but it's the best we got. +// The fingerprint method lists are defined below. +export function ie11fingerprint(methods) { + var length = getLength(methods); + return function(obj) { + if (obj == null) return false; + // `Map`, `WeakMap` and `Set` have no enumerable keys. + var keys = allKeys(obj); + if (getLength(keys)) return false; + for (var i = 0; i < length; i++) { + if (!isFunction(obj[methods[i]])) return false; + } + // If we are testing against `WeakMap`, we need to ensure that + // `obj` doesn't have a `forEach` method in order to distinguish + // it from a regular `Map`. + return methods !== weakMapMethods || !isFunction(obj[forEachName]); + }; +} + +// In the interest of compact minification, we write +// each string in the fingerprints only once. +var forEachName = 'forEach', + hasName = 'has', + commonInit = ['clear', 'delete'], + mapTail = ['get', hasName, 'set']; + +// `Map`, `WeakMap` and `Set` each have slightly different +// combinations of the above sublists. +export var mapMethods = commonInit.concat(forEachName, mapTail), + weakMapMethods = commonInit.concat(mapTail), + setMethods = ['add'].concat(commonInit, forEachName, hasName); diff --git a/src/node_modules/underscore/modules/_optimizeCb.js b/src/node_modules/underscore/modules/_optimizeCb.js new file mode 100644 index 0000000..59e40e6 --- /dev/null +++ b/src/node_modules/underscore/modules/_optimizeCb.js @@ -0,0 +1,21 @@ +// Internal function that returns an efficient (for current engines) version +// of the passed-in callback, to be repeatedly applied in other Underscore +// functions. +export default function optimizeCb(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; +} diff --git a/src/node_modules/underscore/modules/_setup.js b/src/node_modules/underscore/modules/_setup.js new file mode 100644 index 0000000..de7555a --- /dev/null +++ b/src/node_modules/underscore/modules/_setup.js @@ -0,0 +1,43 @@ +// Current version. +export var VERSION = '1.13.4'; + +// Establish the root object, `window` (`self`) in the browser, `global` +// on the server, or `this` in some virtual machines. We use `self` +// instead of `window` for `WebWorker` support. +export var root = (typeof self == 'object' && self.self === self && self) || + (typeof global == 'object' && global.global === global && global) || + Function('return this')() || + {}; + +// Save bytes in the minified (but not gzipped) version: +export var ArrayProto = Array.prototype, ObjProto = Object.prototype; +export var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + +// Create quick reference variables for speed access to core prototypes. +export var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + +// Modern feature detection. +export var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + +// All **ECMAScript 5+** native function implementations that we hope to use +// are declared here. +export var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + +// Create references to these builtin functions because we override them. +export var _isNaN = isNaN, + _isFinite = isFinite; + +// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. +export var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); +export var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + +// The largest integer that can be represented exactly. +export var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; diff --git a/src/node_modules/underscore/modules/_shallowProperty.js b/src/node_modules/underscore/modules/_shallowProperty.js new file mode 100644 index 0000000..00bf090 --- /dev/null +++ b/src/node_modules/underscore/modules/_shallowProperty.js @@ -0,0 +1,6 @@ +// Internal helper to generate a function to obtain property `key` from `obj`. +export default function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; +} diff --git a/src/node_modules/underscore/modules/_stringTagBug.js b/src/node_modules/underscore/modules/_stringTagBug.js new file mode 100644 index 0000000..c85dd85 --- /dev/null +++ b/src/node_modules/underscore/modules/_stringTagBug.js @@ -0,0 +1,10 @@ +import { supportsDataView } from './_setup.js'; +import hasObjectTag from './_hasObjectTag.js'; + +// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. +// In IE 11, the most common among them, this problem also applies to +// `Map`, `WeakMap` and `Set`. +export var hasStringTagBug = ( + supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8))) + ), + isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map)); diff --git a/src/node_modules/underscore/modules/_tagTester.js b/src/node_modules/underscore/modules/_tagTester.js new file mode 100644 index 0000000..8d417dd --- /dev/null +++ b/src/node_modules/underscore/modules/_tagTester.js @@ -0,0 +1,9 @@ +import { toString } from './_setup.js'; + +// Internal function for creating a `toString`-based type tester. +export default function tagTester(name) { + var tag = '[object ' + name + ']'; + return function(obj) { + return toString.call(obj) === tag; + }; +} diff --git a/src/node_modules/underscore/modules/_toBufferView.js b/src/node_modules/underscore/modules/_toBufferView.js new file mode 100644 index 0000000..dd646a5 --- /dev/null +++ b/src/node_modules/underscore/modules/_toBufferView.js @@ -0,0 +1,11 @@ +import getByteLength from './_getByteLength.js'; + +// Internal function to wrap or shallow-copy an ArrayBuffer, +// typed array or DataView to a new view, reusing the buffer. +export default function toBufferView(bufferSource) { + return new Uint8Array( + bufferSource.buffer || bufferSource, + bufferSource.byteOffset || 0, + getByteLength(bufferSource) + ); +} diff --git a/src/node_modules/underscore/modules/_toPath.js b/src/node_modules/underscore/modules/_toPath.js new file mode 100644 index 0000000..fad5150 --- /dev/null +++ b/src/node_modules/underscore/modules/_toPath.js @@ -0,0 +1,8 @@ +import _ from './underscore.js'; +import './toPath.js'; + +// Internal wrapper for `_.toPath` to enable minification. +// Similar to `cb` for `_.iteratee`. +export default function toPath(path) { + return _.toPath(path); +} diff --git a/src/node_modules/underscore/modules/_unescapeMap.js b/src/node_modules/underscore/modules/_unescapeMap.js new file mode 100644 index 0000000..af35e3d --- /dev/null +++ b/src/node_modules/underscore/modules/_unescapeMap.js @@ -0,0 +1,5 @@ +import invert from './invert.js'; +import escapeMap from './_escapeMap.js'; + +// Internal list of HTML entities for unescaping. +export default invert(escapeMap); diff --git a/src/node_modules/underscore/modules/after.js b/src/node_modules/underscore/modules/after.js new file mode 100644 index 0000000..863e8b5 --- /dev/null +++ b/src/node_modules/underscore/modules/after.js @@ -0,0 +1,8 @@ +// Returns a function that will only be executed on and after the Nth call. +export default function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; +} diff --git a/src/node_modules/underscore/modules/allKeys.js b/src/node_modules/underscore/modules/allKeys.js new file mode 100644 index 0000000..489cead --- /dev/null +++ b/src/node_modules/underscore/modules/allKeys.js @@ -0,0 +1,13 @@ +import isObject from './isObject.js'; +import { hasEnumBug } from './_setup.js'; +import collectNonEnumProps from './_collectNonEnumProps.js'; + +// Retrieve all the enumerable property names of an object. +export default function allKeys(obj) { + if (!isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; +} diff --git a/src/node_modules/underscore/modules/before.js b/src/node_modules/underscore/modules/before.js new file mode 100644 index 0000000..74ec244 --- /dev/null +++ b/src/node_modules/underscore/modules/before.js @@ -0,0 +1,12 @@ +// Returns a function that will only be executed up to (but not including) the +// Nth call. +export default function before(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; +} diff --git a/src/node_modules/underscore/modules/bind.js b/src/node_modules/underscore/modules/bind.js new file mode 100644 index 0000000..c172e34 --- /dev/null +++ b/src/node_modules/underscore/modules/bind.js @@ -0,0 +1,13 @@ +import restArguments from './restArguments.js'; +import isFunction from './isFunction.js'; +import executeBound from './_executeBound.js'; + +// Create a function bound to a given object (assigning `this`, and arguments, +// optionally). +export default restArguments(function(func, context, args) { + if (!isFunction(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; +}); diff --git a/src/node_modules/underscore/modules/bindAll.js b/src/node_modules/underscore/modules/bindAll.js new file mode 100644 index 0000000..da51aeb --- /dev/null +++ b/src/node_modules/underscore/modules/bindAll.js @@ -0,0 +1,17 @@ +import restArguments from './restArguments.js'; +import flatten from './_flatten.js'; +import bind from './bind.js'; + +// Bind a number of an object's methods to that object. Remaining arguments +// are the method names to be bound. Useful for ensuring that all callbacks +// defined on an object belong to it. +export default restArguments(function(obj, keys) { + keys = flatten(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = bind(obj[key], obj); + } + return obj; +}); diff --git a/src/node_modules/underscore/modules/chain.js b/src/node_modules/underscore/modules/chain.js new file mode 100644 index 0000000..d9dcf05 --- /dev/null +++ b/src/node_modules/underscore/modules/chain.js @@ -0,0 +1,8 @@ +import _ from './underscore.js'; + +// Start chaining a wrapped Underscore object. +export default function chain(obj) { + var instance = _(obj); + instance._chain = true; + return instance; +} diff --git a/src/node_modules/underscore/modules/chunk.js b/src/node_modules/underscore/modules/chunk.js new file mode 100644 index 0000000..5e01af5 --- /dev/null +++ b/src/node_modules/underscore/modules/chunk.js @@ -0,0 +1,13 @@ +import { slice } from './_setup.js'; + +// Chunk a single array into multiple arrays, each containing `count` or fewer +// items. +export default function chunk(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; +} diff --git a/src/node_modules/underscore/modules/clone.js b/src/node_modules/underscore/modules/clone.js new file mode 100644 index 0000000..b74689b --- /dev/null +++ b/src/node_modules/underscore/modules/clone.js @@ -0,0 +1,9 @@ +import isObject from './isObject.js'; +import isArray from './isArray.js'; +import extend from './extend.js'; + +// Create a (shallow-cloned) duplicate of an object. +export default function clone(obj) { + if (!isObject(obj)) return obj; + return isArray(obj) ? obj.slice() : extend({}, obj); +} diff --git a/src/node_modules/underscore/modules/compact.js b/src/node_modules/underscore/modules/compact.js new file mode 100644 index 0000000..d5d519e --- /dev/null +++ b/src/node_modules/underscore/modules/compact.js @@ -0,0 +1,6 @@ +import filter from './filter.js'; + +// Trim out all falsy values from an array. +export default function compact(array) { + return filter(array, Boolean); +} diff --git a/src/node_modules/underscore/modules/compose.js b/src/node_modules/underscore/modules/compose.js new file mode 100644 index 0000000..0d2584c --- /dev/null +++ b/src/node_modules/underscore/modules/compose.js @@ -0,0 +1,12 @@ +// Returns a function that is the composition of a list of functions, each +// consuming the return value of the function that follows. +export default function compose() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; +} diff --git a/src/node_modules/underscore/modules/constant.js b/src/node_modules/underscore/modules/constant.js new file mode 100644 index 0000000..6cfd92c --- /dev/null +++ b/src/node_modules/underscore/modules/constant.js @@ -0,0 +1,6 @@ +// Predicate-generating function. Often useful outside of Underscore. +export default function constant(value) { + return function() { + return value; + }; +} diff --git a/src/node_modules/underscore/modules/contains.js b/src/node_modules/underscore/modules/contains.js new file mode 100644 index 0000000..11cf64d --- /dev/null +++ b/src/node_modules/underscore/modules/contains.js @@ -0,0 +1,10 @@ +import isArrayLike from './_isArrayLike.js'; +import values from './values.js'; +import indexOf from './indexOf.js'; + +// Determine if the array or object contains a given item (using `===`). +export default function contains(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return indexOf(obj, item, fromIndex) >= 0; +} diff --git a/src/node_modules/underscore/modules/countBy.js b/src/node_modules/underscore/modules/countBy.js new file mode 100644 index 0000000..5d4cc7d --- /dev/null +++ b/src/node_modules/underscore/modules/countBy.js @@ -0,0 +1,9 @@ +import group from './_group.js'; +import has from './_has.js'; + +// Counts instances of an object that group by a certain criterion. Pass +// either a string attribute to count by, or a function that returns the +// criterion. +export default group(function(result, value, key) { + if (has(result, key)) result[key]++; else result[key] = 1; +}); diff --git a/src/node_modules/underscore/modules/create.js b/src/node_modules/underscore/modules/create.js new file mode 100644 index 0000000..353e5a5 --- /dev/null +++ b/src/node_modules/underscore/modules/create.js @@ -0,0 +1,11 @@ +import baseCreate from './_baseCreate.js'; +import extendOwn from './extendOwn.js'; + +// Creates an object that inherits from the given prototype object. +// If additional properties are provided then they will be added to the +// created object. +export default function create(prototype, props) { + var result = baseCreate(prototype); + if (props) extendOwn(result, props); + return result; +} diff --git a/src/node_modules/underscore/modules/debounce.js b/src/node_modules/underscore/modules/debounce.js new file mode 100644 index 0000000..76e3ae8 --- /dev/null +++ b/src/node_modules/underscore/modules/debounce.js @@ -0,0 +1,40 @@ +import restArguments from './restArguments.js'; +import now from './now.js'; + +// When a sequence of calls of the returned function ends, the argument +// function is triggered. The end of a sequence is defined by the `wait` +// parameter. If `immediate` is passed, the argument function will be +// triggered at the beginning of the sequence instead of at the end. +export default function debounce(func, wait, immediate) { + var timeout, previous, args, result, context; + + var later = function() { + var passed = now() - previous; + if (wait > passed) { + timeout = setTimeout(later, wait - passed); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + // This check is needed because `func` can recursively invoke `debounced`. + if (!timeout) args = context = null; + } + }; + + var debounced = restArguments(function(_args) { + context = this; + args = _args; + previous = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + if (immediate) result = func.apply(context, args); + } + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = args = context = null; + }; + + return debounced; +} diff --git a/src/node_modules/underscore/modules/defaults.js b/src/node_modules/underscore/modules/defaults.js new file mode 100644 index 0000000..48016cc --- /dev/null +++ b/src/node_modules/underscore/modules/defaults.js @@ -0,0 +1,5 @@ +import createAssigner from './_createAssigner.js'; +import allKeys from './allKeys.js'; + +// Fill in a given object with default properties. +export default createAssigner(allKeys, true); diff --git a/src/node_modules/underscore/modules/defer.js b/src/node_modules/underscore/modules/defer.js new file mode 100644 index 0000000..19c85fd --- /dev/null +++ b/src/node_modules/underscore/modules/defer.js @@ -0,0 +1,7 @@ +import partial from './partial.js'; +import delay from './delay.js'; +import _ from './underscore.js'; + +// Defers a function, scheduling it to run after the current call stack has +// cleared. +export default partial(delay, _, 1); diff --git a/src/node_modules/underscore/modules/delay.js b/src/node_modules/underscore/modules/delay.js new file mode 100644 index 0000000..c144a84 --- /dev/null +++ b/src/node_modules/underscore/modules/delay.js @@ -0,0 +1,9 @@ +import restArguments from './restArguments.js'; + +// Delays a function for the given number of milliseconds, and then calls +// it with the arguments supplied. +export default restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); +}); diff --git a/src/node_modules/underscore/modules/difference.js b/src/node_modules/underscore/modules/difference.js new file mode 100644 index 0000000..c769923 --- /dev/null +++ b/src/node_modules/underscore/modules/difference.js @@ -0,0 +1,13 @@ +import restArguments from './restArguments.js'; +import flatten from './_flatten.js'; +import filter from './filter.js'; +import contains from './contains.js'; + +// Take the difference between one array and a number of other arrays. +// Only the elements present in just the first array will remain. +export default restArguments(function(array, rest) { + rest = flatten(rest, true, true); + return filter(array, function(value){ + return !contains(rest, value); + }); +}); diff --git a/src/node_modules/underscore/modules/each.js b/src/node_modules/underscore/modules/each.js new file mode 100644 index 0000000..d050200 --- /dev/null +++ b/src/node_modules/underscore/modules/each.js @@ -0,0 +1,23 @@ +import optimizeCb from './_optimizeCb.js'; +import isArrayLike from './_isArrayLike.js'; +import keys from './keys.js'; + +// The cornerstone for collection functions, an `each` +// implementation, aka `forEach`. +// Handles raw objects in addition to array-likes. Treats all +// sparse array-likes as if they were dense. +export default function each(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + for (i = 0, length = _keys.length; i < length; i++) { + iteratee(obj[_keys[i]], _keys[i], obj); + } + } + return obj; +} diff --git a/src/node_modules/underscore/modules/escape.js b/src/node_modules/underscore/modules/escape.js new file mode 100644 index 0000000..2bcb68f --- /dev/null +++ b/src/node_modules/underscore/modules/escape.js @@ -0,0 +1,5 @@ +import createEscaper from './_createEscaper.js'; +import escapeMap from './_escapeMap.js'; + +// Function for escaping strings to HTML interpolation. +export default createEscaper(escapeMap); diff --git a/src/node_modules/underscore/modules/every.js b/src/node_modules/underscore/modules/every.js new file mode 100644 index 0000000..9bc1408 --- /dev/null +++ b/src/node_modules/underscore/modules/every.js @@ -0,0 +1,15 @@ +import cb from './_cb.js'; +import isArrayLike from './_isArrayLike.js'; +import keys from './keys.js'; + +// Determine whether all of the elements pass a truth test. +export default function every(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; +} diff --git a/src/node_modules/underscore/modules/extend.js b/src/node_modules/underscore/modules/extend.js new file mode 100644 index 0000000..e22032b --- /dev/null +++ b/src/node_modules/underscore/modules/extend.js @@ -0,0 +1,5 @@ +import createAssigner from './_createAssigner.js'; +import allKeys from './allKeys.js'; + +// Extend a given object with all the properties in passed-in object(s). +export default createAssigner(allKeys); diff --git a/src/node_modules/underscore/modules/extendOwn.js b/src/node_modules/underscore/modules/extendOwn.js new file mode 100644 index 0000000..5338451 --- /dev/null +++ b/src/node_modules/underscore/modules/extendOwn.js @@ -0,0 +1,7 @@ +import createAssigner from './_createAssigner.js'; +import keys from './keys.js'; + +// Assigns a given object with all the own properties in the passed-in +// object(s). +// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) +export default createAssigner(keys); diff --git a/src/node_modules/underscore/modules/filter.js b/src/node_modules/underscore/modules/filter.js new file mode 100644 index 0000000..d170112 --- /dev/null +++ b/src/node_modules/underscore/modules/filter.js @@ -0,0 +1,12 @@ +import cb from './_cb.js'; +import each from './each.js'; + +// Return all the elements that pass a truth test. +export default function filter(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; +} diff --git a/src/node_modules/underscore/modules/find.js b/src/node_modules/underscore/modules/find.js new file mode 100644 index 0000000..d1f4d28 --- /dev/null +++ b/src/node_modules/underscore/modules/find.js @@ -0,0 +1,10 @@ +import isArrayLike from './_isArrayLike.js'; +import findIndex from './findIndex.js'; +import findKey from './findKey.js'; + +// Return the first value which passes a truth test. +export default function find(obj, predicate, context) { + var keyFinder = isArrayLike(obj) ? findIndex : findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; +} diff --git a/src/node_modules/underscore/modules/findIndex.js b/src/node_modules/underscore/modules/findIndex.js new file mode 100644 index 0000000..b2c87f5 --- /dev/null +++ b/src/node_modules/underscore/modules/findIndex.js @@ -0,0 +1,4 @@ +import createPredicateIndexFinder from './_createPredicateIndexFinder.js'; + +// Returns the first index on an array-like that passes a truth test. +export default createPredicateIndexFinder(1); diff --git a/src/node_modules/underscore/modules/findKey.js b/src/node_modules/underscore/modules/findKey.js new file mode 100644 index 0000000..e80f1c1 --- /dev/null +++ b/src/node_modules/underscore/modules/findKey.js @@ -0,0 +1,12 @@ +import cb from './_cb.js'; +import keys from './keys.js'; + +// Returns the first key on an object that passes a truth test. +export default function findKey(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = keys(obj), key; + for (var i = 0, length = _keys.length; i < length; i++) { + key = _keys[i]; + if (predicate(obj[key], key, obj)) return key; + } +} diff --git a/src/node_modules/underscore/modules/findLastIndex.js b/src/node_modules/underscore/modules/findLastIndex.js new file mode 100644 index 0000000..58f26a7 --- /dev/null +++ b/src/node_modules/underscore/modules/findLastIndex.js @@ -0,0 +1,4 @@ +import createPredicateIndexFinder from './_createPredicateIndexFinder.js'; + +// Returns the last index on an array-like that passes a truth test. +export default createPredicateIndexFinder(-1); diff --git a/src/node_modules/underscore/modules/findWhere.js b/src/node_modules/underscore/modules/findWhere.js new file mode 100644 index 0000000..6e8bce9 --- /dev/null +++ b/src/node_modules/underscore/modules/findWhere.js @@ -0,0 +1,8 @@ +import find from './find.js'; +import matcher from './matcher.js'; + +// Convenience version of a common use case of `_.find`: getting the first +// object containing specific `key:value` pairs. +export default function findWhere(obj, attrs) { + return find(obj, matcher(attrs)); +} diff --git a/src/node_modules/underscore/modules/first.js b/src/node_modules/underscore/modules/first.js new file mode 100644 index 0000000..3b6685e --- /dev/null +++ b/src/node_modules/underscore/modules/first.js @@ -0,0 +1,9 @@ +import initial from './initial.js'; + +// Get the first element of an array. Passing **n** will return the first N +// values in the array. The **guard** check allows it to work with `_.map`. +export default function first(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[0]; + return initial(array, array.length - n); +} diff --git a/src/node_modules/underscore/modules/flatten.js b/src/node_modules/underscore/modules/flatten.js new file mode 100644 index 0000000..a5f2b51 --- /dev/null +++ b/src/node_modules/underscore/modules/flatten.js @@ -0,0 +1,7 @@ +import _flatten from './_flatten.js'; + +// Flatten out an array, either recursively (by default), or up to `depth`. +// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. +export default function flatten(array, depth) { + return _flatten(array, depth, false); +} diff --git a/src/node_modules/underscore/modules/functions.js b/src/node_modules/underscore/modules/functions.js new file mode 100644 index 0000000..a16e568 --- /dev/null +++ b/src/node_modules/underscore/modules/functions.js @@ -0,0 +1,10 @@ +import isFunction from './isFunction.js'; + +// Return a sorted list of the function names available on the object. +export default function functions(obj) { + var names = []; + for (var key in obj) { + if (isFunction(obj[key])) names.push(key); + } + return names.sort(); +} diff --git a/src/node_modules/underscore/modules/get.js b/src/node_modules/underscore/modules/get.js new file mode 100644 index 0000000..6987abe --- /dev/null +++ b/src/node_modules/underscore/modules/get.js @@ -0,0 +1,12 @@ +import toPath from './_toPath.js'; +import deepGet from './_deepGet.js'; +import isUndefined from './isUndefined.js'; + +// Get the value of the (deep) property on `path` from `object`. +// If any property in `path` does not exist or if the value is +// `undefined`, return `defaultValue` instead. +// The `path` is normalized through `_.toPath`. +export default function get(object, path, defaultValue) { + var value = deepGet(object, toPath(path)); + return isUndefined(value) ? defaultValue : value; +} diff --git a/src/node_modules/underscore/modules/groupBy.js b/src/node_modules/underscore/modules/groupBy.js new file mode 100644 index 0000000..2670958 --- /dev/null +++ b/src/node_modules/underscore/modules/groupBy.js @@ -0,0 +1,8 @@ +import group from './_group.js'; +import has from './_has.js'; + +// Groups the object's values by a criterion. Pass either a string attribute +// to group by, or a function that returns the criterion. +export default group(function(result, value, key) { + if (has(result, key)) result[key].push(value); else result[key] = [value]; +}); diff --git a/src/node_modules/underscore/modules/has.js b/src/node_modules/underscore/modules/has.js new file mode 100644 index 0000000..7232646 --- /dev/null +++ b/src/node_modules/underscore/modules/has.js @@ -0,0 +1,16 @@ +import _has from './_has.js'; +import toPath from './_toPath.js'; + +// Shortcut function for checking if an object has a given property directly on +// itself (in other words, not on a prototype). Unlike the internal `has` +// function, this public version can also traverse nested properties. +export default function has(obj, path) { + path = toPath(path); + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (!_has(obj, key)) return false; + obj = obj[key]; + } + return !!length; +} diff --git a/src/node_modules/underscore/modules/identity.js b/src/node_modules/underscore/modules/identity.js new file mode 100644 index 0000000..6df631c --- /dev/null +++ b/src/node_modules/underscore/modules/identity.js @@ -0,0 +1,4 @@ +// Keep the identity function around for default iteratees. +export default function identity(value) { + return value; +} diff --git a/src/node_modules/underscore/modules/index-all.js b/src/node_modules/underscore/modules/index-all.js new file mode 100644 index 0000000..dd2cbc1 --- /dev/null +++ b/src/node_modules/underscore/modules/index-all.js @@ -0,0 +1,18 @@ +// ESM Exports +// =========== +// This module is the package entry point for ES module users. In other words, +// it is the module they are interfacing with when they import from the whole +// package instead of from a submodule, like this: +// +// ```js +// import { map } from 'underscore'; +// ``` +// +// The difference with `./index-default`, which is the package entry point for +// CommonJS, AMD and UMD users, is purely technical. In ES modules, named and +// default exports are considered to be siblings, so when you have a default +// export, its properties are not automatically available as named exports. For +// this reason, we re-export the named exports in addition to providing the same +// default export as in `./index-default`. +export { default } from './index-default.js'; +export * from './index.js'; diff --git a/src/node_modules/underscore/modules/index-default.js b/src/node_modules/underscore/modules/index-default.js new file mode 100644 index 0000000..d3a2b1e --- /dev/null +++ b/src/node_modules/underscore/modules/index-default.js @@ -0,0 +1,27 @@ +// Default Export +// ============== +// In this module, we mix our bundled exports into the `_` object and export +// the result. This is analogous to setting `module.exports = _` in CommonJS. +// Hence, this module is also the entry point of our UMD bundle and the package +// entry point for CommonJS and AMD users. In other words, this is (the source +// of) the module you are interfacing with when you do any of the following: +// +// ```js +// // CommonJS +// var _ = require('underscore'); +// +// // AMD +// define(['underscore'], function(_) {...}); +// +// // UMD in the browser +// // _ is available as a global variable +// ``` +import * as allExports from './index.js'; +import { mixin } from './index.js'; + +// Add all of the Underscore functions to the wrapper object. +var _ = mixin(allExports); +// Legacy Node.js API. +_._ = _; +// Export the Underscore API. +export default _; diff --git a/src/node_modules/underscore/modules/index.js b/src/node_modules/underscore/modules/index.js new file mode 100644 index 0000000..4db8269 --- /dev/null +++ b/src/node_modules/underscore/modules/index.js @@ -0,0 +1,200 @@ +// Named Exports +// ============= + +// Underscore.js 1.13.4 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +// Baseline setup. +export { VERSION } from './_setup.js'; +export { default as restArguments } from './restArguments.js'; + +// Object Functions +// ---------------- +// Our most fundamental functions operate on any JavaScript object. +// Most functions in Underscore depend on at least one function in this section. + +// A group of functions that check the types of core JavaScript values. +// These are often informally referred to as the "isType" functions. +export { default as isObject } from './isObject.js'; +export { default as isNull } from './isNull.js'; +export { default as isUndefined } from './isUndefined.js'; +export { default as isBoolean } from './isBoolean.js'; +export { default as isElement } from './isElement.js'; +export { default as isString } from './isString.js'; +export { default as isNumber } from './isNumber.js'; +export { default as isDate } from './isDate.js'; +export { default as isRegExp } from './isRegExp.js'; +export { default as isError } from './isError.js'; +export { default as isSymbol } from './isSymbol.js'; +export { default as isArrayBuffer } from './isArrayBuffer.js'; +export { default as isDataView } from './isDataView.js'; +export { default as isArray } from './isArray.js'; +export { default as isFunction } from './isFunction.js'; +export { default as isArguments } from './isArguments.js'; +export { default as isFinite } from './isFinite.js'; +export { default as isNaN } from './isNaN.js'; +export { default as isTypedArray } from './isTypedArray.js'; +export { default as isEmpty } from './isEmpty.js'; +export { default as isMatch } from './isMatch.js'; +export { default as isEqual } from './isEqual.js'; +export { default as isMap } from './isMap.js'; +export { default as isWeakMap } from './isWeakMap.js'; +export { default as isSet } from './isSet.js'; +export { default as isWeakSet } from './isWeakSet.js'; + +// Functions that treat an object as a dictionary of key-value pairs. +export { default as keys } from './keys.js'; +export { default as allKeys } from './allKeys.js'; +export { default as values } from './values.js'; +export { default as pairs } from './pairs.js'; +export { default as invert } from './invert.js'; +export { default as functions, + default as methods } from './functions.js'; +export { default as extend } from './extend.js'; +export { default as extendOwn, + default as assign } from './extendOwn.js'; +export { default as defaults } from './defaults.js'; +export { default as create } from './create.js'; +export { default as clone } from './clone.js'; +export { default as tap } from './tap.js'; +export { default as get } from './get.js'; +export { default as has } from './has.js'; +export { default as mapObject } from './mapObject.js'; + +// Utility Functions +// ----------------- +// A bit of a grab bag: Predicate-generating functions for use with filters and +// loops, string escaping and templating, create random numbers and unique ids, +// and functions that facilitate Underscore's chaining and iteration conventions. +export { default as identity } from './identity.js'; +export { default as constant } from './constant.js'; +export { default as noop } from './noop.js'; +export { default as toPath } from './toPath.js'; +export { default as property } from './property.js'; +export { default as propertyOf } from './propertyOf.js'; +export { default as matcher, + default as matches } from './matcher.js'; +export { default as times } from './times.js'; +export { default as random } from './random.js'; +export { default as now } from './now.js'; +export { default as escape } from './escape.js'; +export { default as unescape } from './unescape.js'; +export { default as templateSettings } from './templateSettings.js'; +export { default as template } from './template.js'; +export { default as result } from './result.js'; +export { default as uniqueId } from './uniqueId.js'; +export { default as chain } from './chain.js'; +export { default as iteratee } from './iteratee.js'; + +// Function (ahem) Functions +// ------------------------- +// These functions take a function as an argument and return a new function +// as the result. Also known as higher-order functions. +export { default as partial } from './partial.js'; +export { default as bind } from './bind.js'; +export { default as bindAll } from './bindAll.js'; +export { default as memoize } from './memoize.js'; +export { default as delay } from './delay.js'; +export { default as defer } from './defer.js'; +export { default as throttle } from './throttle.js'; +export { default as debounce } from './debounce.js'; +export { default as wrap } from './wrap.js'; +export { default as negate } from './negate.js'; +export { default as compose } from './compose.js'; +export { default as after } from './after.js'; +export { default as before } from './before.js'; +export { default as once } from './once.js'; + +// Finders +// ------- +// Functions that extract (the position of) a single element from an object +// or array based on some criterion. +export { default as findKey } from './findKey.js'; +export { default as findIndex } from './findIndex.js'; +export { default as findLastIndex } from './findLastIndex.js'; +export { default as sortedIndex } from './sortedIndex.js'; +export { default as indexOf } from './indexOf.js'; +export { default as lastIndexOf } from './lastIndexOf.js'; +export { default as find, + default as detect } from './find.js'; +export { default as findWhere } from './findWhere.js'; + +// Collection Functions +// -------------------- +// Functions that work on any collection of elements: either an array, or +// an object of key-value pairs. +export { default as each, + default as forEach } from './each.js'; +export { default as map, + default as collect } from './map.js'; +export { default as reduce, + default as foldl, + default as inject } from './reduce.js'; +export { default as reduceRight, + default as foldr } from './reduceRight.js'; +export { default as filter, + default as select } from './filter.js'; +export { default as reject } from './reject.js'; +export { default as every, + default as all } from './every.js'; +export { default as some, + default as any } from './some.js'; +export { default as contains, + default as includes, + default as include } from './contains.js'; +export { default as invoke } from './invoke.js'; +export { default as pluck } from './pluck.js'; +export { default as where } from './where.js'; +export { default as max } from './max.js'; +export { default as min } from './min.js'; +export { default as shuffle } from './shuffle.js'; +export { default as sample } from './sample.js'; +export { default as sortBy } from './sortBy.js'; +export { default as groupBy } from './groupBy.js'; +export { default as indexBy } from './indexBy.js'; +export { default as countBy } from './countBy.js'; +export { default as partition } from './partition.js'; +export { default as toArray } from './toArray.js'; +export { default as size } from './size.js'; + +// `_.pick` and `_.omit` are actually object functions, but we put +// them here in order to create a more natural reading order in the +// monolithic build as they depend on `_.contains`. +export { default as pick } from './pick.js'; +export { default as omit } from './omit.js'; + +// Array Functions +// --------------- +// Functions that operate on arrays (and array-likes) only, because they’re +// expressed in terms of operations on an ordered list of values. +export { default as first, + default as head, + default as take } from './first.js'; +export { default as initial } from './initial.js'; +export { default as last } from './last.js'; +export { default as rest, + default as tail, + default as drop } from './rest.js'; +export { default as compact } from './compact.js'; +export { default as flatten } from './flatten.js'; +export { default as without } from './without.js'; +export { default as uniq, + default as unique } from './uniq.js'; +export { default as union } from './union.js'; +export { default as intersection } from './intersection.js'; +export { default as difference } from './difference.js'; +export { default as unzip, + default as transpose } from './unzip.js'; +export { default as zip } from './zip.js'; +export { default as object } from './object.js'; +export { default as range } from './range.js'; +export { default as chunk } from './chunk.js'; + +// OOP +// --- +// These modules support the "object-oriented" calling style. See also +// `underscore.js` and `index-default.js`. +export { default as mixin } from './mixin.js'; +export { default } from './underscore-array-methods.js'; diff --git a/src/node_modules/underscore/modules/indexBy.js b/src/node_modules/underscore/modules/indexBy.js new file mode 100644 index 0000000..8fb81ea --- /dev/null +++ b/src/node_modules/underscore/modules/indexBy.js @@ -0,0 +1,7 @@ +import group from './_group.js'; + +// Indexes the object's values by a criterion, similar to `_.groupBy`, but for +// when you know that your index values will be unique. +export default group(function(result, value, key) { + result[key] = value; +}); diff --git a/src/node_modules/underscore/modules/indexOf.js b/src/node_modules/underscore/modules/indexOf.js new file mode 100644 index 0000000..a926ba5 --- /dev/null +++ b/src/node_modules/underscore/modules/indexOf.js @@ -0,0 +1,9 @@ +import sortedIndex from './sortedIndex.js'; +import findIndex from './findIndex.js'; +import createIndexFinder from './_createIndexFinder.js'; + +// Return the position of the first occurrence of an item in an array, +// or -1 if the item is not included in the array. +// If the array is large and already in sort order, pass `true` +// for **isSorted** to use binary search. +export default createIndexFinder(1, findIndex, sortedIndex); diff --git a/src/node_modules/underscore/modules/initial.js b/src/node_modules/underscore/modules/initial.js new file mode 100644 index 0000000..0b991dc --- /dev/null +++ b/src/node_modules/underscore/modules/initial.js @@ -0,0 +1,8 @@ +import { slice } from './_setup.js'; + +// Returns everything but the last entry of the array. Especially useful on +// the arguments object. Passing **n** will return all the values in +// the array, excluding the last N. +export default function initial(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); +} diff --git a/src/node_modules/underscore/modules/intersection.js b/src/node_modules/underscore/modules/intersection.js new file mode 100644 index 0000000..60d1df4 --- /dev/null +++ b/src/node_modules/underscore/modules/intersection.js @@ -0,0 +1,19 @@ +import getLength from './_getLength.js'; +import contains from './contains.js'; + +// Produce an array that contains every item shared between all the +// passed-in arrays. +export default function intersection(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; +} diff --git a/src/node_modules/underscore/modules/invert.js b/src/node_modules/underscore/modules/invert.js new file mode 100644 index 0000000..898b16a --- /dev/null +++ b/src/node_modules/underscore/modules/invert.js @@ -0,0 +1,11 @@ +import keys from './keys.js'; + +// Invert the keys and values of an object. The values must be serializable. +export default function invert(obj) { + var result = {}; + var _keys = keys(obj); + for (var i = 0, length = _keys.length; i < length; i++) { + result[obj[_keys[i]]] = _keys[i]; + } + return result; +} diff --git a/src/node_modules/underscore/modules/invoke.js b/src/node_modules/underscore/modules/invoke.js new file mode 100644 index 0000000..b18af88 --- /dev/null +++ b/src/node_modules/underscore/modules/invoke.js @@ -0,0 +1,28 @@ +import restArguments from './restArguments.js'; +import isFunction from './isFunction.js'; +import map from './map.js'; +import deepGet from './_deepGet.js'; +import toPath from './_toPath.js'; + +// Invoke a method (with arguments) on every item in a collection. +export default restArguments(function(obj, path, args) { + var contextPath, func; + if (isFunction(path)) { + func = path; + } else { + path = toPath(path); + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); +}); diff --git a/src/node_modules/underscore/modules/isArguments.js b/src/node_modules/underscore/modules/isArguments.js new file mode 100644 index 0000000..61582bf --- /dev/null +++ b/src/node_modules/underscore/modules/isArguments.js @@ -0,0 +1,16 @@ +import tagTester from './_tagTester.js'; +import has from './_has.js'; + +var isArguments = tagTester('Arguments'); + +// Define a fallback version of the method in browsers (ahem, IE < 9), where +// there isn't any inspectable "Arguments" type. +(function() { + if (!isArguments(arguments)) { + isArguments = function(obj) { + return has(obj, 'callee'); + }; + } +}()); + +export default isArguments; diff --git a/src/node_modules/underscore/modules/isArray.js b/src/node_modules/underscore/modules/isArray.js new file mode 100644 index 0000000..7ead47d --- /dev/null +++ b/src/node_modules/underscore/modules/isArray.js @@ -0,0 +1,6 @@ +import { nativeIsArray } from './_setup.js'; +import tagTester from './_tagTester.js'; + +// Is a given value an array? +// Delegates to ECMA5's native `Array.isArray`. +export default nativeIsArray || tagTester('Array'); diff --git a/src/node_modules/underscore/modules/isArrayBuffer.js b/src/node_modules/underscore/modules/isArrayBuffer.js new file mode 100644 index 0000000..867ba4b --- /dev/null +++ b/src/node_modules/underscore/modules/isArrayBuffer.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('ArrayBuffer'); diff --git a/src/node_modules/underscore/modules/isBoolean.js b/src/node_modules/underscore/modules/isBoolean.js new file mode 100644 index 0000000..3dddf2c --- /dev/null +++ b/src/node_modules/underscore/modules/isBoolean.js @@ -0,0 +1,6 @@ +import { toString } from './_setup.js'; + +// Is a given value a boolean? +export default function isBoolean(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; +} diff --git a/src/node_modules/underscore/modules/isDataView.js b/src/node_modules/underscore/modules/isDataView.js new file mode 100644 index 0000000..e607856 --- /dev/null +++ b/src/node_modules/underscore/modules/isDataView.js @@ -0,0 +1,14 @@ +import tagTester from './_tagTester.js'; +import isFunction from './isFunction.js'; +import isArrayBuffer from './isArrayBuffer.js'; +import { hasStringTagBug } from './_stringTagBug.js'; + +var isDataView = tagTester('DataView'); + +// In IE 10 - Edge 13, we need a different heuristic +// to determine whether an object is a `DataView`. +function ie10IsDataView(obj) { + return obj != null && isFunction(obj.getInt8) && isArrayBuffer(obj.buffer); +} + +export default (hasStringTagBug ? ie10IsDataView : isDataView); diff --git a/src/node_modules/underscore/modules/isDate.js b/src/node_modules/underscore/modules/isDate.js new file mode 100644 index 0000000..25e1d1c --- /dev/null +++ b/src/node_modules/underscore/modules/isDate.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('Date'); diff --git a/src/node_modules/underscore/modules/isElement.js b/src/node_modules/underscore/modules/isElement.js new file mode 100644 index 0000000..4ab415a --- /dev/null +++ b/src/node_modules/underscore/modules/isElement.js @@ -0,0 +1,4 @@ +// Is a given value a DOM element? +export default function isElement(obj) { + return !!(obj && obj.nodeType === 1); +} diff --git a/src/node_modules/underscore/modules/isEmpty.js b/src/node_modules/underscore/modules/isEmpty.js new file mode 100644 index 0000000..718ef4a --- /dev/null +++ b/src/node_modules/underscore/modules/isEmpty.js @@ -0,0 +1,18 @@ +import getLength from './_getLength.js'; +import isArray from './isArray.js'; +import isString from './isString.js'; +import isArguments from './isArguments.js'; +import keys from './keys.js'; + +// Is a given array, string, or object empty? +// An "empty" object has no enumerable own-properties. +export default function isEmpty(obj) { + if (obj == null) return true; + // Skip the more expensive `toString`-based type checks if `obj` has no + // `.length`. + var length = getLength(obj); + if (typeof length == 'number' && ( + isArray(obj) || isString(obj) || isArguments(obj) + )) return length === 0; + return getLength(keys(obj)) === 0; +} diff --git a/src/node_modules/underscore/modules/isEqual.js b/src/node_modules/underscore/modules/isEqual.js new file mode 100644 index 0000000..5285c55 --- /dev/null +++ b/src/node_modules/underscore/modules/isEqual.js @@ -0,0 +1,138 @@ +import _ from './underscore.js'; +import { toString, SymbolProto } from './_setup.js'; +import getByteLength from './_getByteLength.js'; +import isTypedArray from './isTypedArray.js'; +import isFunction from './isFunction.js'; +import { hasStringTagBug } from './_stringTagBug.js'; +import isDataView from './isDataView.js'; +import keys from './keys.js'; +import has from './_has.js'; +import toBufferView from './_toBufferView.js'; + +// We use this string twice, so give it a name for minification. +var tagDataView = '[object DataView]'; + +// Internal recursive comparison function for `_.isEqual`. +function eq(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); +} + +// Internal recursive comparison function for `_.isEqual`. +function deepEq(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof _) a = a._wrapped; + if (b instanceof _) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + // Work around a bug in IE 10 - Edge 13. + if (hasStringTagBug && className == '[object Object]' && isDataView(a)) { + if (!isDataView(b)) return false; + className = tagDataView; + } + switch (className) { + // These types are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); + case '[object ArrayBuffer]': + case tagDataView: + // Coerce to typed array so we can fall through. + return deepEq(toBufferView(a), toBufferView(b), aStack, bStack); + } + + var areArrays = className === '[object Array]'; + if (!areArrays && isTypedArray(a)) { + var byteLength = getByteLength(a); + if (byteLength !== getByteLength(b)) return false; + if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; + areArrays = true; + } + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor && + isFunction(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var _keys = keys(a), key; + length = _keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = _keys[length]; + if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; +} + +// Perform a deep comparison to check if two objects are equal. +export default function isEqual(a, b) { + return eq(a, b); +} diff --git a/src/node_modules/underscore/modules/isError.js b/src/node_modules/underscore/modules/isError.js new file mode 100644 index 0000000..178fa3e --- /dev/null +++ b/src/node_modules/underscore/modules/isError.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('Error'); diff --git a/src/node_modules/underscore/modules/isFinite.js b/src/node_modules/underscore/modules/isFinite.js new file mode 100644 index 0000000..fbeb79e --- /dev/null +++ b/src/node_modules/underscore/modules/isFinite.js @@ -0,0 +1,7 @@ +import { _isFinite } from './_setup.js'; +import isSymbol from './isSymbol.js'; + +// Is a given object a finite number? +export default function isFinite(obj) { + return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj)); +} diff --git a/src/node_modules/underscore/modules/isFunction.js b/src/node_modules/underscore/modules/isFunction.js new file mode 100644 index 0000000..35c41be --- /dev/null +++ b/src/node_modules/underscore/modules/isFunction.js @@ -0,0 +1,15 @@ +import tagTester from './_tagTester.js'; +import { root } from './_setup.js'; + +var isFunction = tagTester('Function'); + +// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old +// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). +var nodelist = root.document && root.document.childNodes; +if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + isFunction = function(obj) { + return typeof obj == 'function' || false; + }; +} + +export default isFunction; diff --git a/src/node_modules/underscore/modules/isMap.js b/src/node_modules/underscore/modules/isMap.js new file mode 100644 index 0000000..1e9f095 --- /dev/null +++ b/src/node_modules/underscore/modules/isMap.js @@ -0,0 +1,5 @@ +import tagTester from './_tagTester.js'; +import { isIE11 } from './_stringTagBug.js'; +import { ie11fingerprint, mapMethods } from './_methodFingerprint.js'; + +export default isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map'); diff --git a/src/node_modules/underscore/modules/isMatch.js b/src/node_modules/underscore/modules/isMatch.js new file mode 100644 index 0000000..81e43d9 --- /dev/null +++ b/src/node_modules/underscore/modules/isMatch.js @@ -0,0 +1,13 @@ +import keys from './keys.js'; + +// Returns whether an object has a given set of `key:value` pairs. +export default function isMatch(object, attrs) { + var _keys = keys(attrs), length = _keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = _keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; +} diff --git a/src/node_modules/underscore/modules/isNaN.js b/src/node_modules/underscore/modules/isNaN.js new file mode 100644 index 0000000..9fa7afe --- /dev/null +++ b/src/node_modules/underscore/modules/isNaN.js @@ -0,0 +1,7 @@ +import { _isNaN } from './_setup.js'; +import isNumber from './isNumber.js'; + +// Is the given value `NaN`? +export default function isNaN(obj) { + return isNumber(obj) && _isNaN(obj); +} diff --git a/src/node_modules/underscore/modules/isNull.js b/src/node_modules/underscore/modules/isNull.js new file mode 100644 index 0000000..e729c2e --- /dev/null +++ b/src/node_modules/underscore/modules/isNull.js @@ -0,0 +1,4 @@ +// Is a given value equal to null? +export default function isNull(obj) { + return obj === null; +} diff --git a/src/node_modules/underscore/modules/isNumber.js b/src/node_modules/underscore/modules/isNumber.js new file mode 100644 index 0000000..627d8d4 --- /dev/null +++ b/src/node_modules/underscore/modules/isNumber.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('Number'); diff --git a/src/node_modules/underscore/modules/isObject.js b/src/node_modules/underscore/modules/isObject.js new file mode 100644 index 0000000..db4675a --- /dev/null +++ b/src/node_modules/underscore/modules/isObject.js @@ -0,0 +1,5 @@ +// Is a given variable an object? +export default function isObject(obj) { + var type = typeof obj; + return type === 'function' || (type === 'object' && !!obj); +} diff --git a/src/node_modules/underscore/modules/isRegExp.js b/src/node_modules/underscore/modules/isRegExp.js new file mode 100644 index 0000000..ef64d1e --- /dev/null +++ b/src/node_modules/underscore/modules/isRegExp.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('RegExp'); diff --git a/src/node_modules/underscore/modules/isSet.js b/src/node_modules/underscore/modules/isSet.js new file mode 100644 index 0000000..0e8b6ca --- /dev/null +++ b/src/node_modules/underscore/modules/isSet.js @@ -0,0 +1,5 @@ +import tagTester from './_tagTester.js'; +import { isIE11 } from './_stringTagBug.js'; +import { ie11fingerprint, setMethods } from './_methodFingerprint.js'; + +export default isIE11 ? ie11fingerprint(setMethods) : tagTester('Set'); diff --git a/src/node_modules/underscore/modules/isString.js b/src/node_modules/underscore/modules/isString.js new file mode 100644 index 0000000..f02707d --- /dev/null +++ b/src/node_modules/underscore/modules/isString.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('String'); diff --git a/src/node_modules/underscore/modules/isSymbol.js b/src/node_modules/underscore/modules/isSymbol.js new file mode 100644 index 0000000..de4050d --- /dev/null +++ b/src/node_modules/underscore/modules/isSymbol.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('Symbol'); diff --git a/src/node_modules/underscore/modules/isTypedArray.js b/src/node_modules/underscore/modules/isTypedArray.js new file mode 100644 index 0000000..a65c917 --- /dev/null +++ b/src/node_modules/underscore/modules/isTypedArray.js @@ -0,0 +1,15 @@ +import { supportsArrayBuffer, nativeIsView, toString } from './_setup.js'; +import isDataView from './isDataView.js'; +import constant from './constant.js'; +import isBufferLike from './_isBufferLike.js'; + +// Is a given value a typed array? +var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; +function isTypedArray(obj) { + // `ArrayBuffer.isView` is the most future-proof, so use it when available. + // Otherwise, fall back on the above regular expression. + return nativeIsView ? (nativeIsView(obj) && !isDataView(obj)) : + isBufferLike(obj) && typedArrayPattern.test(toString.call(obj)); +} + +export default supportsArrayBuffer ? isTypedArray : constant(false); diff --git a/src/node_modules/underscore/modules/isUndefined.js b/src/node_modules/underscore/modules/isUndefined.js new file mode 100644 index 0000000..eddf88f --- /dev/null +++ b/src/node_modules/underscore/modules/isUndefined.js @@ -0,0 +1,4 @@ +// Is a given variable undefined? +export default function isUndefined(obj) { + return obj === void 0; +} diff --git a/src/node_modules/underscore/modules/isWeakMap.js b/src/node_modules/underscore/modules/isWeakMap.js new file mode 100644 index 0000000..729ca47 --- /dev/null +++ b/src/node_modules/underscore/modules/isWeakMap.js @@ -0,0 +1,5 @@ +import tagTester from './_tagTester.js'; +import { isIE11 } from './_stringTagBug.js'; +import { ie11fingerprint, weakMapMethods } from './_methodFingerprint.js'; + +export default isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap'); diff --git a/src/node_modules/underscore/modules/isWeakSet.js b/src/node_modules/underscore/modules/isWeakSet.js new file mode 100644 index 0000000..5331048 --- /dev/null +++ b/src/node_modules/underscore/modules/isWeakSet.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('WeakSet'); diff --git a/src/node_modules/underscore/modules/iteratee.js b/src/node_modules/underscore/modules/iteratee.js new file mode 100644 index 0000000..9057701 --- /dev/null +++ b/src/node_modules/underscore/modules/iteratee.js @@ -0,0 +1,10 @@ +import _ from './underscore.js'; +import baseIteratee from './_baseIteratee.js'; + +// External wrapper for our callback generator. Users may customize +// `_.iteratee` if they want additional predicate/iteratee shorthand styles. +// This abstraction hides the internal-only `argCount` argument. +export default function iteratee(value, context) { + return baseIteratee(value, context, Infinity); +} +_.iteratee = iteratee; diff --git a/src/node_modules/underscore/modules/keys.js b/src/node_modules/underscore/modules/keys.js new file mode 100644 index 0000000..f5b596c --- /dev/null +++ b/src/node_modules/underscore/modules/keys.js @@ -0,0 +1,16 @@ +import isObject from './isObject.js'; +import { nativeKeys, hasEnumBug } from './_setup.js'; +import has from './_has.js'; +import collectNonEnumProps from './_collectNonEnumProps.js'; + +// Retrieve the names of an object's own properties. +// Delegates to **ECMAScript 5**'s native `Object.keys`. +export default function keys(obj) { + if (!isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (has(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; +} diff --git a/src/node_modules/underscore/modules/last.js b/src/node_modules/underscore/modules/last.js new file mode 100644 index 0000000..3f30ebc --- /dev/null +++ b/src/node_modules/underscore/modules/last.js @@ -0,0 +1,9 @@ +import rest from './rest.js'; + +// Get the last element of an array. Passing **n** will return the last N +// values in the array. +export default function last(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return rest(array, Math.max(0, array.length - n)); +} diff --git a/src/node_modules/underscore/modules/lastIndexOf.js b/src/node_modules/underscore/modules/lastIndexOf.js new file mode 100644 index 0000000..bcacf49 --- /dev/null +++ b/src/node_modules/underscore/modules/lastIndexOf.js @@ -0,0 +1,6 @@ +import findLastIndex from './findLastIndex.js'; +import createIndexFinder from './_createIndexFinder.js'; + +// Return the position of the last occurrence of an item in an array, +// or -1 if the item is not included in the array. +export default createIndexFinder(-1, findLastIndex); diff --git a/src/node_modules/underscore/modules/map.js b/src/node_modules/underscore/modules/map.js new file mode 100644 index 0000000..a2e5121 --- /dev/null +++ b/src/node_modules/underscore/modules/map.js @@ -0,0 +1,16 @@ +import cb from './_cb.js'; +import isArrayLike from './_isArrayLike.js'; +import keys from './keys.js'; + +// Return the results of applying the iteratee to each element. +export default function map(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} diff --git a/src/node_modules/underscore/modules/mapObject.js b/src/node_modules/underscore/modules/mapObject.js new file mode 100644 index 0000000..2b44d28 --- /dev/null +++ b/src/node_modules/underscore/modules/mapObject.js @@ -0,0 +1,16 @@ +import cb from './_cb.js'; +import keys from './keys.js'; + +// Returns the results of applying the `iteratee` to each element of `obj`. +// In contrast to `_.map` it returns an object. +export default function mapObject(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = keys(obj), + length = _keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = _keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} diff --git a/src/node_modules/underscore/modules/matcher.js b/src/node_modules/underscore/modules/matcher.js new file mode 100644 index 0000000..245fa94 --- /dev/null +++ b/src/node_modules/underscore/modules/matcher.js @@ -0,0 +1,11 @@ +import extendOwn from './extendOwn.js'; +import isMatch from './isMatch.js'; + +// Returns a predicate for checking whether an object has a given set of +// `key:value` pairs. +export default function matcher(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; +} diff --git a/src/node_modules/underscore/modules/max.js b/src/node_modules/underscore/modules/max.js new file mode 100644 index 0000000..e325409 --- /dev/null +++ b/src/node_modules/underscore/modules/max.js @@ -0,0 +1,29 @@ +import isArrayLike from './_isArrayLike.js'; +import values from './values.js'; +import cb from './_cb.js'; +import each from './each.js'; + +// Return the maximum element (or element-based computation). +export default function max(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} diff --git a/src/node_modules/underscore/modules/memoize.js b/src/node_modules/underscore/modules/memoize.js new file mode 100644 index 0000000..50c55f5 --- /dev/null +++ b/src/node_modules/underscore/modules/memoize.js @@ -0,0 +1,13 @@ +import has from './_has.js'; + +// Memoize an expensive function by storing its results. +export default function memoize(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; +} diff --git a/src/node_modules/underscore/modules/min.js b/src/node_modules/underscore/modules/min.js new file mode 100644 index 0000000..c6b25fd --- /dev/null +++ b/src/node_modules/underscore/modules/min.js @@ -0,0 +1,29 @@ +import isArrayLike from './_isArrayLike.js'; +import values from './values.js'; +import cb from './_cb.js'; +import each from './each.js'; + +// Return the minimum element (or element-based computation). +export default function min(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || (computed === Infinity && result === Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} diff --git a/src/node_modules/underscore/modules/mixin.js b/src/node_modules/underscore/modules/mixin.js new file mode 100644 index 0000000..352a76a --- /dev/null +++ b/src/node_modules/underscore/modules/mixin.js @@ -0,0 +1,18 @@ +import _ from './underscore.js'; +import each from './each.js'; +import functions from './functions.js'; +import { push } from './_setup.js'; +import chainResult from './_chainResult.js'; + +// Add your own custom functions to the Underscore object. +export default function mixin(obj) { + each(functions(obj), function(name) { + var func = _[name] = obj[name]; + _.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return chainResult(this, func.apply(_, args)); + }; + }); + return _; +} diff --git a/src/node_modules/underscore/modules/negate.js b/src/node_modules/underscore/modules/negate.js new file mode 100644 index 0000000..172c7d6 --- /dev/null +++ b/src/node_modules/underscore/modules/negate.js @@ -0,0 +1,6 @@ +// Returns a negated version of the passed-in predicate. +export default function negate(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; +} diff --git a/src/node_modules/underscore/modules/noop.js b/src/node_modules/underscore/modules/noop.js new file mode 100644 index 0000000..9746add --- /dev/null +++ b/src/node_modules/underscore/modules/noop.js @@ -0,0 +1,2 @@ +// Predicate-generating function. Often useful outside of Underscore. +export default function noop(){} diff --git a/src/node_modules/underscore/modules/now.js b/src/node_modules/underscore/modules/now.js new file mode 100644 index 0000000..3ab6b3f --- /dev/null +++ b/src/node_modules/underscore/modules/now.js @@ -0,0 +1,4 @@ +// A (possibly faster) way to get the current timestamp as an integer. +export default Date.now || function() { + return new Date().getTime(); +}; diff --git a/src/node_modules/underscore/modules/object.js b/src/node_modules/underscore/modules/object.js new file mode 100644 index 0000000..d983f8f --- /dev/null +++ b/src/node_modules/underscore/modules/object.js @@ -0,0 +1,16 @@ +import getLength from './_getLength.js'; + +// Converts lists into objects. Pass either a single array of `[key, value]` +// pairs, or two parallel arrays of the same length -- one of keys, and one of +// the corresponding values. Passing by pairs is the reverse of `_.pairs`. +export default function object(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; +} diff --git a/src/node_modules/underscore/modules/omit.js b/src/node_modules/underscore/modules/omit.js new file mode 100644 index 0000000..f7233cf --- /dev/null +++ b/src/node_modules/underscore/modules/omit.js @@ -0,0 +1,22 @@ +import restArguments from './restArguments.js'; +import isFunction from './isFunction.js'; +import negate from './negate.js'; +import map from './map.js'; +import flatten from './_flatten.js'; +import contains from './contains.js'; +import pick from './pick.js'; + +// Return a copy of the object without the disallowed properties. +export default restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (isFunction(iteratee)) { + iteratee = negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = map(flatten(keys, false, false), String); + iteratee = function(value, key) { + return !contains(keys, key); + }; + } + return pick(obj, iteratee, context); +}); diff --git a/src/node_modules/underscore/modules/once.js b/src/node_modules/underscore/modules/once.js new file mode 100644 index 0000000..e7e41ac --- /dev/null +++ b/src/node_modules/underscore/modules/once.js @@ -0,0 +1,6 @@ +import partial from './partial.js'; +import before from './before.js'; + +// Returns a function that will be executed at most one time, no matter how +// often you call it. Useful for lazy initialization. +export default partial(before, 2); diff --git a/src/node_modules/underscore/modules/package.json b/src/node_modules/underscore/modules/package.json new file mode 100644 index 0000000..448daad --- /dev/null +++ b/src/node_modules/underscore/modules/package.json @@ -0,0 +1 @@ +{"type":"module","version":"1.13.4"} diff --git a/src/node_modules/underscore/modules/pairs.js b/src/node_modules/underscore/modules/pairs.js new file mode 100644 index 0000000..0e4af7b --- /dev/null +++ b/src/node_modules/underscore/modules/pairs.js @@ -0,0 +1,13 @@ +import keys from './keys.js'; + +// Convert an object into a list of `[key, value]` pairs. +// The opposite of `_.object` with one argument. +export default function pairs(obj) { + var _keys = keys(obj); + var length = _keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [_keys[i], obj[_keys[i]]]; + } + return pairs; +} diff --git a/src/node_modules/underscore/modules/partial.js b/src/node_modules/underscore/modules/partial.js new file mode 100644 index 0000000..4a4a468 --- /dev/null +++ b/src/node_modules/underscore/modules/partial.js @@ -0,0 +1,24 @@ +import restArguments from './restArguments.js'; +import executeBound from './_executeBound.js'; +import _ from './underscore.js'; + +// Partially apply a function by creating a version that has had some of its +// arguments pre-filled, without changing its dynamic `this` context. `_` acts +// as a placeholder by default, allowing any combination of arguments to be +// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. +var partial = restArguments(function(func, boundArgs) { + var placeholder = partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; +}); + +partial.placeholder = _; +export default partial; diff --git a/src/node_modules/underscore/modules/partition.js b/src/node_modules/underscore/modules/partition.js new file mode 100644 index 0000000..bf63c0d --- /dev/null +++ b/src/node_modules/underscore/modules/partition.js @@ -0,0 +1,7 @@ +import group from './_group.js'; + +// Split a collection into two arrays: one whose elements all pass the given +// truth test, and one whose elements all do not pass the truth test. +export default group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); +}, true); diff --git a/src/node_modules/underscore/modules/pick.js b/src/node_modules/underscore/modules/pick.js new file mode 100644 index 0000000..29858a0 --- /dev/null +++ b/src/node_modules/underscore/modules/pick.js @@ -0,0 +1,26 @@ +import restArguments from './restArguments.js'; +import isFunction from './isFunction.js'; +import optimizeCb from './_optimizeCb.js'; +import allKeys from './allKeys.js'; +import keyInObj from './_keyInObj.js'; +import flatten from './_flatten.js'; + +// Return a copy of the object only containing the allowed properties. +export default restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (isFunction(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); + keys = allKeys(obj); + } else { + iteratee = keyInObj; + keys = flatten(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; +}); diff --git a/src/node_modules/underscore/modules/pluck.js b/src/node_modules/underscore/modules/pluck.js new file mode 100644 index 0000000..45a3533 --- /dev/null +++ b/src/node_modules/underscore/modules/pluck.js @@ -0,0 +1,7 @@ +import map from './map.js'; +import property from './property.js'; + +// Convenience version of a common use case of `_.map`: fetching a property. +export default function pluck(obj, key) { + return map(obj, property(key)); +} diff --git a/src/node_modules/underscore/modules/property.js b/src/node_modules/underscore/modules/property.js new file mode 100644 index 0000000..4853866 --- /dev/null +++ b/src/node_modules/underscore/modules/property.js @@ -0,0 +1,11 @@ +import deepGet from './_deepGet.js'; +import toPath from './_toPath.js'; + +// Creates a function that, when passed an object, will traverse that object’s +// properties down the given `path`, specified as an array of keys or indices. +export default function property(path) { + path = toPath(path); + return function(obj) { + return deepGet(obj, path); + }; +} diff --git a/src/node_modules/underscore/modules/propertyOf.js b/src/node_modules/underscore/modules/propertyOf.js new file mode 100644 index 0000000..0bf36f8 --- /dev/null +++ b/src/node_modules/underscore/modules/propertyOf.js @@ -0,0 +1,10 @@ +import noop from './noop.js'; +import get from './get.js'; + +// Generates a function for a given object that returns a given property. +export default function propertyOf(obj) { + if (obj == null) return noop; + return function(path) { + return get(obj, path); + }; +} diff --git a/src/node_modules/underscore/modules/random.js b/src/node_modules/underscore/modules/random.js new file mode 100644 index 0000000..d861b60 --- /dev/null +++ b/src/node_modules/underscore/modules/random.js @@ -0,0 +1,8 @@ +// Return a random integer between `min` and `max` (inclusive). +export default function random(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); +} diff --git a/src/node_modules/underscore/modules/range.js b/src/node_modules/underscore/modules/range.js new file mode 100644 index 0000000..9c7c6b8 --- /dev/null +++ b/src/node_modules/underscore/modules/range.js @@ -0,0 +1,21 @@ +// Generate an integer Array containing an arithmetic progression. A port of +// the native Python `range()` function. See +// [the Python documentation](https://docs.python.org/library/functions.html#range). +export default function range(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; +} diff --git a/src/node_modules/underscore/modules/reduce.js b/src/node_modules/underscore/modules/reduce.js new file mode 100644 index 0000000..951eaa3 --- /dev/null +++ b/src/node_modules/underscore/modules/reduce.js @@ -0,0 +1,5 @@ +import createReduce from './_createReduce.js'; + +// **Reduce** builds up a single result from a list of values, aka `inject`, +// or `foldl`. +export default createReduce(1); diff --git a/src/node_modules/underscore/modules/reduceRight.js b/src/node_modules/underscore/modules/reduceRight.js new file mode 100644 index 0000000..2e8e23a --- /dev/null +++ b/src/node_modules/underscore/modules/reduceRight.js @@ -0,0 +1,4 @@ +import createReduce from './_createReduce.js'; + +// The right-associative version of reduce, also known as `foldr`. +export default createReduce(-1); diff --git a/src/node_modules/underscore/modules/reject.js b/src/node_modules/underscore/modules/reject.js new file mode 100644 index 0000000..ba4c841 --- /dev/null +++ b/src/node_modules/underscore/modules/reject.js @@ -0,0 +1,8 @@ +import filter from './filter.js'; +import negate from './negate.js'; +import cb from './_cb.js'; + +// Return all the elements for which a truth test fails. +export default function reject(obj, predicate, context) { + return filter(obj, negate(cb(predicate)), context); +} diff --git a/src/node_modules/underscore/modules/rest.js b/src/node_modules/underscore/modules/rest.js new file mode 100644 index 0000000..776b555 --- /dev/null +++ b/src/node_modules/underscore/modules/rest.js @@ -0,0 +1,8 @@ +import { slice } from './_setup.js'; + +// Returns everything but the first entry of the `array`. Especially useful on +// the `arguments` object. Passing an **n** will return the rest N values in the +// `array`. +export default function rest(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); +} diff --git a/src/node_modules/underscore/modules/restArguments.js b/src/node_modules/underscore/modules/restArguments.js new file mode 100644 index 0000000..d12057e --- /dev/null +++ b/src/node_modules/underscore/modules/restArguments.js @@ -0,0 +1,27 @@ +// Some functions take a variable number of arguments, or a few expected +// arguments at the beginning and then a variable number of values to operate +// on. This helper accumulates all remaining arguments past the function’s +// argument length (or an explicit `startIndex`), into an array that becomes +// the last argument. Similar to ES6’s "rest parameter". +export default function restArguments(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; +} diff --git a/src/node_modules/underscore/modules/result.js b/src/node_modules/underscore/modules/result.js new file mode 100644 index 0000000..30c4e20 --- /dev/null +++ b/src/node_modules/underscore/modules/result.js @@ -0,0 +1,22 @@ +import isFunction from './isFunction.js'; +import toPath from './_toPath.js'; + +// Traverses the children of `obj` along `path`. If a child is a function, it +// is invoked with its parent as context. Returns the value of the final +// child, or `fallback` if any child is undefined. +export default function result(obj, path, fallback) { + path = toPath(path); + var length = path.length; + if (!length) { + return isFunction(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = isFunction(prop) ? prop.call(obj) : prop; + } + return obj; +} diff --git a/src/node_modules/underscore/modules/sample.js b/src/node_modules/underscore/modules/sample.js new file mode 100644 index 0000000..db12e28 --- /dev/null +++ b/src/node_modules/underscore/modules/sample.js @@ -0,0 +1,27 @@ +import isArrayLike from './_isArrayLike.js'; +import values from './values.js'; +import getLength from './_getLength.js'; +import random from './random.js'; +import toArray from './toArray.js'; + +// Sample **n** random values from a collection using the modern version of the +// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). +// If **n** is not specified, returns a single random element. +// The internal `guard` argument allows it to work with `_.map`. +export default function sample(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = values(obj); + return obj[random(obj.length - 1)]; + } + var sample = toArray(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); +} diff --git a/src/node_modules/underscore/modules/shuffle.js b/src/node_modules/underscore/modules/shuffle.js new file mode 100644 index 0000000..907b87a --- /dev/null +++ b/src/node_modules/underscore/modules/shuffle.js @@ -0,0 +1,6 @@ +import sample from './sample.js'; + +// Shuffle a collection. +export default function shuffle(obj) { + return sample(obj, Infinity); +} diff --git a/src/node_modules/underscore/modules/size.js b/src/node_modules/underscore/modules/size.js new file mode 100644 index 0000000..4ce3714 --- /dev/null +++ b/src/node_modules/underscore/modules/size.js @@ -0,0 +1,8 @@ +import isArrayLike from './_isArrayLike.js'; +import keys from './keys.js'; + +// Return the number of elements in a collection. +export default function size(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : keys(obj).length; +} diff --git a/src/node_modules/underscore/modules/some.js b/src/node_modules/underscore/modules/some.js new file mode 100644 index 0000000..ac09c07 --- /dev/null +++ b/src/node_modules/underscore/modules/some.js @@ -0,0 +1,15 @@ +import cb from './_cb.js'; +import isArrayLike from './_isArrayLike.js'; +import keys from './keys.js'; + +// Determine if at least one element in the object passes a truth test. +export default function some(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; +} diff --git a/src/node_modules/underscore/modules/sortBy.js b/src/node_modules/underscore/modules/sortBy.js new file mode 100644 index 0000000..bca494b --- /dev/null +++ b/src/node_modules/underscore/modules/sortBy.js @@ -0,0 +1,24 @@ +import cb from './_cb.js'; +import pluck from './pluck.js'; +import map from './map.js'; + +// Sort the object's values by a criterion produced by an iteratee. +export default function sortBy(obj, iteratee, context) { + var index = 0; + iteratee = cb(iteratee, context); + return pluck(map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); +} diff --git a/src/node_modules/underscore/modules/sortedIndex.js b/src/node_modules/underscore/modules/sortedIndex.js new file mode 100644 index 0000000..09ead4a --- /dev/null +++ b/src/node_modules/underscore/modules/sortedIndex.js @@ -0,0 +1,15 @@ +import cb from './_cb.js'; +import getLength from './_getLength.js'; + +// Use a comparator function to figure out the smallest index at which +// an object should be inserted so as to maintain order. Uses binary search. +export default function sortedIndex(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; +} diff --git a/src/node_modules/underscore/modules/tap.js b/src/node_modules/underscore/modules/tap.js new file mode 100644 index 0000000..4753791 --- /dev/null +++ b/src/node_modules/underscore/modules/tap.js @@ -0,0 +1,7 @@ +// Invokes `interceptor` with the `obj` and then returns `obj`. +// The primary purpose of this method is to "tap into" a method chain, in +// order to perform operations on intermediate results within the chain. +export default function tap(obj, interceptor) { + interceptor(obj); + return obj; +} diff --git a/src/node_modules/underscore/modules/template.js b/src/node_modules/underscore/modules/template.js new file mode 100644 index 0000000..6979183 --- /dev/null +++ b/src/node_modules/underscore/modules/template.js @@ -0,0 +1,101 @@ +import defaults from './defaults.js'; +import _ from './underscore.js'; +import './templateSettings.js'; + +// When customizing `_.templateSettings`, if you don't want to define an +// interpolation, evaluation or escaping regex, we need one that is +// guaranteed not to match. +var noMatch = /(.)^/; + +// Certain characters need to be escaped so that they can be put into a +// string literal. +var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' +}; + +var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + +function escapeChar(match) { + return '\\' + escapes[match]; +} + +// In order to prevent third-party code injection through +// `_.templateSettings.variable`, we test it against the following regular +// expression. It is intentionally a bit more liberal than just matching valid +// identifiers, but still prevents possible loopholes through defaults or +// destructuring assignment. +var bareIdentifier = /^\s*(\w|\$)+\s*$/; + +// JavaScript micro-templating, similar to John Resig's implementation. +// Underscore templating handles arbitrary delimiters, preserves whitespace, +// and correctly escapes quotes within interpolated code. +// NB: `oldSettings` only exists for backwards compatibility. +export default function template(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = defaults({}, settings, _.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(argument, '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _); + }; + + // Provide the compiled source as a convenience for precompilation. + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; +} diff --git a/src/node_modules/underscore/modules/templateSettings.js b/src/node_modules/underscore/modules/templateSettings.js new file mode 100644 index 0000000..4a02f76 --- /dev/null +++ b/src/node_modules/underscore/modules/templateSettings.js @@ -0,0 +1,9 @@ +import _ from './underscore.js'; + +// By default, Underscore uses ERB-style template delimiters. Change the +// following template settings to use alternative delimiters. +export default _.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g +}; diff --git a/src/node_modules/underscore/modules/throttle.js b/src/node_modules/underscore/modules/throttle.js new file mode 100644 index 0000000..7ab9740 --- /dev/null +++ b/src/node_modules/underscore/modules/throttle.js @@ -0,0 +1,47 @@ +import now from './now.js'; + +// Returns a function, that, when invoked, will only be triggered at most once +// during a given window of time. Normally, the throttled function will run +// as much as it can, without ever going more than once per `wait` duration; +// but if you'd like to disable the execution on the leading edge, pass +// `{leading: false}`. To disable execution on the trailing edge, ditto. +export default function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var _now = now(); + if (!previous && options.leading === false) previous = _now; + var remaining = wait - (_now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = _now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; +} diff --git a/src/node_modules/underscore/modules/times.js b/src/node_modules/underscore/modules/times.js new file mode 100644 index 0000000..ab1960d --- /dev/null +++ b/src/node_modules/underscore/modules/times.js @@ -0,0 +1,9 @@ +import optimizeCb from './_optimizeCb.js'; + +// Run a function **n** times. +export default function times(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; +} diff --git a/src/node_modules/underscore/modules/toArray.js b/src/node_modules/underscore/modules/toArray.js new file mode 100644 index 0000000..00730e6 --- /dev/null +++ b/src/node_modules/underscore/modules/toArray.js @@ -0,0 +1,20 @@ +import isArray from './isArray.js'; +import { slice } from './_setup.js'; +import isString from './isString.js'; +import isArrayLike from './_isArrayLike.js'; +import map from './map.js'; +import identity from './identity.js'; +import values from './values.js'; + +// Safely create a real, live array from anything iterable. +var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; +export default function toArray(obj) { + if (!obj) return []; + if (isArray(obj)) return slice.call(obj); + if (isString(obj)) { + // Keep surrogate pair characters together. + return obj.match(reStrSymbol); + } + if (isArrayLike(obj)) return map(obj, identity); + return values(obj); +} diff --git a/src/node_modules/underscore/modules/toPath.js b/src/node_modules/underscore/modules/toPath.js new file mode 100644 index 0000000..7d72d1f --- /dev/null +++ b/src/node_modules/underscore/modules/toPath.js @@ -0,0 +1,9 @@ +import _ from './underscore.js'; +import isArray from './isArray.js'; + +// Normalize a (deep) property `path` to array. +// Like `_.iteratee`, this function can be customized. +export default function toPath(path) { + return isArray(path) ? path : [path]; +} +_.toPath = toPath; diff --git a/src/node_modules/underscore/modules/underscore-array-methods.js b/src/node_modules/underscore/modules/underscore-array-methods.js new file mode 100644 index 0000000..ca7c382 --- /dev/null +++ b/src/node_modules/underscore/modules/underscore-array-methods.js @@ -0,0 +1,31 @@ +import _ from './underscore.js'; +import each from './each.js'; +import { ArrayProto } from './_setup.js'; +import chainResult from './_chainResult.js'; + +// Add all mutator `Array` functions to the wrapper. +each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) { + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) { + delete obj[0]; + } + } + return chainResult(this, obj); + }; +}); + +// Add all accessor `Array` functions to the wrapper. +each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) obj = method.apply(obj, arguments); + return chainResult(this, obj); + }; +}); + +export default _; diff --git a/src/node_modules/underscore/modules/underscore.js b/src/node_modules/underscore/modules/underscore.js new file mode 100644 index 0000000..6029e2a --- /dev/null +++ b/src/node_modules/underscore/modules/underscore.js @@ -0,0 +1,25 @@ +import { VERSION } from './_setup.js'; + +// If Underscore is called as a function, it returns a wrapped object that can +// be used OO-style. This wrapper holds altered versions of all functions added +// through `_.mixin`. Wrapped objects may be chained. +export default function _(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; +} + +_.VERSION = VERSION; + +// Extracts the result from a wrapped and chained object. +_.prototype.value = function() { + return this._wrapped; +}; + +// Provide unwrapping proxies for some methods used in engine operations +// such as arithmetic and JSON stringification. +_.prototype.valueOf = _.prototype.toJSON = _.prototype.value; + +_.prototype.toString = function() { + return String(this._wrapped); +}; diff --git a/src/node_modules/underscore/modules/unescape.js b/src/node_modules/underscore/modules/unescape.js new file mode 100644 index 0000000..4edefcc --- /dev/null +++ b/src/node_modules/underscore/modules/unescape.js @@ -0,0 +1,5 @@ +import createEscaper from './_createEscaper.js'; +import unescapeMap from './_unescapeMap.js'; + +// Function for unescaping strings from HTML interpolation. +export default createEscaper(unescapeMap); diff --git a/src/node_modules/underscore/modules/union.js b/src/node_modules/underscore/modules/union.js new file mode 100644 index 0000000..aa108be --- /dev/null +++ b/src/node_modules/underscore/modules/union.js @@ -0,0 +1,9 @@ +import restArguments from './restArguments.js'; +import uniq from './uniq.js'; +import flatten from './_flatten.js'; + +// Produce an array that contains the union: each distinct element from all of +// the passed-in arrays. +export default restArguments(function(arrays) { + return uniq(flatten(arrays, true, true)); +}); diff --git a/src/node_modules/underscore/modules/uniq.js b/src/node_modules/underscore/modules/uniq.js new file mode 100644 index 0000000..ee4c8a3 --- /dev/null +++ b/src/node_modules/underscore/modules/uniq.js @@ -0,0 +1,36 @@ +import isBoolean from './isBoolean.js'; +import cb from './_cb.js'; +import getLength from './_getLength.js'; +import contains from './contains.js'; + +// Produce a duplicate-free version of the array. If the array has already +// been sorted, you have the option of using a faster algorithm. +// The faster algorithm will not work with an iteratee if the iteratee +// is not a one-to-one function, so providing an iteratee will disable +// the faster algorithm. +export default function uniq(array, isSorted, iteratee, context) { + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!contains(result, value)) { + result.push(value); + } + } + return result; +} diff --git a/src/node_modules/underscore/modules/uniqueId.js b/src/node_modules/underscore/modules/uniqueId.js new file mode 100644 index 0000000..20f321a --- /dev/null +++ b/src/node_modules/underscore/modules/uniqueId.js @@ -0,0 +1,7 @@ +// Generate a unique integer id (unique within the entire client session). +// Useful for temporary DOM ids. +var idCounter = 0; +export default function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; +} diff --git a/src/node_modules/underscore/modules/unzip.js b/src/node_modules/underscore/modules/unzip.js new file mode 100644 index 0000000..15a3cf1 --- /dev/null +++ b/src/node_modules/underscore/modules/unzip.js @@ -0,0 +1,15 @@ +import max from './max.js'; +import getLength from './_getLength.js'; +import pluck from './pluck.js'; + +// Complement of zip. Unzip accepts an array of arrays and groups +// each array's elements on shared indices. +export default function unzip(array) { + var length = (array && max(array, getLength).length) || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = pluck(array, index); + } + return result; +} diff --git a/src/node_modules/underscore/modules/values.js b/src/node_modules/underscore/modules/values.js new file mode 100644 index 0000000..9591de3 --- /dev/null +++ b/src/node_modules/underscore/modules/values.js @@ -0,0 +1,12 @@ +import keys from './keys.js'; + +// Retrieve the values of an object's properties. +export default function values(obj) { + var _keys = keys(obj); + var length = _keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[_keys[i]]; + } + return values; +} diff --git a/src/node_modules/underscore/modules/where.js b/src/node_modules/underscore/modules/where.js new file mode 100644 index 0000000..645f8cb --- /dev/null +++ b/src/node_modules/underscore/modules/where.js @@ -0,0 +1,8 @@ +import filter from './filter.js'; +import matcher from './matcher.js'; + +// Convenience version of a common use case of `_.filter`: selecting only +// objects containing specific `key:value` pairs. +export default function where(obj, attrs) { + return filter(obj, matcher(attrs)); +} diff --git a/src/node_modules/underscore/modules/without.js b/src/node_modules/underscore/modules/without.js new file mode 100644 index 0000000..7790e0f --- /dev/null +++ b/src/node_modules/underscore/modules/without.js @@ -0,0 +1,7 @@ +import restArguments from './restArguments.js'; +import difference from './difference.js'; + +// Return a version of the array that does not contain the specified value(s). +export default restArguments(function(array, otherArrays) { + return difference(array, otherArrays); +}); diff --git a/src/node_modules/underscore/modules/wrap.js b/src/node_modules/underscore/modules/wrap.js new file mode 100644 index 0000000..b2b3fd4 --- /dev/null +++ b/src/node_modules/underscore/modules/wrap.js @@ -0,0 +1,8 @@ +import partial from './partial.js'; + +// Returns the first function passed as an argument to the second, +// allowing you to adjust arguments, run code before and after, and +// conditionally execute the original function. +export default function wrap(func, wrapper) { + return partial(wrapper, func); +} diff --git a/src/node_modules/underscore/modules/zip.js b/src/node_modules/underscore/modules/zip.js new file mode 100644 index 0000000..ae43cb3 --- /dev/null +++ b/src/node_modules/underscore/modules/zip.js @@ -0,0 +1,6 @@ +import restArguments from './restArguments.js'; +import unzip from './unzip.js'; + +// Zip together multiple lists into a single array -- elements that share +// an index go together. +export default restArguments(unzip); diff --git a/src/node_modules/underscore/package.json b/src/node_modules/underscore/package.json new file mode 100644 index 0000000..8561567 --- /dev/null +++ b/src/node_modules/underscore/package.json @@ -0,0 +1,122 @@ +{ + "name": "underscore", + "description": "JavaScript's functional programming helper library.", + "version": "1.13.4", + "author": "Jeremy Ashkenas ", + "license": "MIT", + "homepage": "https://underscorejs.org", + "repository": { + "type": "git", + "url": "git://github.com/jashkenas/underscore.git" + }, + "keywords": [ + "util", + "functional", + "server", + "client", + "browser" + ], + "main": "underscore-umd.js", + "module": "modules/index-all.js", + "type": "commonjs", + "exports": { + ".": { + "import": { + "module": "./modules/index-all.js", + "browser": { + "production": "./underscore-esm-min.js", + "default": "./underscore-esm.js" + }, + "node": "./underscore-node.mjs", + "default": "./underscore-esm.js" + }, + "require": { + "browser": { + "production": "./underscore-umd-min.js", + "default": "./underscore-umd.js" + }, + "node": "./underscore-node.cjs", + "default": "./underscore-umd.js" + }, + "default": "./underscore-umd.js" + }, + "./underscore*": "./underscore*", + "./modules/*": { + "require": "./cjs/*", + "default": "./modules/*" + }, + "./amd/*": "./amd/*", + "./cjs/*": "./cjs/*", + "./package.json": "./package.json" + }, + "devDependencies": { + "coveralls": "^2.11.2", + "cpy-cli": "^3.1.1", + "docco": "^0.8.0", + "eslint": "^6.8.0", + "eslint-plugin-import": "^2.20.1", + "glob": "^7.1.6", + "gzip-size-cli": "^1.0.0", + "husky": "^4.2.3", + "karma": "^0.13.13", + "karma-qunit": "~2.0.1", + "karma-sauce-launcher": "^1.2.0", + "nyc": "^2.1.3", + "pretty-bytes-cli": "^1.0.0", + "qunit": "2.10.1", + "rollup": "^2.40.0", + "terser": "^4.6.13" + }, + "overrides": { + "colors@>1.4.0": "1.4.0" + }, + "scripts": { + "test": "npm run lint && npm run test-node", + "coverage": "nyc npm run test-node && nyc report", + "coveralls": "nyc npm run test-node && nyc report --reporter=text-lcov | coveralls", + "lint": "eslint modules/*.js test/*.js", + "test-node": "npm run prepare-tests && qunit test/", + "test-browser": "npm run prepare-tests && npm i karma-phantomjs-launcher && karma start", + "bundle": "rollup -c && eslint underscore-umd.js && rollup -c rollup.config2.js", + "bundle-treeshake": "cd test-treeshake && rollup --config", + "prepare-tests": "npm run bundle && npm run bundle-treeshake", + "minify-umd": "terser underscore-umd.js -c \"evaluate=false\" --comments \"/ .*/\" -m", + "minify-esm": "terser underscore-esm.js -c \"evaluate=false\" --comments \"/ .*/\" -m", + "module-package-json": "node -e 'console.log(`{\"type\":\"module\",\"version\":\"${process.env.npm_package_version}\"}`)' > modules/package.json", + "build-umd": "npm run minify-umd -- --source-map content=underscore-umd.js.map --source-map-url \" \" -o underscore-umd-min.js", + "build-esm": "npm run module-package-json && npm run minify-esm -- --source-map content=underscore-esm.js.map --source-map-url \" \" -o underscore-esm-min.js", + "alias-bundle": "cpy --rename=underscore.js underscore-umd.js . && cpy --rename=underscore-min.js underscore-umd-min.js . && cpy --rename=underscore-min.js.map underscore-umd-min.js.map .", + "build": "npm run bundle && npm run build-umd && npm run build-esm && npm run alias-bundle", + "doc": "docco underscore-esm.js && docco modules/*.js -c docco.css -t docs/linked-esm.jst", + "weight": "npm run bundle && npm run minify-umd | gzip-size | pretty-bytes", + "prepublishOnly": "npm run build && npm run doc" + }, + "files": [ + "underscore-esm.js", + "underscore-esm.js.map", + "underscore-esm-min.js", + "underscore-esm-min.js.map", + "underscore-umd.js", + "underscore-umd.js.map", + "underscore-umd-min.js", + "underscore-umd-min.js.map", + "underscore.js", + "underscore-min.js", + "underscore-min.js.map", + "underscore-node-f.cjs", + "underscore-node-f.cjs.map", + "underscore-node.cjs", + "underscore-node.cjs.map", + "underscore-node.mjs", + "underscore-node.mjs.map", + "modules/", + "amd/", + "cjs/" + ], + "husky": { + "hooks": { + "pre-commit": "npm run bundle && git add underscore-umd.js underscore-umd.js.map underscore-esm.js underscore-esm.js.map underscore-node-f.cjs underscore-node-f.cjs.map underscore-node.cjs underscore-node.cjs.map underscore-node.mjs underscore-node.mjs.map", + "post-commit": "git reset underscore-umd.js underscore-umd.js.map underscore-esm.js underscore-esm.js.map underscore-node-f.cjs underscore-node-f.cjs.map underscore-node.cjs underscore-node.cjs.map underscore-node.mjs underscore-node.mjs.map" + } + } +} diff --git a/src/node_modules/underscore/underscore-esm-min.js b/src/node_modules/underscore/underscore-esm-min.js new file mode 100644 index 0000000..1e1ebb9 --- /dev/null +++ b/src/node_modules/underscore/underscore-esm-min.js @@ -0,0 +1,5 @@ +// Underscore.js 1.13.4 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. +var VERSION="1.13.4",root="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},ArrayProto=Array.prototype,ObjProto=Object.prototype,SymbolProto="undefined"!=typeof Symbol?Symbol.prototype:null,push=ArrayProto.push,slice=ArrayProto.slice,toString=ObjProto.toString,hasOwnProperty=ObjProto.hasOwnProperty,supportsArrayBuffer="undefined"!=typeof ArrayBuffer,supportsDataView="undefined"!=typeof DataView,nativeIsArray=Array.isArray,nativeKeys=Object.keys,nativeCreate=Object.create,nativeIsView=supportsArrayBuffer&&ArrayBuffer.isView,_isNaN=isNaN,_isFinite=isFinite,hasEnumBug=!{toString:null}.propertyIsEnumerable("toString"),nonEnumerableProps=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],MAX_ARRAY_INDEX=Math.pow(2,53)-1;function restArguments(e,t){return t=null==t?e.length-1:+t,function(){for(var n=Math.max(arguments.length-t,0),r=Array(n),i=0;i=0&&n<=MAX_ARRAY_INDEX}}function shallowProperty(e){return function(t){return null==t?void 0:t[e]}}var getByteLength=shallowProperty("byteLength"),isBufferLike=createSizePropertyCheck(getByteLength),typedArrayPattern=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;function isTypedArray(e){return nativeIsView?nativeIsView(e)&&!isDataView$1(e):isBufferLike(e)&&typedArrayPattern.test(toString.call(e))}var isTypedArray$1=supportsArrayBuffer?isTypedArray:constant(!1),getLength=shallowProperty("length");function emulatedSet(e){for(var t={},n=e.length,r=0;r":">",'"':""","'":"'","`":"`"},_escape=createEscaper(escapeMap),unescapeMap=invert(escapeMap),_unescape=createEscaper(unescapeMap),templateSettings=_$1.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},noMatch=/(.)^/,escapes={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},escapeRegExp=/\\|'|\r|\n|\u2028|\u2029/g;function escapeChar(e){return"\\"+escapes[e]}var bareIdentifier=/^\s*(\w|\$)+\s*$/;function template(e,t,n){!t&&n&&(t=n),t=defaults({},t,_$1.templateSettings);var r=RegExp([(t.escape||noMatch).source,(t.interpolate||noMatch).source,(t.evaluate||noMatch).source].join("|")+"|$","g"),i=0,a="__p+='";e.replace(r,(function(t,n,r,u,o){return a+=e.slice(i,o).replace(escapeRegExp,escapeChar),i=o+t.length,n?a+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'":r?a+="'+\n((__t=("+r+"))==null?'':__t)+\n'":u&&(a+="';\n"+u+"\n__p+='"),t})),a+="';\n";var u,o=t.variable;if(o){if(!bareIdentifier.test(o))throw new Error("variable is not a bare identifier: "+o)}else a="with(obj||{}){\n"+a+"}\n",o="obj";a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{u=new Function(o,"_",a)}catch(e){throw e.source=a,e}var s=function(e){return u.call(this,e,_$1)};return s.source="function("+o+"){\n"+a+"}",s}function result(e,t,n){var r=(t=toPath(t)).length;if(!r)return isFunction$1(n)?n.call(e):n;for(var i=0;i1)flatten$1(o,t-1,n,r),i=r.length;else for(var s=0,c=o.length;st?(r&&(clearTimeout(r),r=null),o=c,u=e.apply(i,a),r||(i=a=null)):r||!1===n.trailing||(r=setTimeout(s,f)),u};return c.cancel=function(){clearTimeout(r),o=0,r=i=a=null},c}function debounce(e,t,n){var r,i,a,u,o,s=function(){var c=now()-i;t>c?r=setTimeout(s,t-c):(r=null,n||(u=e.apply(o,a)),r||(a=o=null))},c=restArguments((function(c){return o=this,a=c,i=now(),r||(r=setTimeout(s,t),n&&(u=e.apply(o,a))),u}));return c.cancel=function(){clearTimeout(r),r=a=o=null},c}function wrap(e,t){return partial(t,e)}function negate(e){return function(){return!e.apply(this,arguments)}}function compose(){var e=arguments,t=e.length-1;return function(){for(var n=t,r=e[t].apply(this,arguments);n--;)r=e[n].call(this,r);return r}}function after(e,t){return function(){if(--e<1)return t.apply(this,arguments)}}function before(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}}var once=partial(before,2);function findKey(e,t,n){t=cb(t,n);for(var r,i=keys(e),a=0,u=i.length;a0?0:i-1;a>=0&&a0?u=a>=0?a:Math.max(a+o,u):o=a>=0?Math.min(a+1,o):a+o+1;else if(n&&a&&o)return r[a=n(r,i)]===i?a:-1;if(i!=i)return(a=t(slice.call(r,u,o),isNaN$1))>=0?a+u:-1;for(a=e>0?u:o-1;a>=0&&a0?0:u-1;for(i||(r=t[a?a[o]:o],o+=e);o>=0&&o=3;return t(e,optimizeCb(n,i,4),r,a)}}var reduce=createReduce(1),reduceRight=createReduce(-1);function filter(e,t,n){var r=[];return t=cb(t,n),each(e,(function(e,n,i){t(e,n,i)&&r.push(e)})),r}function reject(e,t,n){return filter(e,negate(cb(t)),n)}function every(e,t,n){t=cb(t,n);for(var r=!isArrayLike(e)&&keys(e),i=(r||e).length,a=0;a=0}var invoke=restArguments((function(e,t,n){var r,i;return isFunction$1(t)?i=t:(t=toPath(t),r=t.slice(0,-1),t=t[t.length-1]),map(e,(function(e){var a=i;if(!a){if(r&&r.length&&(e=deepGet(e,r)),null==e)return;a=e[t]}return null==a?a:a.apply(e,n)}))}));function pluck(e,t){return map(e,property(t))}function where(e,t){return filter(e,matcher(t))}function max(e,t,n){var r,i,a=-1/0,u=-1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var o=0,s=(e=isArrayLike(e)?e:values(e)).length;oa&&(a=r);else t=cb(t,n),each(e,(function(e,n,r){((i=t(e,n,r))>u||i===-1/0&&a===-1/0)&&(a=e,u=i)}));return a}function min(e,t,n){var r,i,a=1/0,u=1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var o=0,s=(e=isArrayLike(e)?e:values(e)).length;or||void 0===n)return 1;if(n1&&(r=optimizeCb(r,t[1])),t=allKeys(e)):(r=keyInObj,t=flatten$1(t,!1,!1),e=Object(e));for(var i=0,a=t.length;i1&&(n=t[1])):(t=map(flatten$1(t,!1,!1),String),r=function(e,n){return!contains(t,n)}),pick(e,r,n)}));function initial(e,t,n){return slice.call(e,0,Math.max(0,e.length-(null==t||n?1:t)))}function first(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[0]:initial(e,e.length-t)}function rest(e,t,n){return slice.call(e,null==t||n?1:t)}function last(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[e.length-1]:rest(e,Math.max(0,e.length-t))}function compact(e){return filter(e,Boolean)}function flatten(e,t){return flatten$1(e,t,!1)}var difference=restArguments((function(e,t){return t=flatten$1(t,!0,!0),filter(e,(function(e){return!contains(t,e)}))})),without=restArguments((function(e,t){return difference(e,t)}));function uniq(e,t,n,r){isBoolean(t)||(r=n,n=t,t=!1),null!=n&&(n=cb(n,r));for(var i=[],a=[],u=0,o=getLength(e);u","\"","'","`","_escape","unescapeMap","_unescape","templateSettings","evaluate","interpolate","escape","noMatch","escapes","\\","\r","\n","
","
","escapeRegExp","escapeChar","bareIdentifier","template","text","settings","oldSettings","offset","render","argument","variable","Error","e","data","fallback","idCounter","uniqueId","prefix","id","chain","instance","_chain","executeBound","sourceFunc","boundFunc","callingContext","partial","boundArgs","placeholder","bound","position","bind","TypeError","callArgs","isArrayLike","flatten","input","depth","strict","output","idx","j","len","bindAll","memoize","hasher","cache","address","delay","wait","setTimeout","defer","throttle","options","timeout","previous","later","leading","throttled","_now","remaining","clearTimeout","trailing","cancel","debounce","immediate","passed","debounced","_args","wrap","wrapper","negate","predicate","compose","start","after","before","memo","once","findKey","createPredicateIndexFinder","dir","array","findIndex","findLastIndex","sortedIndex","low","high","mid","createIndexFinder","predicateFind","item","indexOf","lastIndexOf","find","findWhere","each","createReduce","reducer","initial","reduce","reduceRight","filter","list","reject","every","some","fromIndex","guard","invoke","contextPath","method","pluck","where","computed","lastComputed","v","reStrSymbol","toArray","sample","last","rand","temp","shuffle","sortBy","criteria","left","right","group","behavior","partition","groupBy","indexBy","countBy","pass","size","keyInObj","pick","omit","first","compact","Boolean","_flatten","difference","without","otherArrays","uniq","isSorted","seen","union","arrays","intersection","argsLength","unzip","zip","range","stop","step","ceil","chunk","count","chainResult","mixin","allExports"],"mappings":"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"} \ No newline at end of file diff --git a/src/node_modules/underscore/underscore-esm.js b/src/node_modules/underscore/underscore-esm.js new file mode 100644 index 0000000..4690354 --- /dev/null +++ b/src/node_modules/underscore/underscore-esm.js @@ -0,0 +1,2034 @@ +// Underscore.js 1.13.4 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +// Current version. +var VERSION = '1.13.4'; + +// Establish the root object, `window` (`self`) in the browser, `global` +// on the server, or `this` in some virtual machines. We use `self` +// instead of `window` for `WebWorker` support. +var root = (typeof self == 'object' && self.self === self && self) || + (typeof global == 'object' && global.global === global && global) || + Function('return this')() || + {}; + +// Save bytes in the minified (but not gzipped) version: +var ArrayProto = Array.prototype, ObjProto = Object.prototype; +var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + +// Create quick reference variables for speed access to core prototypes. +var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + +// Modern feature detection. +var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + +// All **ECMAScript 5+** native function implementations that we hope to use +// are declared here. +var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + +// Create references to these builtin functions because we override them. +var _isNaN = isNaN, + _isFinite = isFinite; + +// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. +var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); +var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + +// The largest integer that can be represented exactly. +var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + +// Some functions take a variable number of arguments, or a few expected +// arguments at the beginning and then a variable number of values to operate +// on. This helper accumulates all remaining arguments past the function’s +// argument length (or an explicit `startIndex`), into an array that becomes +// the last argument. Similar to ES6’s "rest parameter". +function restArguments(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; +} + +// Is a given variable an object? +function isObject(obj) { + var type = typeof obj; + return type === 'function' || (type === 'object' && !!obj); +} + +// Is a given value equal to null? +function isNull(obj) { + return obj === null; +} + +// Is a given variable undefined? +function isUndefined(obj) { + return obj === void 0; +} + +// Is a given value a boolean? +function isBoolean(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; +} + +// Is a given value a DOM element? +function isElement(obj) { + return !!(obj && obj.nodeType === 1); +} + +// Internal function for creating a `toString`-based type tester. +function tagTester(name) { + var tag = '[object ' + name + ']'; + return function(obj) { + return toString.call(obj) === tag; + }; +} + +var isString = tagTester('String'); + +var isNumber = tagTester('Number'); + +var isDate = tagTester('Date'); + +var isRegExp = tagTester('RegExp'); + +var isError = tagTester('Error'); + +var isSymbol = tagTester('Symbol'); + +var isArrayBuffer = tagTester('ArrayBuffer'); + +var isFunction = tagTester('Function'); + +// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old +// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). +var nodelist = root.document && root.document.childNodes; +if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + isFunction = function(obj) { + return typeof obj == 'function' || false; + }; +} + +var isFunction$1 = isFunction; + +var hasObjectTag = tagTester('Object'); + +// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. +// In IE 11, the most common among them, this problem also applies to +// `Map`, `WeakMap` and `Set`. +var hasStringTagBug = ( + supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8))) + ), + isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map)); + +var isDataView = tagTester('DataView'); + +// In IE 10 - Edge 13, we need a different heuristic +// to determine whether an object is a `DataView`. +function ie10IsDataView(obj) { + return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer); +} + +var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView); + +// Is a given value an array? +// Delegates to ECMA5's native `Array.isArray`. +var isArray = nativeIsArray || tagTester('Array'); + +// Internal function to check whether `key` is an own property name of `obj`. +function has$1(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); +} + +var isArguments = tagTester('Arguments'); + +// Define a fallback version of the method in browsers (ahem, IE < 9), where +// there isn't any inspectable "Arguments" type. +(function() { + if (!isArguments(arguments)) { + isArguments = function(obj) { + return has$1(obj, 'callee'); + }; + } +}()); + +var isArguments$1 = isArguments; + +// Is a given object a finite number? +function isFinite$1(obj) { + return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj)); +} + +// Is the given value `NaN`? +function isNaN$1(obj) { + return isNumber(obj) && _isNaN(obj); +} + +// Predicate-generating function. Often useful outside of Underscore. +function constant(value) { + return function() { + return value; + }; +} + +// Common internal logic for `isArrayLike` and `isBufferLike`. +function createSizePropertyCheck(getSizeProperty) { + return function(collection) { + var sizeProperty = getSizeProperty(collection); + return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX; + } +} + +// Internal helper to generate a function to obtain property `key` from `obj`. +function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; +} + +// Internal helper to obtain the `byteLength` property of an object. +var getByteLength = shallowProperty('byteLength'); + +// Internal helper to determine whether we should spend extensive checks against +// `ArrayBuffer` et al. +var isBufferLike = createSizePropertyCheck(getByteLength); + +// Is a given value a typed array? +var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; +function isTypedArray(obj) { + // `ArrayBuffer.isView` is the most future-proof, so use it when available. + // Otherwise, fall back on the above regular expression. + return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) : + isBufferLike(obj) && typedArrayPattern.test(toString.call(obj)); +} + +var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false); + +// Internal helper to obtain the `length` property of an object. +var getLength = shallowProperty('length'); + +// Internal helper to create a simple lookup structure. +// `collectNonEnumProps` used to depend on `_.contains`, but this led to +// circular imports. `emulatedSet` is a one-off solution that only works for +// arrays of strings. +function emulatedSet(keys) { + var hash = {}; + for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; + return { + contains: function(key) { return hash[key] === true; }, + push: function(key) { + hash[key] = true; + return keys.push(key); + } + }; +} + +// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't +// be iterated by `for key in ...` and thus missed. Extends `keys` in place if +// needed. +function collectNonEnumProps(obj, keys) { + keys = emulatedSet(keys); + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (isFunction$1(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { + keys.push(prop); + } + } +} + +// Retrieve the names of an object's own properties. +// Delegates to **ECMAScript 5**'s native `Object.keys`. +function keys(obj) { + if (!isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (has$1(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; +} + +// Is a given array, string, or object empty? +// An "empty" object has no enumerable own-properties. +function isEmpty(obj) { + if (obj == null) return true; + // Skip the more expensive `toString`-based type checks if `obj` has no + // `.length`. + var length = getLength(obj); + if (typeof length == 'number' && ( + isArray(obj) || isString(obj) || isArguments$1(obj) + )) return length === 0; + return getLength(keys(obj)) === 0; +} + +// Returns whether an object has a given set of `key:value` pairs. +function isMatch(object, attrs) { + var _keys = keys(attrs), length = _keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = _keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; +} + +// If Underscore is called as a function, it returns a wrapped object that can +// be used OO-style. This wrapper holds altered versions of all functions added +// through `_.mixin`. Wrapped objects may be chained. +function _$1(obj) { + if (obj instanceof _$1) return obj; + if (!(this instanceof _$1)) return new _$1(obj); + this._wrapped = obj; +} + +_$1.VERSION = VERSION; + +// Extracts the result from a wrapped and chained object. +_$1.prototype.value = function() { + return this._wrapped; +}; + +// Provide unwrapping proxies for some methods used in engine operations +// such as arithmetic and JSON stringification. +_$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value; + +_$1.prototype.toString = function() { + return String(this._wrapped); +}; + +// Internal function to wrap or shallow-copy an ArrayBuffer, +// typed array or DataView to a new view, reusing the buffer. +function toBufferView(bufferSource) { + return new Uint8Array( + bufferSource.buffer || bufferSource, + bufferSource.byteOffset || 0, + getByteLength(bufferSource) + ); +} + +// We use this string twice, so give it a name for minification. +var tagDataView = '[object DataView]'; + +// Internal recursive comparison function for `_.isEqual`. +function eq(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); +} + +// Internal recursive comparison function for `_.isEqual`. +function deepEq(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof _$1) a = a._wrapped; + if (b instanceof _$1) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + // Work around a bug in IE 10 - Edge 13. + if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) { + if (!isDataView$1(b)) return false; + className = tagDataView; + } + switch (className) { + // These types are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); + case '[object ArrayBuffer]': + case tagDataView: + // Coerce to typed array so we can fall through. + return deepEq(toBufferView(a), toBufferView(b), aStack, bStack); + } + + var areArrays = className === '[object Array]'; + if (!areArrays && isTypedArray$1(a)) { + var byteLength = getByteLength(a); + if (byteLength !== getByteLength(b)) return false; + if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; + areArrays = true; + } + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor && + isFunction$1(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var _keys = keys(a), key; + length = _keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = _keys[length]; + if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; +} + +// Perform a deep comparison to check if two objects are equal. +function isEqual(a, b) { + return eq(a, b); +} + +// Retrieve all the enumerable property names of an object. +function allKeys(obj) { + if (!isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; +} + +// Since the regular `Object.prototype.toString` type tests don't work for +// some types in IE 11, we use a fingerprinting heuristic instead, based +// on the methods. It's not great, but it's the best we got. +// The fingerprint method lists are defined below. +function ie11fingerprint(methods) { + var length = getLength(methods); + return function(obj) { + if (obj == null) return false; + // `Map`, `WeakMap` and `Set` have no enumerable keys. + var keys = allKeys(obj); + if (getLength(keys)) return false; + for (var i = 0; i < length; i++) { + if (!isFunction$1(obj[methods[i]])) return false; + } + // If we are testing against `WeakMap`, we need to ensure that + // `obj` doesn't have a `forEach` method in order to distinguish + // it from a regular `Map`. + return methods !== weakMapMethods || !isFunction$1(obj[forEachName]); + }; +} + +// In the interest of compact minification, we write +// each string in the fingerprints only once. +var forEachName = 'forEach', + hasName = 'has', + commonInit = ['clear', 'delete'], + mapTail = ['get', hasName, 'set']; + +// `Map`, `WeakMap` and `Set` each have slightly different +// combinations of the above sublists. +var mapMethods = commonInit.concat(forEachName, mapTail), + weakMapMethods = commonInit.concat(mapTail), + setMethods = ['add'].concat(commonInit, forEachName, hasName); + +var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map'); + +var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap'); + +var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set'); + +var isWeakSet = tagTester('WeakSet'); + +// Retrieve the values of an object's properties. +function values(obj) { + var _keys = keys(obj); + var length = _keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[_keys[i]]; + } + return values; +} + +// Convert an object into a list of `[key, value]` pairs. +// The opposite of `_.object` with one argument. +function pairs(obj) { + var _keys = keys(obj); + var length = _keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [_keys[i], obj[_keys[i]]]; + } + return pairs; +} + +// Invert the keys and values of an object. The values must be serializable. +function invert(obj) { + var result = {}; + var _keys = keys(obj); + for (var i = 0, length = _keys.length; i < length; i++) { + result[obj[_keys[i]]] = _keys[i]; + } + return result; +} + +// Return a sorted list of the function names available on the object. +function functions(obj) { + var names = []; + for (var key in obj) { + if (isFunction$1(obj[key])) names.push(key); + } + return names.sort(); +} + +// An internal function for creating assigner functions. +function createAssigner(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; +} + +// Extend a given object with all the properties in passed-in object(s). +var extend = createAssigner(allKeys); + +// Assigns a given object with all the own properties in the passed-in +// object(s). +// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) +var extendOwn = createAssigner(keys); + +// Fill in a given object with default properties. +var defaults = createAssigner(allKeys, true); + +// Create a naked function reference for surrogate-prototype-swapping. +function ctor() { + return function(){}; +} + +// An internal function for creating a new object that inherits from another. +function baseCreate(prototype) { + if (!isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + var Ctor = ctor(); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; +} + +// Creates an object that inherits from the given prototype object. +// If additional properties are provided then they will be added to the +// created object. +function create(prototype, props) { + var result = baseCreate(prototype); + if (props) extendOwn(result, props); + return result; +} + +// Create a (shallow-cloned) duplicate of an object. +function clone(obj) { + if (!isObject(obj)) return obj; + return isArray(obj) ? obj.slice() : extend({}, obj); +} + +// Invokes `interceptor` with the `obj` and then returns `obj`. +// The primary purpose of this method is to "tap into" a method chain, in +// order to perform operations on intermediate results within the chain. +function tap(obj, interceptor) { + interceptor(obj); + return obj; +} + +// Normalize a (deep) property `path` to array. +// Like `_.iteratee`, this function can be customized. +function toPath$1(path) { + return isArray(path) ? path : [path]; +} +_$1.toPath = toPath$1; + +// Internal wrapper for `_.toPath` to enable minification. +// Similar to `cb` for `_.iteratee`. +function toPath(path) { + return _$1.toPath(path); +} + +// Internal function to obtain a nested property in `obj` along `path`. +function deepGet(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; +} + +// Get the value of the (deep) property on `path` from `object`. +// If any property in `path` does not exist or if the value is +// `undefined`, return `defaultValue` instead. +// The `path` is normalized through `_.toPath`. +function get(object, path, defaultValue) { + var value = deepGet(object, toPath(path)); + return isUndefined(value) ? defaultValue : value; +} + +// Shortcut function for checking if an object has a given property directly on +// itself (in other words, not on a prototype). Unlike the internal `has` +// function, this public version can also traverse nested properties. +function has(obj, path) { + path = toPath(path); + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (!has$1(obj, key)) return false; + obj = obj[key]; + } + return !!length; +} + +// Keep the identity function around for default iteratees. +function identity(value) { + return value; +} + +// Returns a predicate for checking whether an object has a given set of +// `key:value` pairs. +function matcher(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; +} + +// Creates a function that, when passed an object, will traverse that object’s +// properties down the given `path`, specified as an array of keys or indices. +function property(path) { + path = toPath(path); + return function(obj) { + return deepGet(obj, path); + }; +} + +// Internal function that returns an efficient (for current engines) version +// of the passed-in callback, to be repeatedly applied in other Underscore +// functions. +function optimizeCb(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; +} + +// An internal function to generate callbacks that can be applied to each +// element in a collection, returning the desired result — either `_.identity`, +// an arbitrary callback, a property matcher, or a property accessor. +function baseIteratee(value, context, argCount) { + if (value == null) return identity; + if (isFunction$1(value)) return optimizeCb(value, context, argCount); + if (isObject(value) && !isArray(value)) return matcher(value); + return property(value); +} + +// External wrapper for our callback generator. Users may customize +// `_.iteratee` if they want additional predicate/iteratee shorthand styles. +// This abstraction hides the internal-only `argCount` argument. +function iteratee(value, context) { + return baseIteratee(value, context, Infinity); +} +_$1.iteratee = iteratee; + +// The function we call internally to generate a callback. It invokes +// `_.iteratee` if overridden, otherwise `baseIteratee`. +function cb(value, context, argCount) { + if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context); + return baseIteratee(value, context, argCount); +} + +// Returns the results of applying the `iteratee` to each element of `obj`. +// In contrast to `_.map` it returns an object. +function mapObject(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = keys(obj), + length = _keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = _keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} + +// Predicate-generating function. Often useful outside of Underscore. +function noop(){} + +// Generates a function for a given object that returns a given property. +function propertyOf(obj) { + if (obj == null) return noop; + return function(path) { + return get(obj, path); + }; +} + +// Run a function **n** times. +function times(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; +} + +// Return a random integer between `min` and `max` (inclusive). +function random(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); +} + +// A (possibly faster) way to get the current timestamp as an integer. +var now = Date.now || function() { + return new Date().getTime(); +}; + +// Internal helper to generate functions for escaping and unescaping strings +// to/from HTML interpolation. +function createEscaper(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; +} + +// Internal list of HTML entities for escaping. +var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' +}; + +// Function for escaping strings to HTML interpolation. +var _escape = createEscaper(escapeMap); + +// Internal list of HTML entities for unescaping. +var unescapeMap = invert(escapeMap); + +// Function for unescaping strings from HTML interpolation. +var _unescape = createEscaper(unescapeMap); + +// By default, Underscore uses ERB-style template delimiters. Change the +// following template settings to use alternative delimiters. +var templateSettings = _$1.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g +}; + +// When customizing `_.templateSettings`, if you don't want to define an +// interpolation, evaluation or escaping regex, we need one that is +// guaranteed not to match. +var noMatch = /(.)^/; + +// Certain characters need to be escaped so that they can be put into a +// string literal. +var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' +}; + +var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + +function escapeChar(match) { + return '\\' + escapes[match]; +} + +// In order to prevent third-party code injection through +// `_.templateSettings.variable`, we test it against the following regular +// expression. It is intentionally a bit more liberal than just matching valid +// identifiers, but still prevents possible loopholes through defaults or +// destructuring assignment. +var bareIdentifier = /^\s*(\w|\$)+\s*$/; + +// JavaScript micro-templating, similar to John Resig's implementation. +// Underscore templating handles arbitrary delimiters, preserves whitespace, +// and correctly escapes quotes within interpolated code. +// NB: `oldSettings` only exists for backwards compatibility. +function template(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = defaults({}, settings, _$1.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(argument, '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _$1); + }; + + // Provide the compiled source as a convenience for precompilation. + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; +} + +// Traverses the children of `obj` along `path`. If a child is a function, it +// is invoked with its parent as context. Returns the value of the final +// child, or `fallback` if any child is undefined. +function result(obj, path, fallback) { + path = toPath(path); + var length = path.length; + if (!length) { + return isFunction$1(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = isFunction$1(prop) ? prop.call(obj) : prop; + } + return obj; +} + +// Generate a unique integer id (unique within the entire client session). +// Useful for temporary DOM ids. +var idCounter = 0; +function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; +} + +// Start chaining a wrapped Underscore object. +function chain(obj) { + var instance = _$1(obj); + instance._chain = true; + return instance; +} + +// Internal function to execute `sourceFunc` bound to `context` with optional +// `args`. Determines whether to execute a function as a constructor or as a +// normal function. +function executeBound(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (isObject(result)) return result; + return self; +} + +// Partially apply a function by creating a version that has had some of its +// arguments pre-filled, without changing its dynamic `this` context. `_` acts +// as a placeholder by default, allowing any combination of arguments to be +// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. +var partial = restArguments(function(func, boundArgs) { + var placeholder = partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; +}); + +partial.placeholder = _$1; + +// Create a function bound to a given object (assigning `this`, and arguments, +// optionally). +var bind = restArguments(function(func, context, args) { + if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; +}); + +// Internal helper for collection methods to determine whether a collection +// should be iterated as an array or as an object. +// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength +// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 +var isArrayLike = createSizePropertyCheck(getLength); + +// Internal implementation of a recursive `flatten` function. +function flatten$1(input, depth, strict, output) { + output = output || []; + if (!depth && depth !== 0) { + depth = Infinity; + } else if (depth <= 0) { + return output.concat(input); + } + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) { + // Flatten current level of array or arguments object. + if (depth > 1) { + flatten$1(value, depth - 1, strict, output); + idx = output.length; + } else { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; +} + +// Bind a number of an object's methods to that object. Remaining arguments +// are the method names to be bound. Useful for ensuring that all callbacks +// defined on an object belong to it. +var bindAll = restArguments(function(obj, keys) { + keys = flatten$1(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = bind(obj[key], obj); + } + return obj; +}); + +// Memoize an expensive function by storing its results. +function memoize(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!has$1(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; +} + +// Delays a function for the given number of milliseconds, and then calls +// it with the arguments supplied. +var delay = restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); +}); + +// Defers a function, scheduling it to run after the current call stack has +// cleared. +var defer = partial(delay, _$1, 1); + +// Returns a function, that, when invoked, will only be triggered at most once +// during a given window of time. Normally, the throttled function will run +// as much as it can, without ever going more than once per `wait` duration; +// but if you'd like to disable the execution on the leading edge, pass +// `{leading: false}`. To disable execution on the trailing edge, ditto. +function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var _now = now(); + if (!previous && options.leading === false) previous = _now; + var remaining = wait - (_now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = _now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; +} + +// When a sequence of calls of the returned function ends, the argument +// function is triggered. The end of a sequence is defined by the `wait` +// parameter. If `immediate` is passed, the argument function will be +// triggered at the beginning of the sequence instead of at the end. +function debounce(func, wait, immediate) { + var timeout, previous, args, result, context; + + var later = function() { + var passed = now() - previous; + if (wait > passed) { + timeout = setTimeout(later, wait - passed); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + // This check is needed because `func` can recursively invoke `debounced`. + if (!timeout) args = context = null; + } + }; + + var debounced = restArguments(function(_args) { + context = this; + args = _args; + previous = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + if (immediate) result = func.apply(context, args); + } + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = args = context = null; + }; + + return debounced; +} + +// Returns the first function passed as an argument to the second, +// allowing you to adjust arguments, run code before and after, and +// conditionally execute the original function. +function wrap(func, wrapper) { + return partial(wrapper, func); +} + +// Returns a negated version of the passed-in predicate. +function negate(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; +} + +// Returns a function that is the composition of a list of functions, each +// consuming the return value of the function that follows. +function compose() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; +} + +// Returns a function that will only be executed on and after the Nth call. +function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; +} + +// Returns a function that will only be executed up to (but not including) the +// Nth call. +function before(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; +} + +// Returns a function that will be executed at most one time, no matter how +// often you call it. Useful for lazy initialization. +var once = partial(before, 2); + +// Returns the first key on an object that passes a truth test. +function findKey(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = keys(obj), key; + for (var i = 0, length = _keys.length; i < length; i++) { + key = _keys[i]; + if (predicate(obj[key], key, obj)) return key; + } +} + +// Internal function to generate `_.findIndex` and `_.findLastIndex`. +function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; +} + +// Returns the first index on an array-like that passes a truth test. +var findIndex = createPredicateIndexFinder(1); + +// Returns the last index on an array-like that passes a truth test. +var findLastIndex = createPredicateIndexFinder(-1); + +// Use a comparator function to figure out the smallest index at which +// an object should be inserted so as to maintain order. Uses binary search. +function sortedIndex(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; +} + +// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. +function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), isNaN$1); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; +} + +// Return the position of the first occurrence of an item in an array, +// or -1 if the item is not included in the array. +// If the array is large and already in sort order, pass `true` +// for **isSorted** to use binary search. +var indexOf = createIndexFinder(1, findIndex, sortedIndex); + +// Return the position of the last occurrence of an item in an array, +// or -1 if the item is not included in the array. +var lastIndexOf = createIndexFinder(-1, findLastIndex); + +// Return the first value which passes a truth test. +function find(obj, predicate, context) { + var keyFinder = isArrayLike(obj) ? findIndex : findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; +} + +// Convenience version of a common use case of `_.find`: getting the first +// object containing specific `key:value` pairs. +function findWhere(obj, attrs) { + return find(obj, matcher(attrs)); +} + +// The cornerstone for collection functions, an `each` +// implementation, aka `forEach`. +// Handles raw objects in addition to array-likes. Treats all +// sparse array-likes as if they were dense. +function each(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + for (i = 0, length = _keys.length; i < length; i++) { + iteratee(obj[_keys[i]], _keys[i], obj); + } + } + return obj; +} + +// Return the results of applying the iteratee to each element. +function map(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} + +// Internal helper to create a reducing function, iterating left or right. +function createReduce(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[_keys ? _keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = _keys ? _keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); + }; +} + +// **Reduce** builds up a single result from a list of values, aka `inject`, +// or `foldl`. +var reduce = createReduce(1); + +// The right-associative version of reduce, also known as `foldr`. +var reduceRight = createReduce(-1); + +// Return all the elements that pass a truth test. +function filter(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; +} + +// Return all the elements for which a truth test fails. +function reject(obj, predicate, context) { + return filter(obj, negate(cb(predicate)), context); +} + +// Determine whether all of the elements pass a truth test. +function every(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; +} + +// Determine if at least one element in the object passes a truth test. +function some(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; +} + +// Determine if the array or object contains a given item (using `===`). +function contains(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return indexOf(obj, item, fromIndex) >= 0; +} + +// Invoke a method (with arguments) on every item in a collection. +var invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (isFunction$1(path)) { + func = path; + } else { + path = toPath(path); + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); +}); + +// Convenience version of a common use case of `_.map`: fetching a property. +function pluck(obj, key) { + return map(obj, property(key)); +} + +// Convenience version of a common use case of `_.filter`: selecting only +// objects containing specific `key:value` pairs. +function where(obj, attrs) { + return filter(obj, matcher(attrs)); +} + +// Return the maximum element (or element-based computation). +function max(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} + +// Return the minimum element (or element-based computation). +function min(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || (computed === Infinity && result === Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} + +// Safely create a real, live array from anything iterable. +var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; +function toArray(obj) { + if (!obj) return []; + if (isArray(obj)) return slice.call(obj); + if (isString(obj)) { + // Keep surrogate pair characters together. + return obj.match(reStrSymbol); + } + if (isArrayLike(obj)) return map(obj, identity); + return values(obj); +} + +// Sample **n** random values from a collection using the modern version of the +// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). +// If **n** is not specified, returns a single random element. +// The internal `guard` argument allows it to work with `_.map`. +function sample(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = values(obj); + return obj[random(obj.length - 1)]; + } + var sample = toArray(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); +} + +// Shuffle a collection. +function shuffle(obj) { + return sample(obj, Infinity); +} + +// Sort the object's values by a criterion produced by an iteratee. +function sortBy(obj, iteratee, context) { + var index = 0; + iteratee = cb(iteratee, context); + return pluck(map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); +} + +// An internal function used for aggregate "group by" operations. +function group(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = cb(iteratee, context); + each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; +} + +// Groups the object's values by a criterion. Pass either a string attribute +// to group by, or a function that returns the criterion. +var groupBy = group(function(result, value, key) { + if (has$1(result, key)) result[key].push(value); else result[key] = [value]; +}); + +// Indexes the object's values by a criterion, similar to `_.groupBy`, but for +// when you know that your index values will be unique. +var indexBy = group(function(result, value, key) { + result[key] = value; +}); + +// Counts instances of an object that group by a certain criterion. Pass +// either a string attribute to count by, or a function that returns the +// criterion. +var countBy = group(function(result, value, key) { + if (has$1(result, key)) result[key]++; else result[key] = 1; +}); + +// Split a collection into two arrays: one whose elements all pass the given +// truth test, and one whose elements all do not pass the truth test. +var partition = group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); +}, true); + +// Return the number of elements in a collection. +function size(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : keys(obj).length; +} + +// Internal `_.pick` helper function to determine whether `key` is an enumerable +// property name of `obj`. +function keyInObj(value, key, obj) { + return key in obj; +} + +// Return a copy of the object only containing the allowed properties. +var pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (isFunction$1(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); + keys = allKeys(obj); + } else { + iteratee = keyInObj; + keys = flatten$1(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; +}); + +// Return a copy of the object without the disallowed properties. +var omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (isFunction$1(iteratee)) { + iteratee = negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = map(flatten$1(keys, false, false), String); + iteratee = function(value, key) { + return !contains(keys, key); + }; + } + return pick(obj, iteratee, context); +}); + +// Returns everything but the last entry of the array. Especially useful on +// the arguments object. Passing **n** will return all the values in +// the array, excluding the last N. +function initial(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); +} + +// Get the first element of an array. Passing **n** will return the first N +// values in the array. The **guard** check allows it to work with `_.map`. +function first(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[0]; + return initial(array, array.length - n); +} + +// Returns everything but the first entry of the `array`. Especially useful on +// the `arguments` object. Passing an **n** will return the rest N values in the +// `array`. +function rest(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); +} + +// Get the last element of an array. Passing **n** will return the last N +// values in the array. +function last(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return rest(array, Math.max(0, array.length - n)); +} + +// Trim out all falsy values from an array. +function compact(array) { + return filter(array, Boolean); +} + +// Flatten out an array, either recursively (by default), or up to `depth`. +// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. +function flatten(array, depth) { + return flatten$1(array, depth, false); +} + +// Take the difference between one array and a number of other arrays. +// Only the elements present in just the first array will remain. +var difference = restArguments(function(array, rest) { + rest = flatten$1(rest, true, true); + return filter(array, function(value){ + return !contains(rest, value); + }); +}); + +// Return a version of the array that does not contain the specified value(s). +var without = restArguments(function(array, otherArrays) { + return difference(array, otherArrays); +}); + +// Produce a duplicate-free version of the array. If the array has already +// been sorted, you have the option of using a faster algorithm. +// The faster algorithm will not work with an iteratee if the iteratee +// is not a one-to-one function, so providing an iteratee will disable +// the faster algorithm. +function uniq(array, isSorted, iteratee, context) { + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!contains(result, value)) { + result.push(value); + } + } + return result; +} + +// Produce an array that contains the union: each distinct element from all of +// the passed-in arrays. +var union = restArguments(function(arrays) { + return uniq(flatten$1(arrays, true, true)); +}); + +// Produce an array that contains every item shared between all the +// passed-in arrays. +function intersection(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; +} + +// Complement of zip. Unzip accepts an array of arrays and groups +// each array's elements on shared indices. +function unzip(array) { + var length = (array && max(array, getLength).length) || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = pluck(array, index); + } + return result; +} + +// Zip together multiple lists into a single array -- elements that share +// an index go together. +var zip = restArguments(unzip); + +// Converts lists into objects. Pass either a single array of `[key, value]` +// pairs, or two parallel arrays of the same length -- one of keys, and one of +// the corresponding values. Passing by pairs is the reverse of `_.pairs`. +function object(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; +} + +// Generate an integer Array containing an arithmetic progression. A port of +// the native Python `range()` function. See +// [the Python documentation](https://docs.python.org/library/functions.html#range). +function range(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; +} + +// Chunk a single array into multiple arrays, each containing `count` or fewer +// items. +function chunk(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; +} + +// Helper function to continue chaining intermediate results. +function chainResult(instance, obj) { + return instance._chain ? _$1(obj).chain() : obj; +} + +// Add your own custom functions to the Underscore object. +function mixin(obj) { + each(functions(obj), function(name) { + var func = _$1[name] = obj[name]; + _$1.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return chainResult(this, func.apply(_$1, args)); + }; + }); + return _$1; +} + +// Add all mutator `Array` functions to the wrapper. +each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) { + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) { + delete obj[0]; + } + } + return chainResult(this, obj); + }; +}); + +// Add all accessor `Array` functions to the wrapper. +each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) obj = method.apply(obj, arguments); + return chainResult(this, obj); + }; +}); + +// Named Exports + +var allExports = { + __proto__: null, + VERSION: VERSION, + restArguments: restArguments, + isObject: isObject, + isNull: isNull, + isUndefined: isUndefined, + isBoolean: isBoolean, + isElement: isElement, + isString: isString, + isNumber: isNumber, + isDate: isDate, + isRegExp: isRegExp, + isError: isError, + isSymbol: isSymbol, + isArrayBuffer: isArrayBuffer, + isDataView: isDataView$1, + isArray: isArray, + isFunction: isFunction$1, + isArguments: isArguments$1, + isFinite: isFinite$1, + isNaN: isNaN$1, + isTypedArray: isTypedArray$1, + isEmpty: isEmpty, + isMatch: isMatch, + isEqual: isEqual, + isMap: isMap, + isWeakMap: isWeakMap, + isSet: isSet, + isWeakSet: isWeakSet, + keys: keys, + allKeys: allKeys, + values: values, + pairs: pairs, + invert: invert, + functions: functions, + methods: functions, + extend: extend, + extendOwn: extendOwn, + assign: extendOwn, + defaults: defaults, + create: create, + clone: clone, + tap: tap, + get: get, + has: has, + mapObject: mapObject, + identity: identity, + constant: constant, + noop: noop, + toPath: toPath$1, + property: property, + propertyOf: propertyOf, + matcher: matcher, + matches: matcher, + times: times, + random: random, + now: now, + escape: _escape, + unescape: _unescape, + templateSettings: templateSettings, + template: template, + result: result, + uniqueId: uniqueId, + chain: chain, + iteratee: iteratee, + partial: partial, + bind: bind, + bindAll: bindAll, + memoize: memoize, + delay: delay, + defer: defer, + throttle: throttle, + debounce: debounce, + wrap: wrap, + negate: negate, + compose: compose, + after: after, + before: before, + once: once, + findKey: findKey, + findIndex: findIndex, + findLastIndex: findLastIndex, + sortedIndex: sortedIndex, + indexOf: indexOf, + lastIndexOf: lastIndexOf, + find: find, + detect: find, + findWhere: findWhere, + each: each, + forEach: each, + map: map, + collect: map, + reduce: reduce, + foldl: reduce, + inject: reduce, + reduceRight: reduceRight, + foldr: reduceRight, + filter: filter, + select: filter, + reject: reject, + every: every, + all: every, + some: some, + any: some, + contains: contains, + includes: contains, + include: contains, + invoke: invoke, + pluck: pluck, + where: where, + max: max, + min: min, + shuffle: shuffle, + sample: sample, + sortBy: sortBy, + groupBy: groupBy, + indexBy: indexBy, + countBy: countBy, + partition: partition, + toArray: toArray, + size: size, + pick: pick, + omit: omit, + first: first, + head: first, + take: first, + initial: initial, + last: last, + rest: rest, + tail: rest, + drop: rest, + compact: compact, + flatten: flatten, + without: without, + uniq: uniq, + unique: uniq, + union: union, + intersection: intersection, + difference: difference, + unzip: unzip, + transpose: unzip, + zip: zip, + object: object, + range: range, + chunk: chunk, + mixin: mixin, + 'default': _$1 +}; + +// Default Export + +// Add all of the Underscore functions to the wrapper object. +var _ = mixin(allExports); +// Legacy Node.js API. +_._ = _; + +// ESM Exports + +export default _; +export { VERSION, after, every as all, allKeys, some as any, extendOwn as assign, before, bind, bindAll, chain, chunk, clone, map as collect, compact, compose, constant, contains, countBy, create, debounce, defaults, defer, delay, find as detect, difference, rest as drop, each, _escape as escape, every, extend, extendOwn, filter, find, findIndex, findKey, findLastIndex, findWhere, first, flatten, reduce as foldl, reduceRight as foldr, each as forEach, functions, get, groupBy, has, first as head, identity, contains as include, contains as includes, indexBy, indexOf, initial, reduce as inject, intersection, invert, invoke, isArguments$1 as isArguments, isArray, isArrayBuffer, isBoolean, isDataView$1 as isDataView, isDate, isElement, isEmpty, isEqual, isError, isFinite$1 as isFinite, isFunction$1 as isFunction, isMap, isMatch, isNaN$1 as isNaN, isNull, isNumber, isObject, isRegExp, isSet, isString, isSymbol, isTypedArray$1 as isTypedArray, isUndefined, isWeakMap, isWeakSet, iteratee, keys, last, lastIndexOf, map, mapObject, matcher, matcher as matches, max, memoize, functions as methods, min, mixin, negate, noop, now, object, omit, once, pairs, partial, partition, pick, pluck, property, propertyOf, random, range, reduce, reduceRight, reject, rest, restArguments, result, sample, filter as select, shuffle, size, some, sortBy, sortedIndex, rest as tail, first as take, tap, template, templateSettings, throttle, times, toArray, toPath$1 as toPath, unzip as transpose, _unescape as unescape, union, uniq, uniq as unique, uniqueId, unzip, values, where, without, wrap, zip }; +//# sourceMappingURL=underscore-esm.js.map diff --git a/src/node_modules/underscore/underscore-esm.js.map b/src/node_modules/underscore/underscore-esm.js.map new file mode 100644 index 0000000..5298724 --- /dev/null +++ b/src/node_modules/underscore/underscore-esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"underscore-esm.js","sources":["modules/_setup.js","modules/restArguments.js","modules/isObject.js","modules/isNull.js","modules/isUndefined.js","modules/isBoolean.js","modules/isElement.js","modules/_tagTester.js","modules/isString.js","modules/isNumber.js","modules/isDate.js","modules/isRegExp.js","modules/isError.js","modules/isSymbol.js","modules/isArrayBuffer.js","modules/isFunction.js","modules/_hasObjectTag.js","modules/_stringTagBug.js","modules/isDataView.js","modules/isArray.js","modules/_has.js","modules/isArguments.js","modules/isFinite.js","modules/isNaN.js","modules/constant.js","modules/_createSizePropertyCheck.js","modules/_shallowProperty.js","modules/_getByteLength.js","modules/_isBufferLike.js","modules/isTypedArray.js","modules/_getLength.js","modules/_collectNonEnumProps.js","modules/keys.js","modules/isEmpty.js","modules/isMatch.js","modules/underscore.js","modules/_toBufferView.js","modules/isEqual.js","modules/allKeys.js","modules/_methodFingerprint.js","modules/isMap.js","modules/isWeakMap.js","modules/isSet.js","modules/isWeakSet.js","modules/values.js","modules/pairs.js","modules/invert.js","modules/functions.js","modules/_createAssigner.js","modules/extend.js","modules/extendOwn.js","modules/defaults.js","modules/_baseCreate.js","modules/create.js","modules/clone.js","modules/tap.js","modules/toPath.js","modules/_toPath.js","modules/_deepGet.js","modules/get.js","modules/has.js","modules/identity.js","modules/matcher.js","modules/property.js","modules/_optimizeCb.js","modules/_baseIteratee.js","modules/iteratee.js","modules/_cb.js","modules/mapObject.js","modules/noop.js","modules/propertyOf.js","modules/times.js","modules/random.js","modules/now.js","modules/_createEscaper.js","modules/_escapeMap.js","modules/escape.js","modules/_unescapeMap.js","modules/unescape.js","modules/templateSettings.js","modules/template.js","modules/result.js","modules/uniqueId.js","modules/chain.js","modules/_executeBound.js","modules/partial.js","modules/bind.js","modules/_isArrayLike.js","modules/_flatten.js","modules/bindAll.js","modules/memoize.js","modules/delay.js","modules/defer.js","modules/throttle.js","modules/debounce.js","modules/wrap.js","modules/negate.js","modules/compose.js","modules/after.js","modules/before.js","modules/once.js","modules/findKey.js","modules/_createPredicateIndexFinder.js","modules/findIndex.js","modules/findLastIndex.js","modules/sortedIndex.js","modules/_createIndexFinder.js","modules/indexOf.js","modules/lastIndexOf.js","modules/find.js","modules/findWhere.js","modules/each.js","modules/map.js","modules/_createReduce.js","modules/reduce.js","modules/reduceRight.js","modules/filter.js","modules/reject.js","modules/every.js","modules/some.js","modules/contains.js","modules/invoke.js","modules/pluck.js","modules/where.js","modules/max.js","modules/min.js","modules/toArray.js","modules/sample.js","modules/shuffle.js","modules/sortBy.js","modules/_group.js","modules/groupBy.js","modules/indexBy.js","modules/countBy.js","modules/partition.js","modules/size.js","modules/_keyInObj.js","modules/pick.js","modules/omit.js","modules/initial.js","modules/first.js","modules/rest.js","modules/last.js","modules/compact.js","modules/flatten.js","modules/difference.js","modules/without.js","modules/uniq.js","modules/union.js","modules/intersection.js","modules/unzip.js","modules/zip.js","modules/object.js","modules/range.js","modules/chunk.js","modules/_chainResult.js","modules/mixin.js","modules/underscore-array-methods.js","modules/index.js","modules/index-default.js","modules/index-all.js"],"sourcesContent":null,"names":["isFunction","has","isFinite","isNaN","isDataView","isArguments","_","isTypedArray","toPath","_has","flatten","_flatten"],"mappings":"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"} \ No newline at end of file diff --git a/src/node_modules/underscore/underscore-min.js b/src/node_modules/underscore/underscore-min.js new file mode 100644 index 0000000..66bbe50 --- /dev/null +++ b/src/node_modules/underscore/underscore-min.js @@ -0,0 +1,6 @@ +!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define("underscore",r):(n="undefined"!=typeof globalThis?globalThis:n||self,function(){var t=n._,e=n._=r();e.noConflict=function(){return n._=t,e}}())}(this,(function(){ +// Underscore.js 1.13.4 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. +var n="1.13.4",r="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},t=Array.prototype,e=Object.prototype,u="undefined"!=typeof Symbol?Symbol.prototype:null,o=t.push,i=t.slice,a=e.toString,f=e.hasOwnProperty,c="undefined"!=typeof ArrayBuffer,l="undefined"!=typeof DataView,s=Array.isArray,p=Object.keys,v=Object.create,h=c&&ArrayBuffer.isView,y=isNaN,d=isFinite,g=!{toString:null}.propertyIsEnumerable("toString"),b=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],m=Math.pow(2,53)-1;function j(n,r){return r=null==r?n.length-1:+r,function(){for(var t=Math.max(arguments.length-r,0),e=Array(t),u=0;u=0&&t<=m}}function J(n){return function(r){return null==r?void 0:r[n]}}var G=J("byteLength"),H=K(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:C(!1),Y=J("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e":">",'"':""","'":"'","`":"`"},$n=zn(Ln),Cn=zn(_n(Ln)),Kn=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Jn=/(.)^/,Gn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Hn=/\\|'|\r|\n|\u2028|\u2029/g;function Qn(n){return"\\"+Gn[n]}var Xn=/^\s*(\w|\$)+\s*$/;var Yn=0;function Zn(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var nr=j((function(n,r){var t=nr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a1)er(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var cr=nr(fr,2);function lr(n,r,t){r=Pn(r,t);for(var e,u=nn(n),o=0,i=u.length;o0?0:u-1;o>=0&&o0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),$))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a=3;return r(n,Rn(t,u,4),e,o)}}var wr=_r(1),Ar=_r(-1);function xr(n,r,t){var e=[];return r=Pn(r,t),mr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Sr(n,r,t){r=Pn(r,t);for(var e=!tr(n)&&nn(n),u=(e||n).length,o=0;o=0}var Er=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Bn(r),e=r.slice(0,-1),r=r[r.length-1]),jr(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=Nn(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Br(n,r){return jr(n,Dn(r))}function Nr(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=tr(n)?n:jn(n)).length;ao&&(o=e);else r=Pn(r,t),mr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}var Ir=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function Tr(n){return n?U(n)?i.call(n):S(n)?n.match(Ir):tr(n)?jr(n,Tn):jn(n):[]}function kr(n,r,t){if(null==r||t)return tr(n)||(n=jn(n)),n[Un(n.length-1)];var e=Tr(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i1&&(e=Rn(e,r[1])),r=an(n)):(e=qr,r=er(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u1&&(t=r[1])):(r=jr(er(r,!1,!1),String),e=function(n,t){return!Mr(r,t)}),Ur(n,e,t)}));function zr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function Lr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:zr(n,n.length-r)}function $r(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=er(r,!0,!0),xr(n,(function(n){return!Mr(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=Pn(t,e));for(var u=[],o=[],i=0,a=Y(n);ir?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o,i,a,f=function(){var c=Wn()-u;r>c?e=setTimeout(f,r-c):(e=null,t||(i=n.apply(a,o)),e||(o=a=null))},c=j((function(c){return a=this,o=c,u=Wn(),e||(e=setTimeout(f,r),t&&(i=n.apply(a,o))),i}));return c.cancel=function(){clearTimeout(e),e=o=a=null},c},wrap:function(n,r){return nr(r,n)},negate:ar,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:fr,once:cr,findKey:lr,findIndex:pr,findLastIndex:vr,sortedIndex:hr,indexOf:dr,lastIndexOf:gr,find:br,detect:br,findWhere:function(n,r){return br(n,kn(r))},each:mr,forEach:mr,map:jr,collect:jr,reduce:wr,foldl:wr,inject:wr,reduceRight:Ar,foldr:Ar,filter:xr,select:xr,reject:function(n,r,t){return xr(n,ar(Pn(r)),t)},every:Sr,all:Sr,some:Or,any:Or,contains:Mr,includes:Mr,include:Mr,invoke:Er,pluck:Br,where:function(n,r){return xr(n,kn(r))},max:Nr,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=tr(n)?n:jn(n)).length;ae||void 0===t)return 1;if(t","\"","'","`","_escape","_unescape","templateSettings","evaluate","interpolate","escape","noMatch","escapes","\\","\r","\n","
","
","escapeRegExp","escapeChar","bareIdentifier","idCounter","executeBound","sourceFunc","boundFunc","callingContext","partial","boundArgs","placeholder","bound","position","bind","TypeError","callArgs","isArrayLike","flatten","input","depth","strict","output","idx","j","len","bindAll","Error","delay","wait","setTimeout","defer","negate","predicate","before","times","memo","once","findKey","createPredicateIndexFinder","dir","array","findIndex","findLastIndex","sortedIndex","low","high","mid","createIndexFinder","predicateFind","item","indexOf","lastIndexOf","find","each","results","currentKey","createReduce","reducer","initial","reduce","reduceRight","filter","list","every","some","fromIndex","guard","invoke","contextPath","method","pluck","computed","lastComputed","v","reStrSymbol","toArray","sample","n","last","rand","temp","group","behavior","partition","groupBy","indexBy","countBy","pass","keyInObj","pick","omit","first","difference","without","otherArrays","uniq","isSorted","seen","union","arrays","unzip","zip","chainResult","instance","_chain","chain","mixin","nodeType","parseFloat","pairs","props","interceptor","_has","accum","text","settings","oldSettings","offset","render","argument","variable","e","template","data","fallback","prefix","id","hasher","memoize","cache","address","options","timeout","previous","later","leading","throttled","_now","remaining","clearTimeout","trailing","cancel","immediate","passed","debounced","_args","wrapper","start","criteria","left","right","Boolean","_flatten","argsLength","stop","step","ceil","range","count"],"mappings":"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"} \ No newline at end of file diff --git a/src/node_modules/underscore/underscore-node-f.cjs b/src/node_modules/underscore/underscore-node-f.cjs new file mode 100644 index 0000000..4d6f371 --- /dev/null +++ b/src/node_modules/underscore/underscore-node-f.cjs @@ -0,0 +1,2158 @@ +// Underscore.js 1.13.4 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +Object.defineProperty(exports, '__esModule', { value: true }); + +// Current version. +var VERSION = '1.13.4'; + +// Establish the root object, `window` (`self`) in the browser, `global` +// on the server, or `this` in some virtual machines. We use `self` +// instead of `window` for `WebWorker` support. +var root = (typeof self == 'object' && self.self === self && self) || + (typeof global == 'object' && global.global === global && global) || + Function('return this')() || + {}; + +// Save bytes in the minified (but not gzipped) version: +var ArrayProto = Array.prototype, ObjProto = Object.prototype; +var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + +// Create quick reference variables for speed access to core prototypes. +var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + +// Modern feature detection. +var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + +// All **ECMAScript 5+** native function implementations that we hope to use +// are declared here. +var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + +// Create references to these builtin functions because we override them. +var _isNaN = isNaN, + _isFinite = isFinite; + +// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. +var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); +var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + +// The largest integer that can be represented exactly. +var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + +// Some functions take a variable number of arguments, or a few expected +// arguments at the beginning and then a variable number of values to operate +// on. This helper accumulates all remaining arguments past the function’s +// argument length (or an explicit `startIndex`), into an array that becomes +// the last argument. Similar to ES6’s "rest parameter". +function restArguments(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; +} + +// Is a given variable an object? +function isObject(obj) { + var type = typeof obj; + return type === 'function' || (type === 'object' && !!obj); +} + +// Is a given value equal to null? +function isNull(obj) { + return obj === null; +} + +// Is a given variable undefined? +function isUndefined(obj) { + return obj === void 0; +} + +// Is a given value a boolean? +function isBoolean(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; +} + +// Is a given value a DOM element? +function isElement(obj) { + return !!(obj && obj.nodeType === 1); +} + +// Internal function for creating a `toString`-based type tester. +function tagTester(name) { + var tag = '[object ' + name + ']'; + return function(obj) { + return toString.call(obj) === tag; + }; +} + +var isString = tagTester('String'); + +var isNumber = tagTester('Number'); + +var isDate = tagTester('Date'); + +var isRegExp = tagTester('RegExp'); + +var isError = tagTester('Error'); + +var isSymbol = tagTester('Symbol'); + +var isArrayBuffer = tagTester('ArrayBuffer'); + +var isFunction = tagTester('Function'); + +// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old +// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). +var nodelist = root.document && root.document.childNodes; +if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + isFunction = function(obj) { + return typeof obj == 'function' || false; + }; +} + +var isFunction$1 = isFunction; + +var hasObjectTag = tagTester('Object'); + +// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. +// In IE 11, the most common among them, this problem also applies to +// `Map`, `WeakMap` and `Set`. +var hasStringTagBug = ( + supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8))) + ), + isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map)); + +var isDataView = tagTester('DataView'); + +// In IE 10 - Edge 13, we need a different heuristic +// to determine whether an object is a `DataView`. +function ie10IsDataView(obj) { + return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer); +} + +var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView); + +// Is a given value an array? +// Delegates to ECMA5's native `Array.isArray`. +var isArray = nativeIsArray || tagTester('Array'); + +// Internal function to check whether `key` is an own property name of `obj`. +function has$1(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); +} + +var isArguments = tagTester('Arguments'); + +// Define a fallback version of the method in browsers (ahem, IE < 9), where +// there isn't any inspectable "Arguments" type. +(function() { + if (!isArguments(arguments)) { + isArguments = function(obj) { + return has$1(obj, 'callee'); + }; + } +}()); + +var isArguments$1 = isArguments; + +// Is a given object a finite number? +function isFinite$1(obj) { + return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj)); +} + +// Is the given value `NaN`? +function isNaN$1(obj) { + return isNumber(obj) && _isNaN(obj); +} + +// Predicate-generating function. Often useful outside of Underscore. +function constant(value) { + return function() { + return value; + }; +} + +// Common internal logic for `isArrayLike` and `isBufferLike`. +function createSizePropertyCheck(getSizeProperty) { + return function(collection) { + var sizeProperty = getSizeProperty(collection); + return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX; + } +} + +// Internal helper to generate a function to obtain property `key` from `obj`. +function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; +} + +// Internal helper to obtain the `byteLength` property of an object. +var getByteLength = shallowProperty('byteLength'); + +// Internal helper to determine whether we should spend extensive checks against +// `ArrayBuffer` et al. +var isBufferLike = createSizePropertyCheck(getByteLength); + +// Is a given value a typed array? +var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; +function isTypedArray(obj) { + // `ArrayBuffer.isView` is the most future-proof, so use it when available. + // Otherwise, fall back on the above regular expression. + return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) : + isBufferLike(obj) && typedArrayPattern.test(toString.call(obj)); +} + +var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false); + +// Internal helper to obtain the `length` property of an object. +var getLength = shallowProperty('length'); + +// Internal helper to create a simple lookup structure. +// `collectNonEnumProps` used to depend on `_.contains`, but this led to +// circular imports. `emulatedSet` is a one-off solution that only works for +// arrays of strings. +function emulatedSet(keys) { + var hash = {}; + for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; + return { + contains: function(key) { return hash[key] === true; }, + push: function(key) { + hash[key] = true; + return keys.push(key); + } + }; +} + +// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't +// be iterated by `for key in ...` and thus missed. Extends `keys` in place if +// needed. +function collectNonEnumProps(obj, keys) { + keys = emulatedSet(keys); + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (isFunction$1(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { + keys.push(prop); + } + } +} + +// Retrieve the names of an object's own properties. +// Delegates to **ECMAScript 5**'s native `Object.keys`. +function keys(obj) { + if (!isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (has$1(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; +} + +// Is a given array, string, or object empty? +// An "empty" object has no enumerable own-properties. +function isEmpty(obj) { + if (obj == null) return true; + // Skip the more expensive `toString`-based type checks if `obj` has no + // `.length`. + var length = getLength(obj); + if (typeof length == 'number' && ( + isArray(obj) || isString(obj) || isArguments$1(obj) + )) return length === 0; + return getLength(keys(obj)) === 0; +} + +// Returns whether an object has a given set of `key:value` pairs. +function isMatch(object, attrs) { + var _keys = keys(attrs), length = _keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = _keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; +} + +// If Underscore is called as a function, it returns a wrapped object that can +// be used OO-style. This wrapper holds altered versions of all functions added +// through `_.mixin`. Wrapped objects may be chained. +function _$1(obj) { + if (obj instanceof _$1) return obj; + if (!(this instanceof _$1)) return new _$1(obj); + this._wrapped = obj; +} + +_$1.VERSION = VERSION; + +// Extracts the result from a wrapped and chained object. +_$1.prototype.value = function() { + return this._wrapped; +}; + +// Provide unwrapping proxies for some methods used in engine operations +// such as arithmetic and JSON stringification. +_$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value; + +_$1.prototype.toString = function() { + return String(this._wrapped); +}; + +// Internal function to wrap or shallow-copy an ArrayBuffer, +// typed array or DataView to a new view, reusing the buffer. +function toBufferView(bufferSource) { + return new Uint8Array( + bufferSource.buffer || bufferSource, + bufferSource.byteOffset || 0, + getByteLength(bufferSource) + ); +} + +// We use this string twice, so give it a name for minification. +var tagDataView = '[object DataView]'; + +// Internal recursive comparison function for `_.isEqual`. +function eq(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); +} + +// Internal recursive comparison function for `_.isEqual`. +function deepEq(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof _$1) a = a._wrapped; + if (b instanceof _$1) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + // Work around a bug in IE 10 - Edge 13. + if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) { + if (!isDataView$1(b)) return false; + className = tagDataView; + } + switch (className) { + // These types are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); + case '[object ArrayBuffer]': + case tagDataView: + // Coerce to typed array so we can fall through. + return deepEq(toBufferView(a), toBufferView(b), aStack, bStack); + } + + var areArrays = className === '[object Array]'; + if (!areArrays && isTypedArray$1(a)) { + var byteLength = getByteLength(a); + if (byteLength !== getByteLength(b)) return false; + if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; + areArrays = true; + } + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor && + isFunction$1(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var _keys = keys(a), key; + length = _keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = _keys[length]; + if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; +} + +// Perform a deep comparison to check if two objects are equal. +function isEqual(a, b) { + return eq(a, b); +} + +// Retrieve all the enumerable property names of an object. +function allKeys(obj) { + if (!isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; +} + +// Since the regular `Object.prototype.toString` type tests don't work for +// some types in IE 11, we use a fingerprinting heuristic instead, based +// on the methods. It's not great, but it's the best we got. +// The fingerprint method lists are defined below. +function ie11fingerprint(methods) { + var length = getLength(methods); + return function(obj) { + if (obj == null) return false; + // `Map`, `WeakMap` and `Set` have no enumerable keys. + var keys = allKeys(obj); + if (getLength(keys)) return false; + for (var i = 0; i < length; i++) { + if (!isFunction$1(obj[methods[i]])) return false; + } + // If we are testing against `WeakMap`, we need to ensure that + // `obj` doesn't have a `forEach` method in order to distinguish + // it from a regular `Map`. + return methods !== weakMapMethods || !isFunction$1(obj[forEachName]); + }; +} + +// In the interest of compact minification, we write +// each string in the fingerprints only once. +var forEachName = 'forEach', + hasName = 'has', + commonInit = ['clear', 'delete'], + mapTail = ['get', hasName, 'set']; + +// `Map`, `WeakMap` and `Set` each have slightly different +// combinations of the above sublists. +var mapMethods = commonInit.concat(forEachName, mapTail), + weakMapMethods = commonInit.concat(mapTail), + setMethods = ['add'].concat(commonInit, forEachName, hasName); + +var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map'); + +var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap'); + +var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set'); + +var isWeakSet = tagTester('WeakSet'); + +// Retrieve the values of an object's properties. +function values(obj) { + var _keys = keys(obj); + var length = _keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[_keys[i]]; + } + return values; +} + +// Convert an object into a list of `[key, value]` pairs. +// The opposite of `_.object` with one argument. +function pairs(obj) { + var _keys = keys(obj); + var length = _keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [_keys[i], obj[_keys[i]]]; + } + return pairs; +} + +// Invert the keys and values of an object. The values must be serializable. +function invert(obj) { + var result = {}; + var _keys = keys(obj); + for (var i = 0, length = _keys.length; i < length; i++) { + result[obj[_keys[i]]] = _keys[i]; + } + return result; +} + +// Return a sorted list of the function names available on the object. +function functions(obj) { + var names = []; + for (var key in obj) { + if (isFunction$1(obj[key])) names.push(key); + } + return names.sort(); +} + +// An internal function for creating assigner functions. +function createAssigner(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; +} + +// Extend a given object with all the properties in passed-in object(s). +var extend = createAssigner(allKeys); + +// Assigns a given object with all the own properties in the passed-in +// object(s). +// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) +var extendOwn = createAssigner(keys); + +// Fill in a given object with default properties. +var defaults = createAssigner(allKeys, true); + +// Create a naked function reference for surrogate-prototype-swapping. +function ctor() { + return function(){}; +} + +// An internal function for creating a new object that inherits from another. +function baseCreate(prototype) { + if (!isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + var Ctor = ctor(); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; +} + +// Creates an object that inherits from the given prototype object. +// If additional properties are provided then they will be added to the +// created object. +function create(prototype, props) { + var result = baseCreate(prototype); + if (props) extendOwn(result, props); + return result; +} + +// Create a (shallow-cloned) duplicate of an object. +function clone(obj) { + if (!isObject(obj)) return obj; + return isArray(obj) ? obj.slice() : extend({}, obj); +} + +// Invokes `interceptor` with the `obj` and then returns `obj`. +// The primary purpose of this method is to "tap into" a method chain, in +// order to perform operations on intermediate results within the chain. +function tap(obj, interceptor) { + interceptor(obj); + return obj; +} + +// Normalize a (deep) property `path` to array. +// Like `_.iteratee`, this function can be customized. +function toPath$1(path) { + return isArray(path) ? path : [path]; +} +_$1.toPath = toPath$1; + +// Internal wrapper for `_.toPath` to enable minification. +// Similar to `cb` for `_.iteratee`. +function toPath(path) { + return _$1.toPath(path); +} + +// Internal function to obtain a nested property in `obj` along `path`. +function deepGet(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; +} + +// Get the value of the (deep) property on `path` from `object`. +// If any property in `path` does not exist or if the value is +// `undefined`, return `defaultValue` instead. +// The `path` is normalized through `_.toPath`. +function get(object, path, defaultValue) { + var value = deepGet(object, toPath(path)); + return isUndefined(value) ? defaultValue : value; +} + +// Shortcut function for checking if an object has a given property directly on +// itself (in other words, not on a prototype). Unlike the internal `has` +// function, this public version can also traverse nested properties. +function has(obj, path) { + path = toPath(path); + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (!has$1(obj, key)) return false; + obj = obj[key]; + } + return !!length; +} + +// Keep the identity function around for default iteratees. +function identity(value) { + return value; +} + +// Returns a predicate for checking whether an object has a given set of +// `key:value` pairs. +function matcher(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; +} + +// Creates a function that, when passed an object, will traverse that object’s +// properties down the given `path`, specified as an array of keys or indices. +function property(path) { + path = toPath(path); + return function(obj) { + return deepGet(obj, path); + }; +} + +// Internal function that returns an efficient (for current engines) version +// of the passed-in callback, to be repeatedly applied in other Underscore +// functions. +function optimizeCb(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; +} + +// An internal function to generate callbacks that can be applied to each +// element in a collection, returning the desired result — either `_.identity`, +// an arbitrary callback, a property matcher, or a property accessor. +function baseIteratee(value, context, argCount) { + if (value == null) return identity; + if (isFunction$1(value)) return optimizeCb(value, context, argCount); + if (isObject(value) && !isArray(value)) return matcher(value); + return property(value); +} + +// External wrapper for our callback generator. Users may customize +// `_.iteratee` if they want additional predicate/iteratee shorthand styles. +// This abstraction hides the internal-only `argCount` argument. +function iteratee(value, context) { + return baseIteratee(value, context, Infinity); +} +_$1.iteratee = iteratee; + +// The function we call internally to generate a callback. It invokes +// `_.iteratee` if overridden, otherwise `baseIteratee`. +function cb(value, context, argCount) { + if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context); + return baseIteratee(value, context, argCount); +} + +// Returns the results of applying the `iteratee` to each element of `obj`. +// In contrast to `_.map` it returns an object. +function mapObject(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = keys(obj), + length = _keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = _keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} + +// Predicate-generating function. Often useful outside of Underscore. +function noop(){} + +// Generates a function for a given object that returns a given property. +function propertyOf(obj) { + if (obj == null) return noop; + return function(path) { + return get(obj, path); + }; +} + +// Run a function **n** times. +function times(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; +} + +// Return a random integer between `min` and `max` (inclusive). +function random(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); +} + +// A (possibly faster) way to get the current timestamp as an integer. +var now = Date.now || function() { + return new Date().getTime(); +}; + +// Internal helper to generate functions for escaping and unescaping strings +// to/from HTML interpolation. +function createEscaper(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; +} + +// Internal list of HTML entities for escaping. +var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' +}; + +// Function for escaping strings to HTML interpolation. +var _escape = createEscaper(escapeMap); + +// Internal list of HTML entities for unescaping. +var unescapeMap = invert(escapeMap); + +// Function for unescaping strings from HTML interpolation. +var _unescape = createEscaper(unescapeMap); + +// By default, Underscore uses ERB-style template delimiters. Change the +// following template settings to use alternative delimiters. +var templateSettings = _$1.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g +}; + +// When customizing `_.templateSettings`, if you don't want to define an +// interpolation, evaluation or escaping regex, we need one that is +// guaranteed not to match. +var noMatch = /(.)^/; + +// Certain characters need to be escaped so that they can be put into a +// string literal. +var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' +}; + +var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + +function escapeChar(match) { + return '\\' + escapes[match]; +} + +// In order to prevent third-party code injection through +// `_.templateSettings.variable`, we test it against the following regular +// expression. It is intentionally a bit more liberal than just matching valid +// identifiers, but still prevents possible loopholes through defaults or +// destructuring assignment. +var bareIdentifier = /^\s*(\w|\$)+\s*$/; + +// JavaScript micro-templating, similar to John Resig's implementation. +// Underscore templating handles arbitrary delimiters, preserves whitespace, +// and correctly escapes quotes within interpolated code. +// NB: `oldSettings` only exists for backwards compatibility. +function template(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = defaults({}, settings, _$1.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(argument, '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _$1); + }; + + // Provide the compiled source as a convenience for precompilation. + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; +} + +// Traverses the children of `obj` along `path`. If a child is a function, it +// is invoked with its parent as context. Returns the value of the final +// child, or `fallback` if any child is undefined. +function result(obj, path, fallback) { + path = toPath(path); + var length = path.length; + if (!length) { + return isFunction$1(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = isFunction$1(prop) ? prop.call(obj) : prop; + } + return obj; +} + +// Generate a unique integer id (unique within the entire client session). +// Useful for temporary DOM ids. +var idCounter = 0; +function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; +} + +// Start chaining a wrapped Underscore object. +function chain(obj) { + var instance = _$1(obj); + instance._chain = true; + return instance; +} + +// Internal function to execute `sourceFunc` bound to `context` with optional +// `args`. Determines whether to execute a function as a constructor or as a +// normal function. +function executeBound(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (isObject(result)) return result; + return self; +} + +// Partially apply a function by creating a version that has had some of its +// arguments pre-filled, without changing its dynamic `this` context. `_` acts +// as a placeholder by default, allowing any combination of arguments to be +// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. +var partial = restArguments(function(func, boundArgs) { + var placeholder = partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; +}); + +partial.placeholder = _$1; + +// Create a function bound to a given object (assigning `this`, and arguments, +// optionally). +var bind = restArguments(function(func, context, args) { + if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; +}); + +// Internal helper for collection methods to determine whether a collection +// should be iterated as an array or as an object. +// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength +// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 +var isArrayLike = createSizePropertyCheck(getLength); + +// Internal implementation of a recursive `flatten` function. +function flatten$1(input, depth, strict, output) { + output = output || []; + if (!depth && depth !== 0) { + depth = Infinity; + } else if (depth <= 0) { + return output.concat(input); + } + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) { + // Flatten current level of array or arguments object. + if (depth > 1) { + flatten$1(value, depth - 1, strict, output); + idx = output.length; + } else { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; +} + +// Bind a number of an object's methods to that object. Remaining arguments +// are the method names to be bound. Useful for ensuring that all callbacks +// defined on an object belong to it. +var bindAll = restArguments(function(obj, keys) { + keys = flatten$1(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = bind(obj[key], obj); + } + return obj; +}); + +// Memoize an expensive function by storing its results. +function memoize(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!has$1(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; +} + +// Delays a function for the given number of milliseconds, and then calls +// it with the arguments supplied. +var delay = restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); +}); + +// Defers a function, scheduling it to run after the current call stack has +// cleared. +var defer = partial(delay, _$1, 1); + +// Returns a function, that, when invoked, will only be triggered at most once +// during a given window of time. Normally, the throttled function will run +// as much as it can, without ever going more than once per `wait` duration; +// but if you'd like to disable the execution on the leading edge, pass +// `{leading: false}`. To disable execution on the trailing edge, ditto. +function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var _now = now(); + if (!previous && options.leading === false) previous = _now; + var remaining = wait - (_now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = _now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; +} + +// When a sequence of calls of the returned function ends, the argument +// function is triggered. The end of a sequence is defined by the `wait` +// parameter. If `immediate` is passed, the argument function will be +// triggered at the beginning of the sequence instead of at the end. +function debounce(func, wait, immediate) { + var timeout, previous, args, result, context; + + var later = function() { + var passed = now() - previous; + if (wait > passed) { + timeout = setTimeout(later, wait - passed); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + // This check is needed because `func` can recursively invoke `debounced`. + if (!timeout) args = context = null; + } + }; + + var debounced = restArguments(function(_args) { + context = this; + args = _args; + previous = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + if (immediate) result = func.apply(context, args); + } + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = args = context = null; + }; + + return debounced; +} + +// Returns the first function passed as an argument to the second, +// allowing you to adjust arguments, run code before and after, and +// conditionally execute the original function. +function wrap(func, wrapper) { + return partial(wrapper, func); +} + +// Returns a negated version of the passed-in predicate. +function negate(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; +} + +// Returns a function that is the composition of a list of functions, each +// consuming the return value of the function that follows. +function compose() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; +} + +// Returns a function that will only be executed on and after the Nth call. +function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; +} + +// Returns a function that will only be executed up to (but not including) the +// Nth call. +function before(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; +} + +// Returns a function that will be executed at most one time, no matter how +// often you call it. Useful for lazy initialization. +var once = partial(before, 2); + +// Returns the first key on an object that passes a truth test. +function findKey(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = keys(obj), key; + for (var i = 0, length = _keys.length; i < length; i++) { + key = _keys[i]; + if (predicate(obj[key], key, obj)) return key; + } +} + +// Internal function to generate `_.findIndex` and `_.findLastIndex`. +function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; +} + +// Returns the first index on an array-like that passes a truth test. +var findIndex = createPredicateIndexFinder(1); + +// Returns the last index on an array-like that passes a truth test. +var findLastIndex = createPredicateIndexFinder(-1); + +// Use a comparator function to figure out the smallest index at which +// an object should be inserted so as to maintain order. Uses binary search. +function sortedIndex(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; +} + +// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. +function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), isNaN$1); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; +} + +// Return the position of the first occurrence of an item in an array, +// or -1 if the item is not included in the array. +// If the array is large and already in sort order, pass `true` +// for **isSorted** to use binary search. +var indexOf = createIndexFinder(1, findIndex, sortedIndex); + +// Return the position of the last occurrence of an item in an array, +// or -1 if the item is not included in the array. +var lastIndexOf = createIndexFinder(-1, findLastIndex); + +// Return the first value which passes a truth test. +function find(obj, predicate, context) { + var keyFinder = isArrayLike(obj) ? findIndex : findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; +} + +// Convenience version of a common use case of `_.find`: getting the first +// object containing specific `key:value` pairs. +function findWhere(obj, attrs) { + return find(obj, matcher(attrs)); +} + +// The cornerstone for collection functions, an `each` +// implementation, aka `forEach`. +// Handles raw objects in addition to array-likes. Treats all +// sparse array-likes as if they were dense. +function each(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + for (i = 0, length = _keys.length; i < length; i++) { + iteratee(obj[_keys[i]], _keys[i], obj); + } + } + return obj; +} + +// Return the results of applying the iteratee to each element. +function map(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} + +// Internal helper to create a reducing function, iterating left or right. +function createReduce(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[_keys ? _keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = _keys ? _keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); + }; +} + +// **Reduce** builds up a single result from a list of values, aka `inject`, +// or `foldl`. +var reduce = createReduce(1); + +// The right-associative version of reduce, also known as `foldr`. +var reduceRight = createReduce(-1); + +// Return all the elements that pass a truth test. +function filter(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; +} + +// Return all the elements for which a truth test fails. +function reject(obj, predicate, context) { + return filter(obj, negate(cb(predicate)), context); +} + +// Determine whether all of the elements pass a truth test. +function every(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; +} + +// Determine if at least one element in the object passes a truth test. +function some(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; +} + +// Determine if the array or object contains a given item (using `===`). +function contains(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return indexOf(obj, item, fromIndex) >= 0; +} + +// Invoke a method (with arguments) on every item in a collection. +var invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (isFunction$1(path)) { + func = path; + } else { + path = toPath(path); + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); +}); + +// Convenience version of a common use case of `_.map`: fetching a property. +function pluck(obj, key) { + return map(obj, property(key)); +} + +// Convenience version of a common use case of `_.filter`: selecting only +// objects containing specific `key:value` pairs. +function where(obj, attrs) { + return filter(obj, matcher(attrs)); +} + +// Return the maximum element (or element-based computation). +function max(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} + +// Return the minimum element (or element-based computation). +function min(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || (computed === Infinity && result === Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} + +// Safely create a real, live array from anything iterable. +var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; +function toArray(obj) { + if (!obj) return []; + if (isArray(obj)) return slice.call(obj); + if (isString(obj)) { + // Keep surrogate pair characters together. + return obj.match(reStrSymbol); + } + if (isArrayLike(obj)) return map(obj, identity); + return values(obj); +} + +// Sample **n** random values from a collection using the modern version of the +// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). +// If **n** is not specified, returns a single random element. +// The internal `guard` argument allows it to work with `_.map`. +function sample(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = values(obj); + return obj[random(obj.length - 1)]; + } + var sample = toArray(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); +} + +// Shuffle a collection. +function shuffle(obj) { + return sample(obj, Infinity); +} + +// Sort the object's values by a criterion produced by an iteratee. +function sortBy(obj, iteratee, context) { + var index = 0; + iteratee = cb(iteratee, context); + return pluck(map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); +} + +// An internal function used for aggregate "group by" operations. +function group(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = cb(iteratee, context); + each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; +} + +// Groups the object's values by a criterion. Pass either a string attribute +// to group by, or a function that returns the criterion. +var groupBy = group(function(result, value, key) { + if (has$1(result, key)) result[key].push(value); else result[key] = [value]; +}); + +// Indexes the object's values by a criterion, similar to `_.groupBy`, but for +// when you know that your index values will be unique. +var indexBy = group(function(result, value, key) { + result[key] = value; +}); + +// Counts instances of an object that group by a certain criterion. Pass +// either a string attribute to count by, or a function that returns the +// criterion. +var countBy = group(function(result, value, key) { + if (has$1(result, key)) result[key]++; else result[key] = 1; +}); + +// Split a collection into two arrays: one whose elements all pass the given +// truth test, and one whose elements all do not pass the truth test. +var partition = group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); +}, true); + +// Return the number of elements in a collection. +function size(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : keys(obj).length; +} + +// Internal `_.pick` helper function to determine whether `key` is an enumerable +// property name of `obj`. +function keyInObj(value, key, obj) { + return key in obj; +} + +// Return a copy of the object only containing the allowed properties. +var pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (isFunction$1(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); + keys = allKeys(obj); + } else { + iteratee = keyInObj; + keys = flatten$1(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; +}); + +// Return a copy of the object without the disallowed properties. +var omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (isFunction$1(iteratee)) { + iteratee = negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = map(flatten$1(keys, false, false), String); + iteratee = function(value, key) { + return !contains(keys, key); + }; + } + return pick(obj, iteratee, context); +}); + +// Returns everything but the last entry of the array. Especially useful on +// the arguments object. Passing **n** will return all the values in +// the array, excluding the last N. +function initial(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); +} + +// Get the first element of an array. Passing **n** will return the first N +// values in the array. The **guard** check allows it to work with `_.map`. +function first(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[0]; + return initial(array, array.length - n); +} + +// Returns everything but the first entry of the `array`. Especially useful on +// the `arguments` object. Passing an **n** will return the rest N values in the +// `array`. +function rest(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); +} + +// Get the last element of an array. Passing **n** will return the last N +// values in the array. +function last(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return rest(array, Math.max(0, array.length - n)); +} + +// Trim out all falsy values from an array. +function compact(array) { + return filter(array, Boolean); +} + +// Flatten out an array, either recursively (by default), or up to `depth`. +// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. +function flatten(array, depth) { + return flatten$1(array, depth, false); +} + +// Take the difference between one array and a number of other arrays. +// Only the elements present in just the first array will remain. +var difference = restArguments(function(array, rest) { + rest = flatten$1(rest, true, true); + return filter(array, function(value){ + return !contains(rest, value); + }); +}); + +// Return a version of the array that does not contain the specified value(s). +var without = restArguments(function(array, otherArrays) { + return difference(array, otherArrays); +}); + +// Produce a duplicate-free version of the array. If the array has already +// been sorted, you have the option of using a faster algorithm. +// The faster algorithm will not work with an iteratee if the iteratee +// is not a one-to-one function, so providing an iteratee will disable +// the faster algorithm. +function uniq(array, isSorted, iteratee, context) { + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!contains(result, value)) { + result.push(value); + } + } + return result; +} + +// Produce an array that contains the union: each distinct element from all of +// the passed-in arrays. +var union = restArguments(function(arrays) { + return uniq(flatten$1(arrays, true, true)); +}); + +// Produce an array that contains every item shared between all the +// passed-in arrays. +function intersection(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; +} + +// Complement of zip. Unzip accepts an array of arrays and groups +// each array's elements on shared indices. +function unzip(array) { + var length = (array && max(array, getLength).length) || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = pluck(array, index); + } + return result; +} + +// Zip together multiple lists into a single array -- elements that share +// an index go together. +var zip = restArguments(unzip); + +// Converts lists into objects. Pass either a single array of `[key, value]` +// pairs, or two parallel arrays of the same length -- one of keys, and one of +// the corresponding values. Passing by pairs is the reverse of `_.pairs`. +function object(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; +} + +// Generate an integer Array containing an arithmetic progression. A port of +// the native Python `range()` function. See +// [the Python documentation](https://docs.python.org/library/functions.html#range). +function range(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; +} + +// Chunk a single array into multiple arrays, each containing `count` or fewer +// items. +function chunk(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; +} + +// Helper function to continue chaining intermediate results. +function chainResult(instance, obj) { + return instance._chain ? _$1(obj).chain() : obj; +} + +// Add your own custom functions to the Underscore object. +function mixin(obj) { + each(functions(obj), function(name) { + var func = _$1[name] = obj[name]; + _$1.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return chainResult(this, func.apply(_$1, args)); + }; + }); + return _$1; +} + +// Add all mutator `Array` functions to the wrapper. +each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) { + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) { + delete obj[0]; + } + } + return chainResult(this, obj); + }; +}); + +// Add all accessor `Array` functions to the wrapper. +each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) obj = method.apply(obj, arguments); + return chainResult(this, obj); + }; +}); + +// Named Exports + +var allExports = { + __proto__: null, + VERSION: VERSION, + restArguments: restArguments, + isObject: isObject, + isNull: isNull, + isUndefined: isUndefined, + isBoolean: isBoolean, + isElement: isElement, + isString: isString, + isNumber: isNumber, + isDate: isDate, + isRegExp: isRegExp, + isError: isError, + isSymbol: isSymbol, + isArrayBuffer: isArrayBuffer, + isDataView: isDataView$1, + isArray: isArray, + isFunction: isFunction$1, + isArguments: isArguments$1, + isFinite: isFinite$1, + isNaN: isNaN$1, + isTypedArray: isTypedArray$1, + isEmpty: isEmpty, + isMatch: isMatch, + isEqual: isEqual, + isMap: isMap, + isWeakMap: isWeakMap, + isSet: isSet, + isWeakSet: isWeakSet, + keys: keys, + allKeys: allKeys, + values: values, + pairs: pairs, + invert: invert, + functions: functions, + methods: functions, + extend: extend, + extendOwn: extendOwn, + assign: extendOwn, + defaults: defaults, + create: create, + clone: clone, + tap: tap, + get: get, + has: has, + mapObject: mapObject, + identity: identity, + constant: constant, + noop: noop, + toPath: toPath$1, + property: property, + propertyOf: propertyOf, + matcher: matcher, + matches: matcher, + times: times, + random: random, + now: now, + escape: _escape, + unescape: _unescape, + templateSettings: templateSettings, + template: template, + result: result, + uniqueId: uniqueId, + chain: chain, + iteratee: iteratee, + partial: partial, + bind: bind, + bindAll: bindAll, + memoize: memoize, + delay: delay, + defer: defer, + throttle: throttle, + debounce: debounce, + wrap: wrap, + negate: negate, + compose: compose, + after: after, + before: before, + once: once, + findKey: findKey, + findIndex: findIndex, + findLastIndex: findLastIndex, + sortedIndex: sortedIndex, + indexOf: indexOf, + lastIndexOf: lastIndexOf, + find: find, + detect: find, + findWhere: findWhere, + each: each, + forEach: each, + map: map, + collect: map, + reduce: reduce, + foldl: reduce, + inject: reduce, + reduceRight: reduceRight, + foldr: reduceRight, + filter: filter, + select: filter, + reject: reject, + every: every, + all: every, + some: some, + any: some, + contains: contains, + includes: contains, + include: contains, + invoke: invoke, + pluck: pluck, + where: where, + max: max, + min: min, + shuffle: shuffle, + sample: sample, + sortBy: sortBy, + groupBy: groupBy, + indexBy: indexBy, + countBy: countBy, + partition: partition, + toArray: toArray, + size: size, + pick: pick, + omit: omit, + first: first, + head: first, + take: first, + initial: initial, + last: last, + rest: rest, + tail: rest, + drop: rest, + compact: compact, + flatten: flatten, + without: without, + uniq: uniq, + unique: uniq, + union: union, + intersection: intersection, + difference: difference, + unzip: unzip, + transpose: unzip, + zip: zip, + object: object, + range: range, + chunk: chunk, + mixin: mixin, + 'default': _$1 +}; + +// Default Export + +// Add all of the Underscore functions to the wrapper object. +var _ = mixin(allExports); +// Legacy Node.js API. +_._ = _; + +exports.VERSION = VERSION; +exports._ = _; +exports._escape = _escape; +exports._unescape = _unescape; +exports.after = after; +exports.allKeys = allKeys; +exports.before = before; +exports.bind = bind; +exports.bindAll = bindAll; +exports.chain = chain; +exports.chunk = chunk; +exports.clone = clone; +exports.compact = compact; +exports.compose = compose; +exports.constant = constant; +exports.contains = contains; +exports.countBy = countBy; +exports.create = create; +exports.debounce = debounce; +exports.defaults = defaults; +exports.defer = defer; +exports.delay = delay; +exports.difference = difference; +exports.each = each; +exports.every = every; +exports.extend = extend; +exports.extendOwn = extendOwn; +exports.filter = filter; +exports.find = find; +exports.findIndex = findIndex; +exports.findKey = findKey; +exports.findLastIndex = findLastIndex; +exports.findWhere = findWhere; +exports.first = first; +exports.flatten = flatten; +exports.functions = functions; +exports.get = get; +exports.groupBy = groupBy; +exports.has = has; +exports.identity = identity; +exports.indexBy = indexBy; +exports.indexOf = indexOf; +exports.initial = initial; +exports.intersection = intersection; +exports.invert = invert; +exports.invoke = invoke; +exports.isArguments = isArguments$1; +exports.isArray = isArray; +exports.isArrayBuffer = isArrayBuffer; +exports.isBoolean = isBoolean; +exports.isDataView = isDataView$1; +exports.isDate = isDate; +exports.isElement = isElement; +exports.isEmpty = isEmpty; +exports.isEqual = isEqual; +exports.isError = isError; +exports.isFinite = isFinite$1; +exports.isFunction = isFunction$1; +exports.isMap = isMap; +exports.isMatch = isMatch; +exports.isNaN = isNaN$1; +exports.isNull = isNull; +exports.isNumber = isNumber; +exports.isObject = isObject; +exports.isRegExp = isRegExp; +exports.isSet = isSet; +exports.isString = isString; +exports.isSymbol = isSymbol; +exports.isTypedArray = isTypedArray$1; +exports.isUndefined = isUndefined; +exports.isWeakMap = isWeakMap; +exports.isWeakSet = isWeakSet; +exports.iteratee = iteratee; +exports.keys = keys; +exports.last = last; +exports.lastIndexOf = lastIndexOf; +exports.map = map; +exports.mapObject = mapObject; +exports.matcher = matcher; +exports.max = max; +exports.memoize = memoize; +exports.min = min; +exports.mixin = mixin; +exports.negate = negate; +exports.noop = noop; +exports.now = now; +exports.object = object; +exports.omit = omit; +exports.once = once; +exports.pairs = pairs; +exports.partial = partial; +exports.partition = partition; +exports.pick = pick; +exports.pluck = pluck; +exports.property = property; +exports.propertyOf = propertyOf; +exports.random = random; +exports.range = range; +exports.reduce = reduce; +exports.reduceRight = reduceRight; +exports.reject = reject; +exports.rest = rest; +exports.restArguments = restArguments; +exports.result = result; +exports.sample = sample; +exports.shuffle = shuffle; +exports.size = size; +exports.some = some; +exports.sortBy = sortBy; +exports.sortedIndex = sortedIndex; +exports.tap = tap; +exports.template = template; +exports.templateSettings = templateSettings; +exports.throttle = throttle; +exports.times = times; +exports.toArray = toArray; +exports.toPath = toPath$1; +exports.union = union; +exports.uniq = uniq; +exports.uniqueId = uniqueId; +exports.unzip = unzip; +exports.values = values; +exports.where = where; +exports.without = without; +exports.wrap = wrap; +exports.zip = zip; +//# sourceMappingURL=underscore-node-f.cjs.map diff --git a/src/node_modules/underscore/underscore-node-f.cjs.map b/src/node_modules/underscore/underscore-node-f.cjs.map new file mode 100644 index 0000000..a3ca460 --- /dev/null +++ b/src/node_modules/underscore/underscore-node-f.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"underscore-node-f.cjs","sources":["underscore-node-f-pre.js"],"sourcesContent":null,"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/node_modules/underscore/underscore-node.cjs b/src/node_modules/underscore/underscore-node.cjs new file mode 100644 index 0000000..879a1dc --- /dev/null +++ b/src/node_modules/underscore/underscore-node.cjs @@ -0,0 +1,11 @@ +// Underscore.js 1.13.4 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +var underscoreNodeF = require('./underscore-node-f.cjs'); + + + +module.exports = underscoreNodeF._; +//# sourceMappingURL=underscore-node.cjs.map diff --git a/src/node_modules/underscore/underscore-node.cjs.map b/src/node_modules/underscore/underscore-node.cjs.map new file mode 100644 index 0000000..34b7b29 --- /dev/null +++ b/src/node_modules/underscore/underscore-node.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"underscore-node.cjs","sources":[],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;"} \ No newline at end of file diff --git a/src/node_modules/underscore/underscore-node.mjs b/src/node_modules/underscore/underscore-node.mjs new file mode 100644 index 0000000..64be97d --- /dev/null +++ b/src/node_modules/underscore/underscore-node.mjs @@ -0,0 +1,7 @@ +// Underscore.js 1.13.4 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +export { VERSION, after, every as all, allKeys, some as any, extendOwn as assign, before, bind, bindAll, chain, chunk, clone, map as collect, compact, compose, constant, contains, countBy, create, debounce, _ as default, defaults, defer, delay, find as detect, difference, rest as drop, each, _escape as escape, every, extend, extendOwn, filter, find, findIndex, findKey, findLastIndex, findWhere, first, flatten, reduce as foldl, reduceRight as foldr, each as forEach, functions, get, groupBy, has, first as head, identity, contains as include, contains as includes, indexBy, indexOf, initial, reduce as inject, intersection, invert, invoke, isArguments, isArray, isArrayBuffer, isBoolean, isDataView, isDate, isElement, isEmpty, isEqual, isError, isFinite, isFunction, isMap, isMatch, isNaN, isNull, isNumber, isObject, isRegExp, isSet, isString, isSymbol, isTypedArray, isUndefined, isWeakMap, isWeakSet, iteratee, keys, last, lastIndexOf, map, mapObject, matcher, matcher as matches, max, memoize, functions as methods, min, mixin, negate, noop, now, object, omit, once, pairs, partial, partition, pick, pluck, property, propertyOf, random, range, reduce, reduceRight, reject, rest, restArguments, result, sample, filter as select, shuffle, size, some, sortBy, sortedIndex, rest as tail, first as take, tap, template, templateSettings, throttle, times, toArray, toPath, unzip as transpose, _unescape as unescape, union, uniq, uniq as unique, uniqueId, unzip, values, where, without, wrap, zip } from './underscore-node-f.cjs'; +//# sourceMappingURL=underscore-node.mjs.map diff --git a/src/node_modules/underscore/underscore-node.mjs.map b/src/node_modules/underscore/underscore-node.mjs.map new file mode 100644 index 0000000..5d1025b --- /dev/null +++ b/src/node_modules/underscore/underscore-node.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"underscore-node.mjs","sources":[],"sourcesContent":null,"names":[],"mappings":";;;;;"} \ No newline at end of file diff --git a/src/node_modules/underscore/underscore-umd-min.js b/src/node_modules/underscore/underscore-umd-min.js new file mode 100644 index 0000000..66bbe50 --- /dev/null +++ b/src/node_modules/underscore/underscore-umd-min.js @@ -0,0 +1,6 @@ +!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define("underscore",r):(n="undefined"!=typeof globalThis?globalThis:n||self,function(){var t=n._,e=n._=r();e.noConflict=function(){return n._=t,e}}())}(this,(function(){ +// Underscore.js 1.13.4 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. +var n="1.13.4",r="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},t=Array.prototype,e=Object.prototype,u="undefined"!=typeof Symbol?Symbol.prototype:null,o=t.push,i=t.slice,a=e.toString,f=e.hasOwnProperty,c="undefined"!=typeof ArrayBuffer,l="undefined"!=typeof DataView,s=Array.isArray,p=Object.keys,v=Object.create,h=c&&ArrayBuffer.isView,y=isNaN,d=isFinite,g=!{toString:null}.propertyIsEnumerable("toString"),b=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],m=Math.pow(2,53)-1;function j(n,r){return r=null==r?n.length-1:+r,function(){for(var t=Math.max(arguments.length-r,0),e=Array(t),u=0;u=0&&t<=m}}function J(n){return function(r){return null==r?void 0:r[n]}}var G=J("byteLength"),H=K(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:C(!1),Y=J("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e":">",'"':""","'":"'","`":"`"},$n=zn(Ln),Cn=zn(_n(Ln)),Kn=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Jn=/(.)^/,Gn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Hn=/\\|'|\r|\n|\u2028|\u2029/g;function Qn(n){return"\\"+Gn[n]}var Xn=/^\s*(\w|\$)+\s*$/;var Yn=0;function Zn(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var nr=j((function(n,r){var t=nr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a1)er(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var cr=nr(fr,2);function lr(n,r,t){r=Pn(r,t);for(var e,u=nn(n),o=0,i=u.length;o0?0:u-1;o>=0&&o0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),$))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a=3;return r(n,Rn(t,u,4),e,o)}}var wr=_r(1),Ar=_r(-1);function xr(n,r,t){var e=[];return r=Pn(r,t),mr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Sr(n,r,t){r=Pn(r,t);for(var e=!tr(n)&&nn(n),u=(e||n).length,o=0;o=0}var Er=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Bn(r),e=r.slice(0,-1),r=r[r.length-1]),jr(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=Nn(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Br(n,r){return jr(n,Dn(r))}function Nr(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=tr(n)?n:jn(n)).length;ao&&(o=e);else r=Pn(r,t),mr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}var Ir=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function Tr(n){return n?U(n)?i.call(n):S(n)?n.match(Ir):tr(n)?jr(n,Tn):jn(n):[]}function kr(n,r,t){if(null==r||t)return tr(n)||(n=jn(n)),n[Un(n.length-1)];var e=Tr(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i1&&(e=Rn(e,r[1])),r=an(n)):(e=qr,r=er(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u1&&(t=r[1])):(r=jr(er(r,!1,!1),String),e=function(n,t){return!Mr(r,t)}),Ur(n,e,t)}));function zr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function Lr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:zr(n,n.length-r)}function $r(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=er(r,!0,!0),xr(n,(function(n){return!Mr(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=Pn(t,e));for(var u=[],o=[],i=0,a=Y(n);ir?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o,i,a,f=function(){var c=Wn()-u;r>c?e=setTimeout(f,r-c):(e=null,t||(i=n.apply(a,o)),e||(o=a=null))},c=j((function(c){return a=this,o=c,u=Wn(),e||(e=setTimeout(f,r),t&&(i=n.apply(a,o))),i}));return c.cancel=function(){clearTimeout(e),e=o=a=null},c},wrap:function(n,r){return nr(r,n)},negate:ar,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:fr,once:cr,findKey:lr,findIndex:pr,findLastIndex:vr,sortedIndex:hr,indexOf:dr,lastIndexOf:gr,find:br,detect:br,findWhere:function(n,r){return br(n,kn(r))},each:mr,forEach:mr,map:jr,collect:jr,reduce:wr,foldl:wr,inject:wr,reduceRight:Ar,foldr:Ar,filter:xr,select:xr,reject:function(n,r,t){return xr(n,ar(Pn(r)),t)},every:Sr,all:Sr,some:Or,any:Or,contains:Mr,includes:Mr,include:Mr,invoke:Er,pluck:Br,where:function(n,r){return xr(n,kn(r))},max:Nr,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=tr(n)?n:jn(n)).length;ae||void 0===t)return 1;if(t","\"","'","`","_escape","_unescape","templateSettings","evaluate","interpolate","escape","noMatch","escapes","\\","\r","\n","
","
","escapeRegExp","escapeChar","bareIdentifier","idCounter","executeBound","sourceFunc","boundFunc","callingContext","partial","boundArgs","placeholder","bound","position","bind","TypeError","callArgs","isArrayLike","flatten","input","depth","strict","output","idx","j","len","bindAll","Error","delay","wait","setTimeout","defer","negate","predicate","before","times","memo","once","findKey","createPredicateIndexFinder","dir","array","findIndex","findLastIndex","sortedIndex","low","high","mid","createIndexFinder","predicateFind","item","indexOf","lastIndexOf","find","each","results","currentKey","createReduce","reducer","initial","reduce","reduceRight","filter","list","every","some","fromIndex","guard","invoke","contextPath","method","pluck","computed","lastComputed","v","reStrSymbol","toArray","sample","n","last","rand","temp","group","behavior","partition","groupBy","indexBy","countBy","pass","keyInObj","pick","omit","first","difference","without","otherArrays","uniq","isSorted","seen","union","arrays","unzip","zip","chainResult","instance","_chain","chain","mixin","nodeType","parseFloat","pairs","props","interceptor","_has","accum","text","settings","oldSettings","offset","render","argument","variable","e","template","data","fallback","prefix","id","hasher","memoize","cache","address","options","timeout","previous","later","leading","throttled","_now","remaining","clearTimeout","trailing","cancel","immediate","passed","debounced","_args","wrapper","start","criteria","left","right","Boolean","_flatten","argsLength","stop","step","ceil","range","count"],"mappings":"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"} \ No newline at end of file diff --git a/src/node_modules/underscore/underscore-umd.js b/src/node_modules/underscore/underscore-umd.js new file mode 100644 index 0000000..825f710 --- /dev/null +++ b/src/node_modules/underscore/underscore-umd.js @@ -0,0 +1,2042 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define('underscore', factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () { + var current = global._; + var exports = global._ = factory(); + exports.noConflict = function () { global._ = current; return exports; }; + }())); +}(this, (function () { + // Underscore.js 1.13.4 + // https://underscorejs.org + // (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors + // Underscore may be freely distributed under the MIT license. + + // Current version. + var VERSION = '1.13.4'; + + // Establish the root object, `window` (`self`) in the browser, `global` + // on the server, or `this` in some virtual machines. We use `self` + // instead of `window` for `WebWorker` support. + var root = (typeof self == 'object' && self.self === self && self) || + (typeof global == 'object' && global.global === global && global) || + Function('return this')() || + {}; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype; + var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + + // Create quick reference variables for speed access to core prototypes. + var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // Modern feature detection. + var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + + // All **ECMAScript 5+** native function implementations that we hope to use + // are declared here. + var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + + // Create references to these builtin functions because we override them. + var _isNaN = isNaN, + _isFinite = isFinite; + + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + // The largest integer that can be represented exactly. + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + + // Some functions take a variable number of arguments, or a few expected + // arguments at the beginning and then a variable number of values to operate + // on. This helper accumulates all remaining arguments past the function’s + // argument length (or an explicit `startIndex`), into an array that becomes + // the last argument. Similar to ES6’s "rest parameter". + function restArguments(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; + } + + // Is a given variable an object? + function isObject(obj) { + var type = typeof obj; + return type === 'function' || (type === 'object' && !!obj); + } + + // Is a given value equal to null? + function isNull(obj) { + return obj === null; + } + + // Is a given variable undefined? + function isUndefined(obj) { + return obj === void 0; + } + + // Is a given value a boolean? + function isBoolean(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; + } + + // Is a given value a DOM element? + function isElement(obj) { + return !!(obj && obj.nodeType === 1); + } + + // Internal function for creating a `toString`-based type tester. + function tagTester(name) { + var tag = '[object ' + name + ']'; + return function(obj) { + return toString.call(obj) === tag; + }; + } + + var isString = tagTester('String'); + + var isNumber = tagTester('Number'); + + var isDate = tagTester('Date'); + + var isRegExp = tagTester('RegExp'); + + var isError = tagTester('Error'); + + var isSymbol = tagTester('Symbol'); + + var isArrayBuffer = tagTester('ArrayBuffer'); + + var isFunction = tagTester('Function'); + + // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old + // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). + var nodelist = root.document && root.document.childNodes; + if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + isFunction = function(obj) { + return typeof obj == 'function' || false; + }; + } + + var isFunction$1 = isFunction; + + var hasObjectTag = tagTester('Object'); + + // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. + // In IE 11, the most common among them, this problem also applies to + // `Map`, `WeakMap` and `Set`. + var hasStringTagBug = ( + supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8))) + ), + isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map)); + + var isDataView = tagTester('DataView'); + + // In IE 10 - Edge 13, we need a different heuristic + // to determine whether an object is a `DataView`. + function ie10IsDataView(obj) { + return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer); + } + + var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView); + + // Is a given value an array? + // Delegates to ECMA5's native `Array.isArray`. + var isArray = nativeIsArray || tagTester('Array'); + + // Internal function to check whether `key` is an own property name of `obj`. + function has$1(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); + } + + var isArguments = tagTester('Arguments'); + + // Define a fallback version of the method in browsers (ahem, IE < 9), where + // there isn't any inspectable "Arguments" type. + (function() { + if (!isArguments(arguments)) { + isArguments = function(obj) { + return has$1(obj, 'callee'); + }; + } + }()); + + var isArguments$1 = isArguments; + + // Is a given object a finite number? + function isFinite$1(obj) { + return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj)); + } + + // Is the given value `NaN`? + function isNaN$1(obj) { + return isNumber(obj) && _isNaN(obj); + } + + // Predicate-generating function. Often useful outside of Underscore. + function constant(value) { + return function() { + return value; + }; + } + + // Common internal logic for `isArrayLike` and `isBufferLike`. + function createSizePropertyCheck(getSizeProperty) { + return function(collection) { + var sizeProperty = getSizeProperty(collection); + return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX; + } + } + + // Internal helper to generate a function to obtain property `key` from `obj`. + function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + } + + // Internal helper to obtain the `byteLength` property of an object. + var getByteLength = shallowProperty('byteLength'); + + // Internal helper to determine whether we should spend extensive checks against + // `ArrayBuffer` et al. + var isBufferLike = createSizePropertyCheck(getByteLength); + + // Is a given value a typed array? + var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; + function isTypedArray(obj) { + // `ArrayBuffer.isView` is the most future-proof, so use it when available. + // Otherwise, fall back on the above regular expression. + return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) : + isBufferLike(obj) && typedArrayPattern.test(toString.call(obj)); + } + + var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false); + + // Internal helper to obtain the `length` property of an object. + var getLength = shallowProperty('length'); + + // Internal helper to create a simple lookup structure. + // `collectNonEnumProps` used to depend on `_.contains`, but this led to + // circular imports. `emulatedSet` is a one-off solution that only works for + // arrays of strings. + function emulatedSet(keys) { + var hash = {}; + for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; + return { + contains: function(key) { return hash[key] === true; }, + push: function(key) { + hash[key] = true; + return keys.push(key); + } + }; + } + + // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't + // be iterated by `for key in ...` and thus missed. Extends `keys` in place if + // needed. + function collectNonEnumProps(obj, keys) { + keys = emulatedSet(keys); + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (isFunction$1(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { + keys.push(prop); + } + } + } + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys`. + function keys(obj) { + if (!isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (has$1(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + } + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + function isEmpty(obj) { + if (obj == null) return true; + // Skip the more expensive `toString`-based type checks if `obj` has no + // `.length`. + var length = getLength(obj); + if (typeof length == 'number' && ( + isArray(obj) || isString(obj) || isArguments$1(obj) + )) return length === 0; + return getLength(keys(obj)) === 0; + } + + // Returns whether an object has a given set of `key:value` pairs. + function isMatch(object, attrs) { + var _keys = keys(attrs), length = _keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = _keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + } + + // If Underscore is called as a function, it returns a wrapped object that can + // be used OO-style. This wrapper holds altered versions of all functions added + // through `_.mixin`. Wrapped objects may be chained. + function _$1(obj) { + if (obj instanceof _$1) return obj; + if (!(this instanceof _$1)) return new _$1(obj); + this._wrapped = obj; + } + + _$1.VERSION = VERSION; + + // Extracts the result from a wrapped and chained object. + _$1.prototype.value = function() { + return this._wrapped; + }; + + // Provide unwrapping proxies for some methods used in engine operations + // such as arithmetic and JSON stringification. + _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value; + + _$1.prototype.toString = function() { + return String(this._wrapped); + }; + + // Internal function to wrap or shallow-copy an ArrayBuffer, + // typed array or DataView to a new view, reusing the buffer. + function toBufferView(bufferSource) { + return new Uint8Array( + bufferSource.buffer || bufferSource, + bufferSource.byteOffset || 0, + getByteLength(bufferSource) + ); + } + + // We use this string twice, so give it a name for minification. + var tagDataView = '[object DataView]'; + + // Internal recursive comparison function for `_.isEqual`. + function eq(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); + } + + // Internal recursive comparison function for `_.isEqual`. + function deepEq(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof _$1) a = a._wrapped; + if (b instanceof _$1) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + // Work around a bug in IE 10 - Edge 13. + if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) { + if (!isDataView$1(b)) return false; + className = tagDataView; + } + switch (className) { + // These types are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); + case '[object ArrayBuffer]': + case tagDataView: + // Coerce to typed array so we can fall through. + return deepEq(toBufferView(a), toBufferView(b), aStack, bStack); + } + + var areArrays = className === '[object Array]'; + if (!areArrays && isTypedArray$1(a)) { + var byteLength = getByteLength(a); + if (byteLength !== getByteLength(b)) return false; + if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; + areArrays = true; + } + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor && + isFunction$1(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var _keys = keys(a), key; + length = _keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = _keys[length]; + if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; + } + + // Perform a deep comparison to check if two objects are equal. + function isEqual(a, b) { + return eq(a, b); + } + + // Retrieve all the enumerable property names of an object. + function allKeys(obj) { + if (!isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + } + + // Since the regular `Object.prototype.toString` type tests don't work for + // some types in IE 11, we use a fingerprinting heuristic instead, based + // on the methods. It's not great, but it's the best we got. + // The fingerprint method lists are defined below. + function ie11fingerprint(methods) { + var length = getLength(methods); + return function(obj) { + if (obj == null) return false; + // `Map`, `WeakMap` and `Set` have no enumerable keys. + var keys = allKeys(obj); + if (getLength(keys)) return false; + for (var i = 0; i < length; i++) { + if (!isFunction$1(obj[methods[i]])) return false; + } + // If we are testing against `WeakMap`, we need to ensure that + // `obj` doesn't have a `forEach` method in order to distinguish + // it from a regular `Map`. + return methods !== weakMapMethods || !isFunction$1(obj[forEachName]); + }; + } + + // In the interest of compact minification, we write + // each string in the fingerprints only once. + var forEachName = 'forEach', + hasName = 'has', + commonInit = ['clear', 'delete'], + mapTail = ['get', hasName, 'set']; + + // `Map`, `WeakMap` and `Set` each have slightly different + // combinations of the above sublists. + var mapMethods = commonInit.concat(forEachName, mapTail), + weakMapMethods = commonInit.concat(mapTail), + setMethods = ['add'].concat(commonInit, forEachName, hasName); + + var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map'); + + var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap'); + + var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set'); + + var isWeakSet = tagTester('WeakSet'); + + // Retrieve the values of an object's properties. + function values(obj) { + var _keys = keys(obj); + var length = _keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[_keys[i]]; + } + return values; + } + + // Convert an object into a list of `[key, value]` pairs. + // The opposite of `_.object` with one argument. + function pairs(obj) { + var _keys = keys(obj); + var length = _keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [_keys[i], obj[_keys[i]]]; + } + return pairs; + } + + // Invert the keys and values of an object. The values must be serializable. + function invert(obj) { + var result = {}; + var _keys = keys(obj); + for (var i = 0, length = _keys.length; i < length; i++) { + result[obj[_keys[i]]] = _keys[i]; + } + return result; + } + + // Return a sorted list of the function names available on the object. + function functions(obj) { + var names = []; + for (var key in obj) { + if (isFunction$1(obj[key])) names.push(key); + } + return names.sort(); + } + + // An internal function for creating assigner functions. + function createAssigner(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + } + + // Extend a given object with all the properties in passed-in object(s). + var extend = createAssigner(allKeys); + + // Assigns a given object with all the own properties in the passed-in + // object(s). + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + var extendOwn = createAssigner(keys); + + // Fill in a given object with default properties. + var defaults = createAssigner(allKeys, true); + + // Create a naked function reference for surrogate-prototype-swapping. + function ctor() { + return function(){}; + } + + // An internal function for creating a new object that inherits from another. + function baseCreate(prototype) { + if (!isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + var Ctor = ctor(); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + } + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + function create(prototype, props) { + var result = baseCreate(prototype); + if (props) extendOwn(result, props); + return result; + } + + // Create a (shallow-cloned) duplicate of an object. + function clone(obj) { + if (!isObject(obj)) return obj; + return isArray(obj) ? obj.slice() : extend({}, obj); + } + + // Invokes `interceptor` with the `obj` and then returns `obj`. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + function tap(obj, interceptor) { + interceptor(obj); + return obj; + } + + // Normalize a (deep) property `path` to array. + // Like `_.iteratee`, this function can be customized. + function toPath$1(path) { + return isArray(path) ? path : [path]; + } + _$1.toPath = toPath$1; + + // Internal wrapper for `_.toPath` to enable minification. + // Similar to `cb` for `_.iteratee`. + function toPath(path) { + return _$1.toPath(path); + } + + // Internal function to obtain a nested property in `obj` along `path`. + function deepGet(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; + } + + // Get the value of the (deep) property on `path` from `object`. + // If any property in `path` does not exist or if the value is + // `undefined`, return `defaultValue` instead. + // The `path` is normalized through `_.toPath`. + function get(object, path, defaultValue) { + var value = deepGet(object, toPath(path)); + return isUndefined(value) ? defaultValue : value; + } + + // Shortcut function for checking if an object has a given property directly on + // itself (in other words, not on a prototype). Unlike the internal `has` + // function, this public version can also traverse nested properties. + function has(obj, path) { + path = toPath(path); + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (!has$1(obj, key)) return false; + obj = obj[key]; + } + return !!length; + } + + // Keep the identity function around for default iteratees. + function identity(value) { + return value; + } + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + function matcher(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; + } + + // Creates a function that, when passed an object, will traverse that object’s + // properties down the given `path`, specified as an array of keys or indices. + function property(path) { + path = toPath(path); + return function(obj) { + return deepGet(obj, path); + }; + } + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + function optimizeCb(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + } + + // An internal function to generate callbacks that can be applied to each + // element in a collection, returning the desired result — either `_.identity`, + // an arbitrary callback, a property matcher, or a property accessor. + function baseIteratee(value, context, argCount) { + if (value == null) return identity; + if (isFunction$1(value)) return optimizeCb(value, context, argCount); + if (isObject(value) && !isArray(value)) return matcher(value); + return property(value); + } + + // External wrapper for our callback generator. Users may customize + // `_.iteratee` if they want additional predicate/iteratee shorthand styles. + // This abstraction hides the internal-only `argCount` argument. + function iteratee(value, context) { + return baseIteratee(value, context, Infinity); + } + _$1.iteratee = iteratee; + + // The function we call internally to generate a callback. It invokes + // `_.iteratee` if overridden, otherwise `baseIteratee`. + function cb(value, context, argCount) { + if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context); + return baseIteratee(value, context, argCount); + } + + // Returns the results of applying the `iteratee` to each element of `obj`. + // In contrast to `_.map` it returns an object. + function mapObject(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = keys(obj), + length = _keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = _keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + } + + // Predicate-generating function. Often useful outside of Underscore. + function noop(){} + + // Generates a function for a given object that returns a given property. + function propertyOf(obj) { + if (obj == null) return noop; + return function(path) { + return get(obj, path); + }; + } + + // Run a function **n** times. + function times(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; + } + + // Return a random integer between `min` and `max` (inclusive). + function random(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + } + + // A (possibly faster) way to get the current timestamp as an integer. + var now = Date.now || function() { + return new Date().getTime(); + }; + + // Internal helper to generate functions for escaping and unescaping strings + // to/from HTML interpolation. + function createEscaper(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + } + + // Internal list of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + + // Function for escaping strings to HTML interpolation. + var _escape = createEscaper(escapeMap); + + // Internal list of HTML entities for unescaping. + var unescapeMap = invert(escapeMap); + + // Function for unescaping strings from HTML interpolation. + var _unescape = createEscaper(unescapeMap); + + // By default, Underscore uses ERB-style template delimiters. Change the + // following template settings to use alternative delimiters. + var templateSettings = _$1.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g + }; + + // When customizing `_.templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + + function escapeChar(match) { + return '\\' + escapes[match]; + } + + // In order to prevent third-party code injection through + // `_.templateSettings.variable`, we test it against the following regular + // expression. It is intentionally a bit more liberal than just matching valid + // identifiers, but still prevents possible loopholes through defaults or + // destructuring assignment. + var bareIdentifier = /^\s*(\w|\$)+\s*$/; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + // NB: `oldSettings` only exists for backwards compatibility. + function template(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = defaults({}, settings, _$1.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(argument, '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _$1); + }; + + // Provide the compiled source as a convenience for precompilation. + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; + } + + // Traverses the children of `obj` along `path`. If a child is a function, it + // is invoked with its parent as context. Returns the value of the final + // child, or `fallback` if any child is undefined. + function result(obj, path, fallback) { + path = toPath(path); + var length = path.length; + if (!length) { + return isFunction$1(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = isFunction$1(prop) ? prop.call(obj) : prop; + } + return obj; + } + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + } + + // Start chaining a wrapped Underscore object. + function chain(obj) { + var instance = _$1(obj); + instance._chain = true; + return instance; + } + + // Internal function to execute `sourceFunc` bound to `context` with optional + // `args`. Determines whether to execute a function as a constructor or as a + // normal function. + function executeBound(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (isObject(result)) return result; + return self; + } + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. `_` acts + // as a placeholder by default, allowing any combination of arguments to be + // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. + var partial = restArguments(function(func, boundArgs) { + var placeholder = partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; + }); + + partial.placeholder = _$1; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). + var bind = restArguments(function(func, context, args) { + if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; + }); + + // Internal helper for collection methods to determine whether a collection + // should be iterated as an array or as an object. + // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var isArrayLike = createSizePropertyCheck(getLength); + + // Internal implementation of a recursive `flatten` function. + function flatten$1(input, depth, strict, output) { + output = output || []; + if (!depth && depth !== 0) { + depth = Infinity; + } else if (depth <= 0) { + return output.concat(input); + } + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) { + // Flatten current level of array or arguments object. + if (depth > 1) { + flatten$1(value, depth - 1, strict, output); + idx = output.length; + } else { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; + } + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + var bindAll = restArguments(function(obj, keys) { + keys = flatten$1(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = bind(obj[key], obj); + } + return obj; + }); + + // Memoize an expensive function by storing its results. + function memoize(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!has$1(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; + } + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + var delay = restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); + }); + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + var defer = partial(delay, _$1, 1); + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var _now = now(); + if (!previous && options.leading === false) previous = _now; + var remaining = wait - (_now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = _now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; + } + + // When a sequence of calls of the returned function ends, the argument + // function is triggered. The end of a sequence is defined by the `wait` + // parameter. If `immediate` is passed, the argument function will be + // triggered at the beginning of the sequence instead of at the end. + function debounce(func, wait, immediate) { + var timeout, previous, args, result, context; + + var later = function() { + var passed = now() - previous; + if (wait > passed) { + timeout = setTimeout(later, wait - passed); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + // This check is needed because `func` can recursively invoke `debounced`. + if (!timeout) args = context = null; + } + }; + + var debounced = restArguments(function(_args) { + context = this; + args = _args; + previous = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + if (immediate) result = func.apply(context, args); + } + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = args = context = null; + }; + + return debounced; + } + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + function wrap(func, wrapper) { + return partial(wrapper, func); + } + + // Returns a negated version of the passed-in predicate. + function negate(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; + } + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + function compose() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; + } + + // Returns a function that will only be executed on and after the Nth call. + function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + } + + // Returns a function that will only be executed up to (but not including) the + // Nth call. + function before(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + } + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + var once = partial(before, 2); + + // Returns the first key on an object that passes a truth test. + function findKey(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = keys(obj), key; + for (var i = 0, length = _keys.length; i < length; i++) { + key = _keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + } + + // Internal function to generate `_.findIndex` and `_.findLastIndex`. + function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; + } + + // Returns the first index on an array-like that passes a truth test. + var findIndex = createPredicateIndexFinder(1); + + // Returns the last index on an array-like that passes a truth test. + var findLastIndex = createPredicateIndexFinder(-1); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + function sortedIndex(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; + } + + // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. + function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), isNaN$1); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + } + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + var indexOf = createIndexFinder(1, findIndex, sortedIndex); + + // Return the position of the last occurrence of an item in an array, + // or -1 if the item is not included in the array. + var lastIndexOf = createIndexFinder(-1, findLastIndex); + + // Return the first value which passes a truth test. + function find(obj, predicate, context) { + var keyFinder = isArrayLike(obj) ? findIndex : findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; + } + + // Convenience version of a common use case of `_.find`: getting the first + // object containing specific `key:value` pairs. + function findWhere(obj, attrs) { + return find(obj, matcher(attrs)); + } + + // The cornerstone for collection functions, an `each` + // implementation, aka `forEach`. + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + function each(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + for (i = 0, length = _keys.length; i < length; i++) { + iteratee(obj[_keys[i]], _keys[i], obj); + } + } + return obj; + } + + // Return the results of applying the iteratee to each element. + function map(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + } + + // Internal helper to create a reducing function, iterating left or right. + function createReduce(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[_keys ? _keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = _keys ? _keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); + }; + } + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. + var reduce = createReduce(1); + + // The right-associative version of reduce, also known as `foldr`. + var reduceRight = createReduce(-1); + + // Return all the elements that pass a truth test. + function filter(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; + } + + // Return all the elements for which a truth test fails. + function reject(obj, predicate, context) { + return filter(obj, negate(cb(predicate)), context); + } + + // Determine whether all of the elements pass a truth test. + function every(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + } + + // Determine if at least one element in the object passes a truth test. + function some(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; + } + + // Determine if the array or object contains a given item (using `===`). + function contains(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return indexOf(obj, item, fromIndex) >= 0; + } + + // Invoke a method (with arguments) on every item in a collection. + var invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (isFunction$1(path)) { + func = path; + } else { + path = toPath(path); + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); + }); + + // Convenience version of a common use case of `_.map`: fetching a property. + function pluck(obj, key) { + return map(obj, property(key)); + } + + // Convenience version of a common use case of `_.filter`: selecting only + // objects containing specific `key:value` pairs. + function where(obj, attrs) { + return filter(obj, matcher(attrs)); + } + + // Return the maximum element (or element-based computation). + function max(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; + } + + // Return the minimum element (or element-based computation). + function min(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || (computed === Infinity && result === Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; + } + + // Safely create a real, live array from anything iterable. + var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; + function toArray(obj) { + if (!obj) return []; + if (isArray(obj)) return slice.call(obj); + if (isString(obj)) { + // Keep surrogate pair characters together. + return obj.match(reStrSymbol); + } + if (isArrayLike(obj)) return map(obj, identity); + return values(obj); + } + + // Sample **n** random values from a collection using the modern version of the + // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `_.map`. + function sample(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = values(obj); + return obj[random(obj.length - 1)]; + } + var sample = toArray(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); + } + + // Shuffle a collection. + function shuffle(obj) { + return sample(obj, Infinity); + } + + // Sort the object's values by a criterion produced by an iteratee. + function sortBy(obj, iteratee, context) { + var index = 0; + iteratee = cb(iteratee, context); + return pluck(map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + } + + // An internal function used for aggregate "group by" operations. + function group(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = cb(iteratee, context); + each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; + } + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + var groupBy = group(function(result, value, key) { + if (has$1(result, key)) result[key].push(value); else result[key] = [value]; + }); + + // Indexes the object's values by a criterion, similar to `_.groupBy`, but for + // when you know that your index values will be unique. + var indexBy = group(function(result, value, key) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + var countBy = group(function(result, value, key) { + if (has$1(result, key)) result[key]++; else result[key] = 1; + }); + + // Split a collection into two arrays: one whose elements all pass the given + // truth test, and one whose elements all do not pass the truth test. + var partition = group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); + }, true); + + // Return the number of elements in a collection. + function size(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : keys(obj).length; + } + + // Internal `_.pick` helper function to determine whether `key` is an enumerable + // property name of `obj`. + function keyInObj(value, key, obj) { + return key in obj; + } + + // Return a copy of the object only containing the allowed properties. + var pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (isFunction$1(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); + keys = allKeys(obj); + } else { + iteratee = keyInObj; + keys = flatten$1(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }); + + // Return a copy of the object without the disallowed properties. + var omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (isFunction$1(iteratee)) { + iteratee = negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = map(flatten$1(keys, false, false), String); + iteratee = function(value, key) { + return !contains(keys, key); + }; + } + return pick(obj, iteratee, context); + }); + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. + function initial(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); + } + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. The **guard** check allows it to work with `_.map`. + function first(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[0]; + return initial(array, array.length - n); + } + + // Returns everything but the first entry of the `array`. Especially useful on + // the `arguments` object. Passing an **n** will return the rest N values in the + // `array`. + function rest(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); + } + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. + function last(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return rest(array, Math.max(0, array.length - n)); + } + + // Trim out all falsy values from an array. + function compact(array) { + return filter(array, Boolean); + } + + // Flatten out an array, either recursively (by default), or up to `depth`. + // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. + function flatten(array, depth) { + return flatten$1(array, depth, false); + } + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + var difference = restArguments(function(array, rest) { + rest = flatten$1(rest, true, true); + return filter(array, function(value){ + return !contains(rest, value); + }); + }); + + // Return a version of the array that does not contain the specified value(s). + var without = restArguments(function(array, otherArrays) { + return difference(array, otherArrays); + }); + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // The faster algorithm will not work with an iteratee if the iteratee + // is not a one-to-one function, so providing an iteratee will disable + // the faster algorithm. + function uniq(array, isSorted, iteratee, context) { + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!contains(result, value)) { + result.push(value); + } + } + return result; + } + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + var union = restArguments(function(arrays) { + return uniq(flatten$1(arrays, true, true)); + }); + + // Produce an array that contains every item shared between all the + // passed-in arrays. + function intersection(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; + } + + // Complement of zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices. + function unzip(array) { + var length = (array && max(array, getLength).length) || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = pluck(array, index); + } + return result; + } + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + var zip = restArguments(unzip); + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. Passing by pairs is the reverse of `_.pairs`. + function object(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + } + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](https://docs.python.org/library/functions.html#range). + function range(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; + } + + // Chunk a single array into multiple arrays, each containing `count` or fewer + // items. + function chunk(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; + } + + // Helper function to continue chaining intermediate results. + function chainResult(instance, obj) { + return instance._chain ? _$1(obj).chain() : obj; + } + + // Add your own custom functions to the Underscore object. + function mixin(obj) { + each(functions(obj), function(name) { + var func = _$1[name] = obj[name]; + _$1.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return chainResult(this, func.apply(_$1, args)); + }; + }); + return _$1; + } + + // Add all mutator `Array` functions to the wrapper. + each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) { + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) { + delete obj[0]; + } + } + return chainResult(this, obj); + }; + }); + + // Add all accessor `Array` functions to the wrapper. + each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) obj = method.apply(obj, arguments); + return chainResult(this, obj); + }; + }); + + // Named Exports + + var allExports = { + __proto__: null, + VERSION: VERSION, + restArguments: restArguments, + isObject: isObject, + isNull: isNull, + isUndefined: isUndefined, + isBoolean: isBoolean, + isElement: isElement, + isString: isString, + isNumber: isNumber, + isDate: isDate, + isRegExp: isRegExp, + isError: isError, + isSymbol: isSymbol, + isArrayBuffer: isArrayBuffer, + isDataView: isDataView$1, + isArray: isArray, + isFunction: isFunction$1, + isArguments: isArguments$1, + isFinite: isFinite$1, + isNaN: isNaN$1, + isTypedArray: isTypedArray$1, + isEmpty: isEmpty, + isMatch: isMatch, + isEqual: isEqual, + isMap: isMap, + isWeakMap: isWeakMap, + isSet: isSet, + isWeakSet: isWeakSet, + keys: keys, + allKeys: allKeys, + values: values, + pairs: pairs, + invert: invert, + functions: functions, + methods: functions, + extend: extend, + extendOwn: extendOwn, + assign: extendOwn, + defaults: defaults, + create: create, + clone: clone, + tap: tap, + get: get, + has: has, + mapObject: mapObject, + identity: identity, + constant: constant, + noop: noop, + toPath: toPath$1, + property: property, + propertyOf: propertyOf, + matcher: matcher, + matches: matcher, + times: times, + random: random, + now: now, + escape: _escape, + unescape: _unescape, + templateSettings: templateSettings, + template: template, + result: result, + uniqueId: uniqueId, + chain: chain, + iteratee: iteratee, + partial: partial, + bind: bind, + bindAll: bindAll, + memoize: memoize, + delay: delay, + defer: defer, + throttle: throttle, + debounce: debounce, + wrap: wrap, + negate: negate, + compose: compose, + after: after, + before: before, + once: once, + findKey: findKey, + findIndex: findIndex, + findLastIndex: findLastIndex, + sortedIndex: sortedIndex, + indexOf: indexOf, + lastIndexOf: lastIndexOf, + find: find, + detect: find, + findWhere: findWhere, + each: each, + forEach: each, + map: map, + collect: map, + reduce: reduce, + foldl: reduce, + inject: reduce, + reduceRight: reduceRight, + foldr: reduceRight, + filter: filter, + select: filter, + reject: reject, + every: every, + all: every, + some: some, + any: some, + contains: contains, + includes: contains, + include: contains, + invoke: invoke, + pluck: pluck, + where: where, + max: max, + min: min, + shuffle: shuffle, + sample: sample, + sortBy: sortBy, + groupBy: groupBy, + indexBy: indexBy, + countBy: countBy, + partition: partition, + toArray: toArray, + size: size, + pick: pick, + omit: omit, + first: first, + head: first, + take: first, + initial: initial, + last: last, + rest: rest, + tail: rest, + drop: rest, + compact: compact, + flatten: flatten, + without: without, + uniq: uniq, + unique: uniq, + union: union, + intersection: intersection, + difference: difference, + unzip: unzip, + transpose: unzip, + zip: zip, + object: object, + range: range, + chunk: chunk, + mixin: mixin, + 'default': _$1 + }; + + // Default Export + + // Add all of the Underscore functions to the wrapper object. + var _ = mixin(allExports); + // Legacy Node.js API. + _._ = _; + + return _; + +}))); +//# sourceMappingURL=underscore-umd.js.map diff --git a/src/node_modules/underscore/underscore-umd.js.map b/src/node_modules/underscore/underscore-umd.js.map new file mode 100644 index 0000000..d725292 --- /dev/null +++ b/src/node_modules/underscore/underscore-umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"underscore-umd.js","sources":["modules/_setup.js","modules/restArguments.js","modules/isObject.js","modules/isNull.js","modules/isUndefined.js","modules/isBoolean.js","modules/isElement.js","modules/_tagTester.js","modules/isString.js","modules/isNumber.js","modules/isDate.js","modules/isRegExp.js","modules/isError.js","modules/isSymbol.js","modules/isArrayBuffer.js","modules/isFunction.js","modules/_hasObjectTag.js","modules/_stringTagBug.js","modules/isDataView.js","modules/isArray.js","modules/_has.js","modules/isArguments.js","modules/isFinite.js","modules/isNaN.js","modules/constant.js","modules/_createSizePropertyCheck.js","modules/_shallowProperty.js","modules/_getByteLength.js","modules/_isBufferLike.js","modules/isTypedArray.js","modules/_getLength.js","modules/_collectNonEnumProps.js","modules/keys.js","modules/isEmpty.js","modules/isMatch.js","modules/underscore.js","modules/_toBufferView.js","modules/isEqual.js","modules/allKeys.js","modules/_methodFingerprint.js","modules/isMap.js","modules/isWeakMap.js","modules/isSet.js","modules/isWeakSet.js","modules/values.js","modules/pairs.js","modules/invert.js","modules/functions.js","modules/_createAssigner.js","modules/extend.js","modules/extendOwn.js","modules/defaults.js","modules/_baseCreate.js","modules/create.js","modules/clone.js","modules/tap.js","modules/toPath.js","modules/_toPath.js","modules/_deepGet.js","modules/get.js","modules/has.js","modules/identity.js","modules/matcher.js","modules/property.js","modules/_optimizeCb.js","modules/_baseIteratee.js","modules/iteratee.js","modules/_cb.js","modules/mapObject.js","modules/noop.js","modules/propertyOf.js","modules/times.js","modules/random.js","modules/now.js","modules/_createEscaper.js","modules/_escapeMap.js","modules/escape.js","modules/_unescapeMap.js","modules/unescape.js","modules/templateSettings.js","modules/template.js","modules/result.js","modules/uniqueId.js","modules/chain.js","modules/_executeBound.js","modules/partial.js","modules/bind.js","modules/_isArrayLike.js","modules/_flatten.js","modules/bindAll.js","modules/memoize.js","modules/delay.js","modules/defer.js","modules/throttle.js","modules/debounce.js","modules/wrap.js","modules/negate.js","modules/compose.js","modules/after.js","modules/before.js","modules/once.js","modules/findKey.js","modules/_createPredicateIndexFinder.js","modules/findIndex.js","modules/findLastIndex.js","modules/sortedIndex.js","modules/_createIndexFinder.js","modules/indexOf.js","modules/lastIndexOf.js","modules/find.js","modules/findWhere.js","modules/each.js","modules/map.js","modules/_createReduce.js","modules/reduce.js","modules/reduceRight.js","modules/filter.js","modules/reject.js","modules/every.js","modules/some.js","modules/contains.js","modules/invoke.js","modules/pluck.js","modules/where.js","modules/max.js","modules/min.js","modules/toArray.js","modules/sample.js","modules/shuffle.js","modules/sortBy.js","modules/_group.js","modules/groupBy.js","modules/indexBy.js","modules/countBy.js","modules/partition.js","modules/size.js","modules/_keyInObj.js","modules/pick.js","modules/omit.js","modules/initial.js","modules/first.js","modules/rest.js","modules/last.js","modules/compact.js","modules/flatten.js","modules/difference.js","modules/without.js","modules/uniq.js","modules/union.js","modules/intersection.js","modules/unzip.js","modules/zip.js","modules/object.js","modules/range.js","modules/chunk.js","modules/_chainResult.js","modules/mixin.js","modules/underscore-array-methods.js","modules/index.js","modules/index-default.js"],"sourcesContent":null,"names":["isFunction","has","isFinite","isNaN","isDataView","isArguments","_","isTypedArray","toPath","_has","flatten","_flatten"],"mappings":";;;;;;;;;;;;;;EAAA;EACO,IAAI,OAAO,GAAG,QAAQ,CAAC;AAC9B;EACA;EACA;EACA;EACO,IAAI,IAAI,GAAG,CAAC,OAAO,IAAI,IAAI,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI;EACxE,WAAW,OAAO,MAAM,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC;EAC3E,UAAU,QAAQ,CAAC,aAAa,CAAC,EAAE;EACnC,UAAU,EAAE,CAAC;AACb;EACA;EACO,IAAI,UAAU,GAAG,KAAK,CAAC,SAAS,EAAE,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;EAC9D,IAAI,WAAW,GAAG,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;AACjF;EACA;EACO,IAAI,IAAI,GAAG,UAAU,CAAC,IAAI;EACjC,IAAI,KAAK,GAAG,UAAU,CAAC,KAAK;EAC5B,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ;EAChC,IAAI,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;AAC7C;EACA;EACO,IAAI,mBAAmB,GAAG,OAAO,WAAW,KAAK,WAAW;EACnE,IAAI,gBAAgB,GAAG,OAAO,QAAQ,KAAK,WAAW,CAAC;AACvD;EACA;EACA;EACO,IAAI,aAAa,GAAG,KAAK,CAAC,OAAO;EACxC,IAAI,UAAU,GAAG,MAAM,CAAC,IAAI;EAC5B,IAAI,YAAY,GAAG,MAAM,CAAC,MAAM;EAChC,IAAI,YAAY,GAAG,mBAAmB,IAAI,WAAW,CAAC,MAAM,CAAC;AAC7D;EACA;EACO,IAAI,MAAM,GAAG,KAAK;EACzB,IAAI,SAAS,GAAG,QAAQ,CAAC;AACzB;EACA;EACO,IAAI,UAAU,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;EACpE,IAAI,kBAAkB,GAAG,CAAC,SAAS,EAAE,eAAe,EAAE,UAAU;EACvE,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;AAC9D;EACA;EACO,IAAI,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;;EC1ChD;EACA;EACA;EACA;EACA;EACe,SAAS,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE;EACxD,EAAE,UAAU,GAAG,UAAU,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC;EAClE,EAAE,OAAO,WAAW;EACpB,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC,CAAC;EAC3D,QAAQ,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;EAC5B,QAAQ,KAAK,GAAG,CAAC,CAAC;EAClB,IAAI,OAAO,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;EACpC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC;EAClD,KAAK;EACL,IAAI,QAAQ,UAAU;EACtB,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;EAC3C,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;EACzD,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;EACvE,KAAK;EACL,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;EACrC,IAAI,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,EAAE,KAAK,EAAE,EAAE;EACjD,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;EACrC,KAAK;EACL,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;EAC5B,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;EAClC,GAAG,CAAC;EACJ;;EC1BA;EACe,SAAS,QAAQ,CAAC,GAAG,EAAE;EACtC,EAAE,IAAI,IAAI,GAAG,OAAO,GAAG,CAAC;EACxB,EAAE,OAAO,IAAI,KAAK,UAAU,KAAK,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;EAC7D;;ECJA;EACe,SAAS,MAAM,CAAC,GAAG,EAAE;EACpC,EAAE,OAAO,GAAG,KAAK,IAAI,CAAC;EACtB;;ECHA;EACe,SAAS,WAAW,CAAC,GAAG,EAAE;EACzC,EAAE,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC;EACxB;;ECDA;EACe,SAAS,SAAS,CAAC,GAAG,EAAE;EACvC,EAAE,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,kBAAkB,CAAC;EACpF;;ECLA;EACe,SAAS,SAAS,CAAC,GAAG,EAAE;EACvC,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;EACvC;;ECDA;EACe,SAAS,SAAS,CAAC,IAAI,EAAE;EACxC,EAAE,IAAI,GAAG,GAAG,UAAU,GAAG,IAAI,GAAG,GAAG,CAAC;EACpC,EAAE,OAAO,SAAS,GAAG,EAAE;EACvB,IAAI,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;EACtC,GAAG,CAAC;EACJ;;ACNA,iBAAe,SAAS,CAAC,QAAQ,CAAC;;ACAlC,iBAAe,SAAS,CAAC,QAAQ,CAAC;;ACAlC,eAAe,SAAS,CAAC,MAAM,CAAC;;ACAhC,iBAAe,SAAS,CAAC,QAAQ,CAAC;;ACAlC,gBAAe,SAAS,CAAC,OAAO,CAAC;;ACAjC,iBAAe,SAAS,CAAC,QAAQ,CAAC;;ACAlC,sBAAe,SAAS,CAAC,aAAa,CAAC;;ECCvC,IAAI,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;AACvC;EACA;EACA;EACA,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;EACzD,IAAI,OAAO,GAAG,IAAI,UAAU,IAAI,OAAO,SAAS,IAAI,QAAQ,IAAI,OAAO,QAAQ,IAAI,UAAU,EAAE;EAC/F,EAAE,UAAU,GAAG,SAAS,GAAG,EAAE;EAC7B,IAAI,OAAO,OAAO,GAAG,IAAI,UAAU,IAAI,KAAK,CAAC;EAC7C,GAAG,CAAC;EACJ,CAAC;AACD;AACA,qBAAe,UAAU;;ACZzB,qBAAe,SAAS,CAAC,QAAQ,CAAC;;ECClC;EACA;EACA;EACO,IAAI,eAAe;EAC1B,MAAM,gBAAgB,IAAI,YAAY,CAAC,IAAI,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;EACxE,KAAK;EACL,IAAI,MAAM,IAAI,OAAO,GAAG,KAAK,WAAW,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC;;ECJlE,IAAI,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;AACvC;EACA;EACA;EACA,SAAS,cAAc,CAAC,GAAG,EAAE;EAC7B,EAAE,OAAO,GAAG,IAAI,IAAI,IAAIA,YAAU,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;EAC7E,CAAC;AACD;AACA,qBAAe,CAAC,eAAe,GAAG,cAAc,GAAG,UAAU;;ECV7D;EACA;AACA,gBAAe,aAAa,IAAI,SAAS,CAAC,OAAO,CAAC;;ECHlD;EACe,SAASC,KAAG,CAAC,GAAG,EAAE,GAAG,EAAE;EACtC,EAAE,OAAO,GAAG,IAAI,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;EACtD;;ECFA,IAAI,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;AACzC;EACA;EACA;EACA,CAAC,WAAW;EACZ,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;EAC/B,IAAI,WAAW,GAAG,SAAS,GAAG,EAAE;EAChC,MAAM,OAAOA,KAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;EAChC,KAAK,CAAC;EACN,GAAG;EACH,CAAC,EAAE,EAAE;AACL;AACA,sBAAe,WAAW;;ECZ1B;EACe,SAASC,UAAQ,CAAC,GAAG,EAAE;EACtC,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;EACrE;;ECHA;EACe,SAASC,OAAK,CAAC,GAAG,EAAE;EACnC,EAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;EACtC;;ECNA;EACe,SAAS,QAAQ,CAAC,KAAK,EAAE;EACxC,EAAE,OAAO,WAAW;EACpB,IAAI,OAAO,KAAK,CAAC;EACjB,GAAG,CAAC;EACJ;;ECHA;EACe,SAAS,uBAAuB,CAAC,eAAe,EAAE;EACjE,EAAE,OAAO,SAAS,UAAU,EAAE;EAC9B,IAAI,IAAI,YAAY,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;EACnD,IAAI,OAAO,OAAO,YAAY,IAAI,QAAQ,IAAI,YAAY,IAAI,CAAC,IAAI,YAAY,IAAI,eAAe,CAAC;EACnG,GAAG;EACH;;ECRA;EACe,SAAS,eAAe,CAAC,GAAG,EAAE;EAC7C,EAAE,OAAO,SAAS,GAAG,EAAE;EACvB,IAAI,OAAO,GAAG,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;EAC3C,GAAG,CAAC;EACJ;;ECHA;AACA,sBAAe,eAAe,CAAC,YAAY,CAAC;;ECA5C;EACA;AACA,qBAAe,uBAAuB,CAAC,aAAa,CAAC;;ECArD;EACA,IAAI,iBAAiB,GAAG,6EAA6E,CAAC;EACtG,SAAS,YAAY,CAAC,GAAG,EAAE;EAC3B;EACA;EACA,EAAE,OAAO,YAAY,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAACC,YAAU,CAAC,GAAG,CAAC;EAC9D,gBAAgB,YAAY,CAAC,GAAG,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;EAChF,CAAC;AACD;AACA,uBAAe,mBAAmB,GAAG,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC;;ECZnE;AACA,kBAAe,eAAe,CAAC,QAAQ,CAAC;;ECCxC;EACA;EACA;EACA;EACA,SAAS,WAAW,CAAC,IAAI,EAAE;EAC3B,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;EAChB,EAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;EACpE,EAAE,OAAO;EACT,IAAI,QAAQ,EAAE,SAAS,GAAG,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,EAAE;EAC1D,IAAI,IAAI,EAAE,SAAS,GAAG,EAAE;EACxB,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;EACvB,MAAM,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;EAC5B,KAAK;EACL,GAAG,CAAC;EACJ,CAAC;AACD;EACA;EACA;EACA;EACe,SAAS,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE;EACvD,EAAE,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;EAC3B,EAAE,IAAI,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC;EAC7C,EAAE,IAAI,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;EACpC,EAAE,IAAI,KAAK,GAAG,CAACJ,YAAU,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,SAAS,KAAK,QAAQ,CAAC;AAC7E;EACA;EACA,EAAE,IAAI,IAAI,GAAG,aAAa,CAAC;EAC3B,EAAE,IAAIC,KAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9D;EACA,EAAE,OAAO,UAAU,EAAE,EAAE;EACvB,IAAI,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;EAC1C,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;EAC1E,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;EACtB,KAAK;EACL,GAAG;EACH;;EClCA;EACA;EACe,SAAS,IAAI,CAAC,GAAG,EAAE;EAClC,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;EAChC,EAAE,IAAI,UAAU,EAAE,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;EACzC,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;EAChB,EAAE,KAAK,IAAI,GAAG,IAAI,GAAG,EAAE,IAAIA,KAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;EACzD;EACA,EAAE,IAAI,UAAU,EAAE,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;EACjD,EAAE,OAAO,IAAI,CAAC;EACd;;ECTA;EACA;EACe,SAAS,OAAO,CAAC,GAAG,EAAE;EACrC,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,OAAO,IAAI,CAAC;EAC/B;EACA;EACA,EAAE,IAAI,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;EAC9B,EAAE,IAAI,OAAO,MAAM,IAAI,QAAQ;EAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAII,aAAW,CAAC,GAAG,CAAC;EACrD,GAAG,EAAE,OAAO,MAAM,KAAK,CAAC,CAAC;EACzB,EAAE,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;EACpC;;ECfA;EACe,SAAS,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE;EAC/C,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;EACjD,EAAE,IAAI,MAAM,IAAI,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC;EACrC,EAAE,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;EAC3B,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EACnC,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;EACvB,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,GAAG,CAAC,EAAE,OAAO,KAAK,CAAC;EAC/D,GAAG;EACH,EAAE,OAAO,IAAI,CAAC;EACd;;ECVA;EACA;EACA;EACe,SAASC,GAAC,CAAC,GAAG,EAAE;EAC/B,EAAE,IAAI,GAAG,YAAYA,GAAC,EAAE,OAAO,GAAG,CAAC;EACnC,EAAE,IAAI,EAAE,IAAI,YAAYA,GAAC,CAAC,EAAE,OAAO,IAAIA,GAAC,CAAC,GAAG,CAAC,CAAC;EAC9C,EAAE,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;EACtB,CAAC;AACD;AACAA,KAAC,CAAC,OAAO,GAAG,OAAO,CAAC;AACpB;EACA;AACAA,KAAC,CAAC,SAAS,CAAC,KAAK,GAAG,WAAW;EAC/B,EAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;EACvB,CAAC,CAAC;AACF;EACA;EACA;AACAA,KAAC,CAAC,SAAS,CAAC,OAAO,GAAGA,GAAC,CAAC,SAAS,CAAC,MAAM,GAAGA,GAAC,CAAC,SAAS,CAAC,KAAK,CAAC;AAC7D;AACAA,KAAC,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW;EAClC,EAAE,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;EAC/B,CAAC;;ECtBD;EACA;EACe,SAAS,YAAY,CAAC,YAAY,EAAE;EACnD,EAAE,OAAO,IAAI,UAAU;EACvB,IAAI,YAAY,CAAC,MAAM,IAAI,YAAY;EACvC,IAAI,YAAY,CAAC,UAAU,IAAI,CAAC;EAChC,IAAI,aAAa,CAAC,YAAY,CAAC;EAC/B,GAAG,CAAC;EACJ;;ECCA;EACA,IAAI,WAAW,GAAG,mBAAmB,CAAC;AACtC;EACA;EACA,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;EAClC;EACA;EACA,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;EACjD;EACA,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,OAAO,KAAK,CAAC;EAC3C;EACA,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;EAC9B;EACA,EAAE,IAAI,IAAI,GAAG,OAAO,CAAC,CAAC;EACtB,EAAE,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,QAAQ,EAAE,OAAO,KAAK,CAAC;EACrF,EAAE,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;EACtC,CAAC;AACD;EACA;EACA,SAAS,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;EACtC;EACA,EAAE,IAAI,CAAC,YAAYA,GAAC,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;EACrC,EAAE,IAAI,CAAC,YAAYA,GAAC,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;EACrC;EACA,EAAE,IAAI,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;EACnC,EAAE,IAAI,SAAS,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC;EACnD;EACA,EAAE,IAAI,eAAe,IAAI,SAAS,IAAI,iBAAiB,IAAIF,YAAU,CAAC,CAAC,CAAC,EAAE;EAC1E,IAAI,IAAI,CAACA,YAAU,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC;EACrC,IAAI,SAAS,GAAG,WAAW,CAAC;EAC5B,GAAG;EACH,EAAE,QAAQ,SAAS;EACnB;EACA,IAAI,KAAK,iBAAiB,CAAC;EAC3B;EACA,IAAI,KAAK,iBAAiB;EAC1B;EACA;EACA,MAAM,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;EAC/B,IAAI,KAAK,iBAAiB;EAC1B;EACA;EACA,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;EACtC;EACA,MAAM,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;EACrD,IAAI,KAAK,eAAe,CAAC;EACzB,IAAI,KAAK,kBAAkB;EAC3B;EACA;EACA;EACA,MAAM,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;EACvB,IAAI,KAAK,iBAAiB;EAC1B,MAAM,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;EACzE,IAAI,KAAK,sBAAsB,CAAC;EAChC,IAAI,KAAK,WAAW;EACpB;EACA,MAAM,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;EACtE,GAAG;AACH;EACA,EAAE,IAAI,SAAS,GAAG,SAAS,KAAK,gBAAgB,CAAC;EACjD,EAAE,IAAI,CAAC,SAAS,IAAIG,cAAY,CAAC,CAAC,CAAC,EAAE;EACrC,MAAM,IAAI,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;EACxC,MAAM,IAAI,UAAU,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC;EACxD,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC;EAC9E,MAAM,SAAS,GAAG,IAAI,CAAC;EACvB,GAAG;EACH,EAAE,IAAI,CAAC,SAAS,EAAE;EAClB,IAAI,IAAI,OAAO,CAAC,IAAI,QAAQ,IAAI,OAAO,CAAC,IAAI,QAAQ,EAAE,OAAO,KAAK,CAAC;AACnE;EACA;EACA;EACA,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC,WAAW,CAAC;EACrD,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,EAAEP,YAAU,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,KAAK;EACxE,6BAA6BA,YAAU,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,KAAK,CAAC;EACzE,4BAA4B,aAAa,IAAI,CAAC,IAAI,aAAa,IAAI,CAAC,CAAC,EAAE;EACvE,MAAM,OAAO,KAAK,CAAC;EACnB,KAAK;EACL,GAAG;EACH;EACA;AACA;EACA;EACA;EACA,EAAE,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;EACxB,EAAE,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;EACxB,EAAE,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;EAC7B,EAAE,OAAO,MAAM,EAAE,EAAE;EACnB;EACA;EACA,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;EAC1D,GAAG;AACH;EACA;EACA,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;EACjB,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB;EACA;EACA,EAAE,IAAI,SAAS,EAAE;EACjB;EACA,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;EACtB,IAAI,IAAI,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,CAAC;EAC1C;EACA,IAAI,OAAO,MAAM,EAAE,EAAE;EACrB,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,CAAC;EAClE,KAAK;EACL,GAAG,MAAM;EACT;EACA,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;EAC7B,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;EAC1B;EACA,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,OAAO,KAAK,CAAC;EAChD,IAAI,OAAO,MAAM,EAAE,EAAE;EACrB;EACA,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;EAC1B,MAAM,IAAI,EAAEC,KAAG,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC;EAC7E,KAAK;EACL,GAAG;EACH;EACA,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;EACf,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;EACf,EAAE,OAAO,IAAI,CAAC;EACd,CAAC;AACD;EACA;EACe,SAAS,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE;EACtC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;EAClB;;ECrIA;EACe,SAAS,OAAO,CAAC,GAAG,EAAE;EACrC,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;EAChC,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;EAChB,EAAE,KAAK,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;EACtC;EACA,EAAE,IAAI,UAAU,EAAE,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;EACjD,EAAE,OAAO,IAAI,CAAC;EACd;;ECRA;EACA;EACA;EACA;EACO,SAAS,eAAe,CAAC,OAAO,EAAE;EACzC,EAAE,IAAI,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;EAClC,EAAE,OAAO,SAAS,GAAG,EAAE;EACvB,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,OAAO,KAAK,CAAC;EAClC;EACA,IAAI,IAAI,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;EAC5B,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,CAAC;EACtC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EACrC,MAAM,IAAI,CAACD,YAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC;EACrD,KAAK;EACL;EACA;EACA;EACA,IAAI,OAAO,OAAO,KAAK,cAAc,IAAI,CAACA,YAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;EACvE,GAAG,CAAC;EACJ,CAAC;AACD;EACA;EACA;EACA,IAAI,WAAW,GAAG,SAAS;EAC3B,IAAI,OAAO,GAAG,KAAK;EACnB,IAAI,UAAU,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC;EACpC,IAAI,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AACtC;EACA;EACA;EACO,IAAI,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC;EAC/D,IAAI,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC;EAC/C,IAAI,UAAU,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC;;AChCjE,cAAe,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC;;ACAtE,kBAAe,MAAM,GAAG,eAAe,CAAC,cAAc,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC;;ACA9E,cAAe,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC;;ACFtE,kBAAe,SAAS,CAAC,SAAS,CAAC;;ECAnC;EACe,SAAS,MAAM,CAAC,GAAG,EAAE;EACpC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;EACxB,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;EAC5B,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;EAC7B,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EACnC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;EAC9B,GAAG;EACH,EAAE,OAAO,MAAM,CAAC;EAChB;;ECTA;EACA;EACe,SAAS,KAAK,CAAC,GAAG,EAAE;EACnC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;EACxB,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;EAC5B,EAAE,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;EAC5B,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EACnC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;EACzC,GAAG;EACH,EAAE,OAAO,KAAK,CAAC;EACf;;ECVA;EACe,SAAS,MAAM,CAAC,GAAG,EAAE;EACpC,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;EAClB,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;EACxB,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EAC1D,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;EACrC,GAAG;EACH,EAAE,OAAO,MAAM,CAAC;EAChB;;ECRA;EACe,SAAS,SAAS,CAAC,GAAG,EAAE;EACvC,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;EACjB,EAAE,KAAK,IAAI,GAAG,IAAI,GAAG,EAAE;EACvB,IAAI,IAAIA,YAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;EAC9C,GAAG;EACH,EAAE,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;EACtB;;ECTA;EACe,SAAS,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE;EAC3D,EAAE,OAAO,SAAS,GAAG,EAAE;EACvB,IAAI,IAAI,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;EAClC,IAAI,IAAI,QAAQ,EAAE,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;EACpC,IAAI,IAAI,MAAM,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,OAAO,GAAG,CAAC;EAC9C,IAAI,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;EACjD,MAAM,IAAI,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC;EACnC,UAAU,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC;EACjC,UAAU,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;EAC1B,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;EAClC,QAAQ,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;EAC1B,QAAQ,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;EACrE,OAAO;EACP,KAAK;EACL,IAAI,OAAO,GAAG,CAAC;EACf,GAAG,CAAC;EACJ;;ECdA;AACA,eAAe,cAAc,CAAC,OAAO,CAAC;;ECDtC;EACA;EACA;AACA,kBAAe,cAAc,CAAC,IAAI,CAAC;;ECHnC;AACA,iBAAe,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC;;ECD5C;EACA,SAAS,IAAI,GAAG;EAChB,EAAE,OAAO,UAAU,EAAE,CAAC;EACtB,CAAC;AACD;EACA;EACe,SAAS,UAAU,CAAC,SAAS,EAAE;EAC9C,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;EACtC,EAAE,IAAI,YAAY,EAAE,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;EACnD,EAAE,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;EACpB,EAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;EAC7B,EAAE,IAAI,MAAM,GAAG,IAAI,IAAI,CAAC;EACxB,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;EACxB,EAAE,OAAO,MAAM,CAAC;EAChB;;ECdA;EACA;EACA;EACe,SAAS,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE;EACjD,EAAE,IAAI,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;EACrC,EAAE,IAAI,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;EACtC,EAAE,OAAO,MAAM,CAAC;EAChB;;ECNA;EACe,SAAS,KAAK,CAAC,GAAG,EAAE;EACnC,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC;EACjC,EAAE,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;EACtD;;ECRA;EACA;EACA;EACe,SAAS,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE;EAC9C,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;EACnB,EAAE,OAAO,GAAG,CAAC;EACb;;ECHA;EACA;EACe,SAASQ,QAAM,CAAC,IAAI,EAAE;EACrC,EAAE,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;EACvC,CAAC;AACDF,KAAC,CAAC,MAAM,GAAGE,QAAM;;ECLjB;EACA;EACe,SAAS,MAAM,CAAC,IAAI,EAAE;EACrC,EAAE,OAAOF,GAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;EACxB;;ECPA;EACe,SAAS,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE;EAC3C,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;EAC3B,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EACnC,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,OAAO,KAAK,CAAC,CAAC;EACnC,IAAI,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;EACvB,GAAG;EACH,EAAE,OAAO,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC;EAC/B;;ECJA;EACA;EACA;EACA;EACe,SAAS,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE;EACxD,EAAE,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;EAC5C,EAAE,OAAO,WAAW,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,KAAK,CAAC;EACnD;;ECRA;EACA;EACA;EACe,SAAS,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE;EACvC,EAAE,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;EACtB,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;EAC3B,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EACnC,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;EACtB,IAAI,IAAI,CAACG,KAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,CAAC;EACtC,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;EACnB,GAAG;EACH,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC;EAClB;;ECfA;EACe,SAAS,QAAQ,CAAC,KAAK,EAAE;EACxC,EAAE,OAAO,KAAK,CAAC;EACf;;ECAA;EACA;EACe,SAAS,OAAO,CAAC,KAAK,EAAE;EACvC,EAAE,KAAK,GAAG,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;EAC/B,EAAE,OAAO,SAAS,GAAG,EAAE;EACvB,IAAI,OAAO,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;EAC/B,GAAG,CAAC;EACJ;;ECPA;EACA;EACe,SAAS,QAAQ,CAAC,IAAI,EAAE;EACvC,EAAE,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;EACtB,EAAE,OAAO,SAAS,GAAG,EAAE;EACvB,IAAI,OAAO,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;EAC9B,GAAG,CAAC;EACJ;;ECVA;EACA;EACA;EACe,SAAS,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;EAC5D,EAAE,IAAI,OAAO,KAAK,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC;EACtC,EAAE,QAAQ,QAAQ,IAAI,IAAI,GAAG,CAAC,GAAG,QAAQ;EACzC,IAAI,KAAK,CAAC,EAAE,OAAO,SAAS,KAAK,EAAE;EACnC,MAAM,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;EACvC,KAAK,CAAC;EACN;EACA,IAAI,KAAK,CAAC,EAAE,OAAO,SAAS,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE;EACtD,MAAM,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;EAC1D,KAAK,CAAC;EACN,IAAI,KAAK,CAAC,EAAE,OAAO,SAAS,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE;EACnE,MAAM,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;EACvE,KAAK,CAAC;EACN,GAAG;EACH,EAAE,OAAO,WAAW;EACpB,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;EAC1C,GAAG,CAAC;EACJ;;ECZA;EACA;EACA;EACe,SAAS,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE;EAC/D,EAAE,IAAI,KAAK,IAAI,IAAI,EAAE,OAAO,QAAQ,CAAC;EACrC,EAAE,IAAIT,YAAU,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;EACrE,EAAE,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;EAChE,EAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;EACzB;;ECbA;EACA;EACA;EACe,SAAS,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE;EACjD,EAAE,OAAO,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;EAChD,CAAC;AACDM,KAAC,CAAC,QAAQ,GAAG,QAAQ;;ECLrB;EACA;EACe,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE;EACrD,EAAE,IAAIA,GAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE,OAAOA,GAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;EACjE,EAAE,OAAO,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;EAChD;;ECNA;EACA;EACe,SAAS,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE;EAC1D,EAAE,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;EACnC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC;EACvB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;EAC3B,MAAM,OAAO,GAAG,EAAE,CAAC;EACnB,EAAE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;EAC/C,IAAI,IAAI,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;EAClC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;EACrE,GAAG;EACH,EAAE,OAAO,OAAO,CAAC;EACjB;;ECfA;EACe,SAAS,IAAI,EAAE;;ECE9B;EACe,SAAS,UAAU,CAAC,GAAG,EAAE;EACxC,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,OAAO,IAAI,CAAC;EAC/B,EAAE,OAAO,SAAS,IAAI,EAAE;EACxB,IAAI,OAAO,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;EAC1B,GAAG,CAAC;EACJ;;ECPA;EACe,SAAS,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE;EACpD,EAAE,IAAI,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;EACpC,EAAE,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;EAC9C,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;EACrD,EAAE,OAAO,KAAK,CAAC;EACf;;ECRA;EACe,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE;EACzC,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE;EACnB,IAAI,GAAG,GAAG,GAAG,CAAC;EACd,IAAI,GAAG,GAAG,CAAC,CAAC;EACZ,GAAG;EACH,EAAE,OAAO,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;EAC3D;;ECPA;AACA,YAAe,IAAI,CAAC,GAAG,IAAI,WAAW;EACtC,EAAE,OAAO,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;EAC9B,CAAC;;ECDD;EACA;EACe,SAAS,aAAa,CAAC,GAAG,EAAE;EAC3C,EAAE,IAAI,OAAO,GAAG,SAAS,KAAK,EAAE;EAChC,IAAI,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;EACtB,GAAG,CAAC;EACJ;EACA,EAAE,IAAI,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;EACjD,EAAE,IAAI,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;EAClC,EAAE,IAAI,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;EAC1C,EAAE,OAAO,SAAS,MAAM,EAAE;EAC1B,IAAI,MAAM,GAAG,MAAM,IAAI,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;EAC/C,IAAI,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;EACrF,GAAG,CAAC;EACJ;;EChBA;AACA,kBAAe;EACf,EAAE,GAAG,EAAE,OAAO;EACd,EAAE,GAAG,EAAE,MAAM;EACb,EAAE,GAAG,EAAE,MAAM;EACb,EAAE,GAAG,EAAE,QAAQ;EACf,EAAE,GAAG,EAAE,QAAQ;EACf,EAAE,GAAG,EAAE,QAAQ;EACf,CAAC;;ECLD;AACA,gBAAe,aAAa,CAAC,SAAS,CAAC;;ECDvC;AACA,oBAAe,MAAM,CAAC,SAAS,CAAC;;ECDhC;AACA,kBAAe,aAAa,CAAC,WAAW,CAAC;;ECFzC;EACA;AACA,yBAAeA,GAAC,CAAC,gBAAgB,GAAG;EACpC,EAAE,QAAQ,EAAE,iBAAiB;EAC7B,EAAE,WAAW,EAAE,kBAAkB;EACjC,EAAE,MAAM,EAAE,kBAAkB;EAC5B,CAAC;;ECJD;EACA;EACA;EACA,IAAI,OAAO,GAAG,MAAM,CAAC;AACrB;EACA;EACA;EACA,IAAI,OAAO,GAAG;EACd,EAAE,GAAG,EAAE,GAAG;EACV,EAAE,IAAI,EAAE,IAAI;EACZ,EAAE,IAAI,EAAE,GAAG;EACX,EAAE,IAAI,EAAE,GAAG;EACX,EAAE,QAAQ,EAAE,OAAO;EACnB,EAAE,QAAQ,EAAE,OAAO;EACnB,CAAC,CAAC;AACF;EACA,IAAI,YAAY,GAAG,2BAA2B,CAAC;AAC/C;EACA,SAAS,UAAU,CAAC,KAAK,EAAE;EAC3B,EAAE,OAAO,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;EAC/B,CAAC;AACD;EACA;EACA;EACA;EACA;EACA;EACA,IAAI,cAAc,GAAG,kBAAkB,CAAC;AACxC;EACA;EACA;EACA;EACA;EACe,SAAS,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE;EAC9D,EAAE,IAAI,CAAC,QAAQ,IAAI,WAAW,EAAE,QAAQ,GAAG,WAAW,CAAC;EACvD,EAAE,QAAQ,GAAG,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAEA,GAAC,CAAC,gBAAgB,CAAC,CAAC;AACxD;EACA;EACA,EAAE,IAAI,OAAO,GAAG,MAAM,CAAC;EACvB,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,OAAO,EAAE,MAAM;EACvC,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,OAAO,EAAE,MAAM;EAC5C,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,OAAO,EAAE,MAAM;EACzC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;AAC3B;EACA;EACA,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC;EAChB,EAAE,IAAI,MAAM,GAAG,QAAQ,CAAC;EACxB,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE;EAC/E,IAAI,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;EAC1E,IAAI,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;AAClC;EACA,IAAI,IAAI,MAAM,EAAE;EAChB,MAAM,MAAM,IAAI,aAAa,GAAG,MAAM,GAAG,gCAAgC,CAAC;EAC1E,KAAK,MAAM,IAAI,WAAW,EAAE;EAC5B,MAAM,MAAM,IAAI,aAAa,GAAG,WAAW,GAAG,sBAAsB,CAAC;EACrE,KAAK,MAAM,IAAI,QAAQ,EAAE;EACzB,MAAM,MAAM,IAAI,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;EAC/C,KAAK;AACL;EACA;EACA,IAAI,OAAO,KAAK,CAAC;EACjB,GAAG,CAAC,CAAC;EACL,EAAE,MAAM,IAAI,MAAM,CAAC;AACnB;EACA,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;EACnC,EAAE,IAAI,QAAQ,EAAE;EAChB;EACA,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,KAAK;EACvD,MAAM,qCAAqC,GAAG,QAAQ;EACtD,KAAK,CAAC;EACN,GAAG,MAAM;EACT;EACA,IAAI,MAAM,GAAG,kBAAkB,GAAG,MAAM,GAAG,KAAK,CAAC;EACjD,IAAI,QAAQ,GAAG,KAAK,CAAC;EACrB,GAAG;AACH;EACA,EAAE,MAAM,GAAG,0CAA0C;EACrD,IAAI,mDAAmD;EACvD,IAAI,MAAM,GAAG,eAAe,CAAC;AAC7B;EACA,EAAE,IAAI,MAAM,CAAC;EACb,EAAE,IAAI;EACN,IAAI,MAAM,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;EACjD,GAAG,CAAC,OAAO,CAAC,EAAE;EACd,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;EACtB,IAAI,MAAM,CAAC,CAAC;EACZ,GAAG;AACH;EACA,EAAE,IAAI,QAAQ,GAAG,SAAS,IAAI,EAAE;EAChC,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAEA,GAAC,CAAC,CAAC;EACtC,GAAG,CAAC;AACJ;EACA;EACA,EAAE,QAAQ,CAAC,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC;AACnE;EACA,EAAE,OAAO,QAAQ,CAAC;EAClB;;ECjGA;EACA;EACA;EACe,SAAS,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE;EACpD,EAAE,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;EACtB,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;EAC3B,EAAE,IAAI,CAAC,MAAM,EAAE;EACf,IAAI,OAAON,YAAU,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;EAChE,GAAG;EACH,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EACnC,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;EACnD,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE;EACzB,MAAM,IAAI,GAAG,QAAQ,CAAC;EACtB,MAAM,CAAC,GAAG,MAAM,CAAC;EACjB,KAAK;EACL,IAAI,GAAG,GAAGA,YAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;EACnD,GAAG;EACH,EAAE,OAAO,GAAG,CAAC;EACb;;ECrBA;EACA;EACA,IAAI,SAAS,GAAG,CAAC,CAAC;EACH,SAAS,QAAQ,CAAC,MAAM,EAAE;EACzC,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,CAAC;EAC5B,EAAE,OAAO,MAAM,GAAG,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC;EACnC;;ECJA;EACe,SAAS,KAAK,CAAC,GAAG,EAAE;EACnC,EAAE,IAAI,QAAQ,GAAGM,GAAC,CAAC,GAAG,CAAC,CAAC;EACxB,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;EACzB,EAAE,OAAO,QAAQ,CAAC;EAClB;;ECJA;EACA;EACA;EACe,SAAS,YAAY,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE;EAC3F,EAAE,IAAI,EAAE,cAAc,YAAY,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;EACrF,EAAE,IAAI,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;EAC9C,EAAE,IAAI,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;EAC5C,EAAE,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,MAAM,CAAC;EACtC,EAAE,OAAO,IAAI,CAAC;EACd;;ECRA;EACA;EACA;EACA;EACA,IAAI,OAAO,GAAG,aAAa,CAAC,SAAS,IAAI,EAAE,SAAS,EAAE;EACtD,EAAE,IAAI,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;EACxC,EAAE,IAAI,KAAK,GAAG,WAAW;EACzB,IAAI,IAAI,QAAQ,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;EAChD,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;EAC7B,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EACrC,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,WAAW,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;EACpF,KAAK;EACL,IAAI,OAAO,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;EACzE,IAAI,OAAO,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;EACvD,GAAG,CAAC;EACJ,EAAE,OAAO,KAAK,CAAC;EACf,CAAC,CAAC,CAAC;AACH;EACA,OAAO,CAAC,WAAW,GAAGA,GAAC;;EClBvB;EACA;AACA,aAAe,aAAa,CAAC,SAAS,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;EAC3D,EAAE,IAAI,CAACN,YAAU,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;EAClF,EAAE,IAAI,KAAK,GAAG,aAAa,CAAC,SAAS,QAAQ,EAAE;EAC/C,IAAI,OAAO,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;EAC3E,GAAG,CAAC,CAAC;EACL,EAAE,OAAO,KAAK,CAAC;EACf,CAAC,CAAC;;ECTF;EACA;EACA;EACA;AACA,oBAAe,uBAAuB,CAAC,SAAS,CAAC;;ECFjD;EACe,SAASU,SAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;EAC9D,EAAE,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;EACxB,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,CAAC,EAAE;EAC7B,IAAI,KAAK,GAAG,QAAQ,CAAC;EACrB,GAAG,MAAM,IAAI,KAAK,IAAI,CAAC,EAAE;EACzB,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;EAChC,GAAG;EACH,EAAE,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;EAC1B,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EAC9D,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;EACzB,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,IAAIL,aAAW,CAAC,KAAK,CAAC,CAAC,EAAE;EACtE;EACA,MAAM,IAAI,KAAK,GAAG,CAAC,EAAE;EACrB,QAAQK,SAAO,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;EAClD,QAAQ,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;EAC5B,OAAO,MAAM;EACb,QAAQ,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;EACtC,QAAQ,OAAO,CAAC,GAAG,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;EACnD,OAAO;EACP,KAAK,MAAM,IAAI,CAAC,MAAM,EAAE;EACxB,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;EAC5B,KAAK;EACL,GAAG;EACH,EAAE,OAAO,MAAM,CAAC;EAChB;;EC1BA;EACA;EACA;AACA,gBAAe,aAAa,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE;EACjD,EAAE,IAAI,GAAGA,SAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;EACrC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;EAC1B,EAAE,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;EAC1E,EAAE,OAAO,KAAK,EAAE,EAAE;EAClB,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;EAC1B,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;EACnC,GAAG;EACH,EAAE,OAAO,GAAG,CAAC;EACb,CAAC,CAAC;;ECdF;EACe,SAAS,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE;EAC9C,EAAE,IAAI,OAAO,GAAG,SAAS,GAAG,EAAE;EAC9B,IAAI,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;EAC9B,IAAI,IAAI,OAAO,GAAG,EAAE,IAAI,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;EACtE,IAAI,IAAI,CAACT,KAAG,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;EAC3E,IAAI,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC;EAC1B,GAAG,CAAC;EACJ,EAAE,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;EACrB,EAAE,OAAO,OAAO,CAAC;EACjB;;ECVA;EACA;AACA,cAAe,aAAa,CAAC,SAAS,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;EACxD,EAAE,OAAO,UAAU,CAAC,WAAW;EAC/B,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;EAClC,GAAG,EAAE,IAAI,CAAC,CAAC;EACX,CAAC,CAAC;;ECJF;EACA;AACA,cAAe,OAAO,CAAC,KAAK,EAAEK,GAAC,EAAE,CAAC,CAAC;;ECJnC;EACA;EACA;EACA;EACA;EACe,SAAS,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE;EACtD,EAAE,IAAI,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC;EACrC,EAAE,IAAI,QAAQ,GAAG,CAAC,CAAC;EACnB,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,EAAE,CAAC;AAC7B;EACA,EAAE,IAAI,KAAK,GAAG,WAAW;EACzB,IAAI,QAAQ,GAAG,OAAO,CAAC,OAAO,KAAK,KAAK,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;EACrD,IAAI,OAAO,GAAG,IAAI,CAAC;EACnB,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;EACvC,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;EACxC,GAAG,CAAC;AACJ;EACA,EAAE,IAAI,SAAS,GAAG,WAAW;EAC7B,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;EACrB,IAAI,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;EAChE,IAAI,IAAI,SAAS,GAAG,IAAI,IAAI,IAAI,GAAG,QAAQ,CAAC,CAAC;EAC7C,IAAI,OAAO,GAAG,IAAI,CAAC;EACnB,IAAI,IAAI,GAAG,SAAS,CAAC;EACrB,IAAI,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,GAAG,IAAI,EAAE;EAC5C,MAAM,IAAI,OAAO,EAAE;EACnB,QAAQ,YAAY,CAAC,OAAO,CAAC,CAAC;EAC9B,QAAQ,OAAO,GAAG,IAAI,CAAC;EACvB,OAAO;EACP,MAAM,QAAQ,GAAG,IAAI,CAAC;EACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;EACzC,MAAM,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;EAC1C,KAAK,MAAM,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,EAAE;EACvD,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;EAC7C,KAAK;EACL,IAAI,OAAO,MAAM,CAAC;EAClB,GAAG,CAAC;AACJ;EACA,EAAE,SAAS,CAAC,MAAM,GAAG,WAAW;EAChC,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;EAC1B,IAAI,QAAQ,GAAG,CAAC,CAAC;EACjB,IAAI,OAAO,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;EACpC,GAAG,CAAC;AACJ;EACA,EAAE,OAAO,SAAS,CAAC;EACnB;;EC3CA;EACA;EACA;EACA;EACe,SAAS,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;EACxD,EAAE,IAAI,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC;AAC/C;EACA,EAAE,IAAI,KAAK,GAAG,WAAW;EACzB,IAAI,IAAI,MAAM,GAAG,GAAG,EAAE,GAAG,QAAQ,CAAC;EAClC,IAAI,IAAI,IAAI,GAAG,MAAM,EAAE;EACvB,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;EACjD,KAAK,MAAM;EACX,MAAM,OAAO,GAAG,IAAI,CAAC;EACrB,MAAM,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;EACzD;EACA,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;EAC1C,KAAK;EACL,GAAG,CAAC;AACJ;EACA,EAAE,IAAI,SAAS,GAAG,aAAa,CAAC,SAAS,KAAK,EAAE;EAChD,IAAI,OAAO,GAAG,IAAI,CAAC;EACnB,IAAI,IAAI,GAAG,KAAK,CAAC;EACjB,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC;EACrB,IAAI,IAAI,CAAC,OAAO,EAAE;EAClB,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;EACxC,MAAM,IAAI,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;EACxD,KAAK;EACL,IAAI,OAAO,MAAM,CAAC;EAClB,GAAG,CAAC,CAAC;AACL;EACA,EAAE,SAAS,CAAC,MAAM,GAAG,WAAW;EAChC,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;EAC1B,IAAI,OAAO,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;EACpC,GAAG,CAAC;AACJ;EACA,EAAE,OAAO,SAAS,CAAC;EACnB;;ECrCA;EACA;EACA;EACe,SAAS,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE;EAC5C,EAAE,OAAO,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;EAChC;;ECPA;EACe,SAAS,MAAM,CAAC,SAAS,EAAE;EAC1C,EAAE,OAAO,WAAW;EACpB,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;EAC7C,GAAG,CAAC;EACJ;;ECLA;EACA;EACe,SAAS,OAAO,GAAG;EAClC,EAAE,IAAI,IAAI,GAAG,SAAS,CAAC;EACvB,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;EAC9B,EAAE,OAAO,WAAW;EACpB,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC;EAClB,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;EACpD,IAAI,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;EACpD,IAAI,OAAO,MAAM,CAAC;EAClB,GAAG,CAAC;EACJ;;ECXA;EACe,SAAS,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;EAC3C,EAAE,OAAO,WAAW;EACpB,IAAI,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE;EACrB,MAAM,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;EACzC,KAAK;EACL,GAAG,CAAC;EACJ;;ECPA;EACA;EACe,SAAS,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE;EAC5C,EAAE,IAAI,IAAI,CAAC;EACX,EAAE,OAAO,WAAW;EACpB,IAAI,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE;EACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;EACzC,KAAK;EACL,IAAI,IAAI,KAAK,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;EAChC,IAAI,OAAO,IAAI,CAAC;EAChB,GAAG,CAAC;EACJ;;ECRA;EACA;AACA,aAAe,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;;ECFjC;EACe,SAAS,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE;EACzD,EAAE,SAAS,GAAG,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;EACrC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;EAC7B,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EAC1D,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;EACnB,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC;EAClD,GAAG;EACH;;ECRA;EACe,SAAS,0BAA0B,CAAC,GAAG,EAAE;EACxD,EAAE,OAAO,SAAS,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE;EAC7C,IAAI,SAAS,GAAG,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;EACvC,IAAI,IAAI,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;EAClC,IAAI,IAAI,KAAK,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;EACzC,IAAI,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,GAAG,EAAE;EACvD,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;EAC9D,KAAK;EACL,IAAI,OAAO,CAAC,CAAC,CAAC;EACd,GAAG,CAAC;EACJ;;ECZA;AACA,kBAAe,0BAA0B,CAAC,CAAC,CAAC;;ECD5C;AACA,sBAAe,0BAA0B,CAAC,CAAC,CAAC,CAAC;;ECA7C;EACA;EACe,SAAS,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE;EACnE,EAAE,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;EACtC,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;EAC5B,EAAE,IAAI,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;EACvC,EAAE,OAAO,GAAG,GAAG,IAAI,EAAE;EACrB,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;EAC3C,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC;EACrE,GAAG;EACH,EAAE,OAAO,GAAG,CAAC;EACb;;ECVA;EACe,SAAS,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE;EAC3E,EAAE,OAAO,SAAS,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE;EACpC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;EACzC,IAAI,IAAI,OAAO,GAAG,IAAI,QAAQ,EAAE;EAChC,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE;EACnB,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;EACvD,OAAO,MAAM;EACb,QAAQ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC;EACzE,OAAO;EACP,KAAK,MAAM,IAAI,WAAW,IAAI,GAAG,IAAI,MAAM,EAAE;EAC7C,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;EACrC,MAAM,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;EAC5C,KAAK;EACL,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE;EACvB,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAEH,OAAK,CAAC,CAAC;EAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;EACrC,KAAK;EACL,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE;EAC/E,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,OAAO,GAAG,CAAC;EAC1C,KAAK;EACL,IAAI,OAAO,CAAC,CAAC,CAAC;EACd,GAAG,CAAC;EACJ;;ECvBA;EACA;EACA;EACA;AACA,gBAAe,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC;;ECL3D;EACA;AACA,oBAAe,iBAAiB,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC;;ECDnD;EACe,SAAS,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE;EACtD,EAAE,IAAI,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC;EACzD,EAAE,IAAI,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;EAC/C,EAAE,IAAI,GAAG,KAAK,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;EACpD;;ECNA;EACA;EACe,SAAS,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE;EAC9C,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;EACnC;;ECHA;EACA;EACA;EACA;EACe,SAAS,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE;EACrD,EAAE,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;EAC3C,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC;EAChB,EAAE,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE;EACxB,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EACtD,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;EAC/B,KAAK;EACL,GAAG,MAAM;EACT,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;EAC1B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EACxD,MAAM,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;EAC7C,KAAK;EACL,GAAG;EACH,EAAE,OAAO,GAAG,CAAC;EACb;;EClBA;EACe,SAAS,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE;EACpD,EAAE,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;EACnC,EAAE,IAAI,KAAK,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC;EAC5C,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,GAAG,EAAE,MAAM;EACpC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;EAC9B,EAAE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;EAC/C,IAAI,IAAI,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;EAClD,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;EAChE,GAAG;EACH,EAAE,OAAO,OAAO,CAAC;EACjB;;ECXA;EACe,SAAS,YAAY,CAAC,GAAG,EAAE;EAC1C;EACA;EACA,EAAE,IAAI,OAAO,GAAG,SAAS,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE;EACvD,IAAI,IAAI,KAAK,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC;EAC9C,QAAQ,MAAM,GAAG,CAAC,KAAK,IAAI,GAAG,EAAE,MAAM;EACtC,QAAQ,KAAK,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;EACzC,IAAI,IAAI,CAAC,OAAO,EAAE;EAClB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;EAC/C,MAAM,KAAK,IAAI,GAAG,CAAC;EACnB,KAAK;EACL,IAAI,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,GAAG,EAAE;EACvD,MAAM,IAAI,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;EACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;EAC9D,KAAK;EACL,IAAI,OAAO,IAAI,CAAC;EAChB,GAAG,CAAC;AACJ;EACA,EAAE,OAAO,SAAS,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE;EAChD,IAAI,IAAI,OAAO,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC;EACxC,IAAI,OAAO,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;EACzE,GAAG,CAAC;EACJ;;ECzBA;EACA;AACA,eAAe,YAAY,CAAC,CAAC,CAAC;;ECF9B;AACA,oBAAe,YAAY,CAAC,CAAC,CAAC,CAAC;;ECA/B;EACe,SAAS,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE;EACxD,EAAE,IAAI,OAAO,GAAG,EAAE,CAAC;EACnB,EAAE,SAAS,GAAG,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;EACrC,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;EACzC,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;EAC3D,GAAG,CAAC,CAAC;EACL,EAAE,OAAO,OAAO,CAAC;EACjB;;ECPA;EACe,SAAS,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE;EACxD,EAAE,OAAO,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;EACrD;;ECHA;EACe,SAAS,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE;EACvD,EAAE,SAAS,GAAG,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;EACrC,EAAE,IAAI,KAAK,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC;EAC5C,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,GAAG,EAAE,MAAM,CAAC;EACrC,EAAE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;EAC/C,IAAI,IAAI,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;EAClD,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,CAAC;EACnE,GAAG;EACH,EAAE,OAAO,IAAI,CAAC;EACd;;ECVA;EACe,SAAS,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE;EACtD,EAAE,SAAS,GAAG,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;EACrC,EAAE,IAAI,KAAK,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC;EAC5C,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,GAAG,EAAE,MAAM,CAAC;EACrC,EAAE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;EAC/C,IAAI,IAAI,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;EAClD,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC;EACjE,GAAG;EACH,EAAE,OAAO,KAAK,CAAC;EACf;;ECVA;EACe,SAAS,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;EAC9D,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;EAC3C,EAAE,IAAI,OAAO,SAAS,IAAI,QAAQ,IAAI,KAAK,EAAE,SAAS,GAAG,CAAC,CAAC;EAC3D,EAAE,OAAO,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;EAC5C;;ECHA;AACA,eAAe,aAAa,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;EACvD,EAAE,IAAI,WAAW,EAAE,IAAI,CAAC;EACxB,EAAE,IAAIH,YAAU,CAAC,IAAI,CAAC,EAAE;EACxB,IAAI,IAAI,GAAG,IAAI,CAAC;EAChB,GAAG,MAAM;EACT,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;EACxB,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;EACpC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;EACjC,GAAG;EACH,EAAE,OAAO,GAAG,CAAC,GAAG,EAAE,SAAS,OAAO,EAAE;EACpC,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC;EACtB,IAAI,IAAI,CAAC,MAAM,EAAE;EACjB,MAAM,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,EAAE;EAC7C,QAAQ,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;EAChD,OAAO;EACP,MAAM,IAAI,OAAO,IAAI,IAAI,EAAE,OAAO,KAAK,CAAC,CAAC;EACzC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;EAC7B,KAAK;EACL,IAAI,OAAO,MAAM,IAAI,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;EACjE,GAAG,CAAC,CAAC;EACL,CAAC,CAAC;;ECxBF;EACe,SAAS,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE;EACxC,EAAE,OAAO,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;EACjC;;ECHA;EACA;EACe,SAAS,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE;EAC1C,EAAE,OAAO,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;EACrC;;ECFA;EACe,SAAS,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE;EACpD,EAAE,IAAI,MAAM,GAAG,CAAC,QAAQ,EAAE,YAAY,GAAG,CAAC,QAAQ;EAClD,MAAM,KAAK,EAAE,QAAQ,CAAC;EACtB,EAAE,IAAI,QAAQ,IAAI,IAAI,KAAK,OAAO,QAAQ,IAAI,QAAQ,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE;EACrG,IAAI,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;EAC/C,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EAC1D,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;EACrB,MAAM,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,MAAM,EAAE;EAC3C,QAAQ,MAAM,GAAG,KAAK,CAAC;EACvB,OAAO;EACP,KAAK;EACL,GAAG,MAAM;EACT,IAAI,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;EACrC,IAAI,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;EACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;EAC1C,MAAM,IAAI,QAAQ,GAAG,YAAY,KAAK,QAAQ,KAAK,CAAC,QAAQ,IAAI,MAAM,KAAK,CAAC,QAAQ,CAAC,EAAE;EACvF,QAAQ,MAAM,GAAG,CAAC,CAAC;EACnB,QAAQ,YAAY,GAAG,QAAQ,CAAC;EAChC,OAAO;EACP,KAAK,CAAC,CAAC;EACP,GAAG;EACH,EAAE,OAAO,MAAM,CAAC;EAChB;;ECvBA;EACe,SAAS,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE;EACpD,EAAE,IAAI,MAAM,GAAG,QAAQ,EAAE,YAAY,GAAG,QAAQ;EAChD,MAAM,KAAK,EAAE,QAAQ,CAAC;EACtB,EAAE,IAAI,QAAQ,IAAI,IAAI,KAAK,OAAO,QAAQ,IAAI,QAAQ,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE;EACrG,IAAI,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;EAC/C,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EAC1D,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;EACrB,MAAM,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,MAAM,EAAE;EAC3C,QAAQ,MAAM,GAAG,KAAK,CAAC;EACvB,OAAO;EACP,KAAK;EACL,GAAG,MAAM;EACT,IAAI,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;EACrC,IAAI,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;EACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;EAC1C,MAAM,IAAI,QAAQ,GAAG,YAAY,KAAK,QAAQ,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ,CAAC,EAAE;EACrF,QAAQ,MAAM,GAAG,CAAC,CAAC;EACnB,QAAQ,YAAY,GAAG,QAAQ,CAAC;EAChC,OAAO;EACP,KAAK,CAAC,CAAC;EACP,GAAG;EACH,EAAE,OAAO,MAAM,CAAC;EAChB;;ECpBA;EACA,IAAI,WAAW,GAAG,kEAAkE,CAAC;EACtE,SAAS,OAAO,CAAC,GAAG,EAAE;EACrC,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;EACtB,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;EAC3C,EAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE;EACrB;EACA,IAAI,OAAO,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;EAClC,GAAG;EACH,EAAE,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;EAClD,EAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;EACrB;;ECbA;EACA;EACA;EACA;EACe,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE;EAC9C,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,EAAE;EAC1B,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;EAC7C,IAAI,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;EACvC,GAAG;EACH,EAAE,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;EAC5B,EAAE,IAAI,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;EACjC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;EACvC,EAAE,IAAI,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC;EACxB,EAAE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE;EAC1C,IAAI,IAAI,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;EACnC,IAAI,IAAI,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;EAC7B,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;EACjC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;EACxB,GAAG;EACH,EAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;EAC5B;;ECxBA;EACe,SAAS,OAAO,CAAC,GAAG,EAAE;EACrC,EAAE,OAAO,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;EAC/B;;ECDA;EACe,SAAS,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE;EACvD,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC;EAChB,EAAE,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;EACnC,EAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE;EACnD,IAAI,OAAO;EACX,MAAM,KAAK,EAAE,KAAK;EAClB,MAAM,KAAK,EAAE,KAAK,EAAE;EACpB,MAAM,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC;EAC1C,KAAK,CAAC;EACN,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,KAAK,EAAE;EAChC,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;EAC1B,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;EAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE;EACjB,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;EAC1C,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;EAC3C,KAAK;EACL,IAAI,OAAO,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;EACpC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;EACf;;ECpBA;EACe,SAAS,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE;EACnD,EAAE,OAAO,SAAS,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE;EAC1C,IAAI,IAAI,MAAM,GAAG,SAAS,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;EAC3C,IAAI,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;EACrC,IAAI,IAAI,CAAC,GAAG,EAAE,SAAS,KAAK,EAAE,KAAK,EAAE;EACrC,MAAM,IAAI,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;EAC5C,MAAM,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;EACnC,KAAK,CAAC,CAAC;EACP,IAAI,OAAO,MAAM,CAAC;EAClB,GAAG,CAAC;EACJ;;ECXA;EACA;AACA,gBAAe,KAAK,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;EAClD,EAAE,IAAIC,KAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;EAC5E,CAAC,CAAC;;ECLF;EACA;AACA,gBAAe,KAAK,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;EAClD,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;EACtB,CAAC,CAAC;;ECHF;EACA;EACA;AACA,gBAAe,KAAK,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;EAClD,EAAE,IAAIA,KAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;EAC5D,CAAC,CAAC;;ECNF;EACA;AACA,kBAAe,KAAK,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;EACnD,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;EACnC,CAAC,EAAE,IAAI,CAAC;;ECHR;EACe,SAAS,IAAI,CAAC,GAAG,EAAE;EAClC,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,OAAO,CAAC,CAAC;EAC5B,EAAE,OAAO,WAAW,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;EAC1D;;ECPA;EACA;EACe,SAAS,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE;EAClD,EAAE,OAAO,GAAG,IAAI,GAAG,CAAC;EACpB;;ECGA;AACA,aAAe,aAAa,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE;EACjD,EAAE,IAAI,MAAM,GAAG,EAAE,EAAE,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;EACtC,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,OAAO,MAAM,CAAC;EACjC,EAAE,IAAID,YAAU,CAAC,QAAQ,CAAC,EAAE;EAC5B,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;EAClE,IAAI,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;EACxB,GAAG,MAAM;EACT,IAAI,QAAQ,GAAG,QAAQ,CAAC;EACxB,IAAI,IAAI,GAAGU,SAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;EACvC,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;EACtB,GAAG;EACH,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EACzD,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;EACtB,IAAI,IAAI,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;EACzB,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;EACvD,GAAG;EACH,EAAE,OAAO,MAAM,CAAC;EAChB,CAAC,CAAC;;ECjBF;AACA,aAAe,aAAa,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE;EACjD,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;EAClC,EAAE,IAAIV,YAAU,CAAC,QAAQ,CAAC,EAAE;EAC5B,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;EAChC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;EAC3C,GAAG,MAAM;EACT,IAAI,IAAI,GAAG,GAAG,CAACU,SAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;EACpD,IAAI,QAAQ,GAAG,SAAS,KAAK,EAAE,GAAG,EAAE;EACpC,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;EAClC,KAAK,CAAC;EACN,GAAG;EACH,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;EACtC,CAAC,CAAC;;ECnBF;EACA;EACA;EACe,SAAS,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE;EACjD,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;EACxF;;ECLA;EACA;EACe,SAAS,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE;EAC/C,EAAE,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;EACjF,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;EAC1C,EAAE,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;EAC1C;;ECNA;EACA;EACA;EACe,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE;EAC9C,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;EACvD;;ECLA;EACA;EACe,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE;EAC9C,EAAE,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;EACjF,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,EAAE,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;EACzD,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;EACpD;;ECNA;EACe,SAAS,OAAO,CAAC,KAAK,EAAE;EACvC,EAAE,OAAO,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;EAChC;;ECHA;EACA;EACe,SAAS,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE;EAC9C,EAAE,OAAOC,SAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;EACvC;;ECDA;EACA;AACA,mBAAe,aAAa,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE;EACnD,EAAE,IAAI,GAAGD,SAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;EACnC,EAAE,OAAO,MAAM,CAAC,KAAK,EAAE,SAAS,KAAK,CAAC;EACtC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;EAClC,GAAG,CAAC,CAAC;EACL,CAAC,CAAC;;ECTF;AACA,gBAAe,aAAa,CAAC,SAAS,KAAK,EAAE,WAAW,EAAE;EAC1D,EAAE,OAAO,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;EACxC,CAAC,CAAC;;ECDF;EACA;EACA;EACA;EACA;EACe,SAAS,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE;EACjE,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;EAC5B,IAAI,OAAO,GAAG,QAAQ,CAAC;EACvB,IAAI,QAAQ,GAAG,QAAQ,CAAC;EACxB,IAAI,QAAQ,GAAG,KAAK,CAAC;EACrB,GAAG;EACH,EAAE,IAAI,QAAQ,IAAI,IAAI,EAAE,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;EACzD,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;EAClB,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;EAChB,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EAC9D,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;EACxB,QAAQ,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;EAChE,IAAI,IAAI,QAAQ,IAAI,CAAC,QAAQ,EAAE;EAC/B,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;EACtD,MAAM,IAAI,GAAG,QAAQ,CAAC;EACtB,KAAK,MAAM,IAAI,QAAQ,EAAE;EACzB,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE;EACrC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;EAC5B,QAAQ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;EAC3B,OAAO;EACP,KAAK,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;EACzC,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;EACzB,KAAK;EACL,GAAG;EACH,EAAE,OAAO,MAAM,CAAC;EAChB;;EC/BA;EACA;AACA,cAAe,aAAa,CAAC,SAAS,MAAM,EAAE;EAC9C,EAAE,OAAO,IAAI,CAACA,SAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;EAC3C,CAAC,CAAC;;ECLF;EACA;EACe,SAAS,YAAY,CAAC,KAAK,EAAE;EAC5C,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;EAClB,EAAE,IAAI,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC;EACpC,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EAC9D,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;EACxB,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS;EACzC,IAAI,IAAI,CAAC,CAAC;EACV,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;EACrC,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM;EAC/C,KAAK;EACL,IAAI,IAAI,CAAC,KAAK,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;EAC5C,GAAG;EACH,EAAE,OAAO,MAAM,CAAC;EAChB;;ECdA;EACA;EACe,SAAS,KAAK,CAAC,KAAK,EAAE;EACrC,EAAE,IAAI,MAAM,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;EAC5D,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AAC7B;EACA,EAAE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;EAC/C,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;EACxC,GAAG;EACH,EAAE,OAAO,MAAM,CAAC;EAChB;;ECXA;EACA;AACA,YAAe,aAAa,CAAC,KAAK,CAAC;;ECHnC;EACA;EACA;EACe,SAAS,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE;EAC7C,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;EAClB,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;EAC7D,IAAI,IAAI,MAAM,EAAE;EAChB,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;EAClC,KAAK,MAAM;EACX,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;EACtC,KAAK;EACL,GAAG;EACH,EAAE,OAAO,MAAM,CAAC;EAChB;;ECfA;EACA;EACA;EACe,SAAS,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE;EACjD,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE;EACpB,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC;EACtB,IAAI,KAAK,GAAG,CAAC,CAAC;EACd,GAAG;EACH,EAAE,IAAI,CAAC,IAAI,EAAE;EACb,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;EACjC,GAAG;AACH;EACA,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;EAC7D,EAAE,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AAC5B;EACA,EAAE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,EAAE,GAAG,EAAE,EAAE,KAAK,IAAI,IAAI,EAAE;EACxD,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;EACvB,GAAG;AACH;EACA,EAAE,OAAO,KAAK,CAAC;EACf;;EClBA;EACA;EACe,SAAS,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE;EAC5C,EAAE,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;EAC5C,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;EAClB,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;EACnC,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE;EACrB,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;EAClD,GAAG;EACH,EAAE,OAAO,MAAM,CAAC;EAChB;;ECVA;EACe,SAAS,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE;EACnD,EAAE,OAAO,QAAQ,CAAC,MAAM,GAAGJ,GAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC;EAChD;;ECCA;EACe,SAAS,KAAK,CAAC,GAAG,EAAE;EACnC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,SAAS,IAAI,EAAE;EACtC,IAAI,IAAI,IAAI,GAAGA,GAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;EACnC,IAAIA,GAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,WAAW;EACnC,MAAM,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;EACjC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;EAClC,MAAM,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAACA,GAAC,EAAE,IAAI,CAAC,CAAC,CAAC;EACpD,KAAK,CAAC;EACN,GAAG,CAAC,CAAC;EACL,EAAE,OAAOA,GAAC,CAAC;EACX;;ECZA;EACA,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,SAAS,IAAI,EAAE;EACtF,EAAE,IAAI,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;EAChC,EAAEA,GAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,WAAW;EACjC,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;EAC5B,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE;EACrB,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;EACnC,MAAM,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,QAAQ,KAAK,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;EACvE,QAAQ,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;EACtB,OAAO;EACP,KAAK;EACL,IAAI,OAAO,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;EAClC,GAAG,CAAC;EACJ,CAAC,CAAC,CAAC;AACH;EACA;EACA,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,IAAI,EAAE;EACjD,EAAE,IAAI,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;EAChC,EAAEA,GAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,WAAW;EACjC,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;EAC5B,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;EACxD,IAAI,OAAO,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;EAClC,GAAG,CAAC;EACJ,CAAC,CAAC;;EC5BF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECAA;AAoBA;EACA;AACG,MAAC,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE;EAC1B;EACA,CAAC,CAAC,CAAC,GAAG,CAAC;;;;;;;;"} \ No newline at end of file diff --git a/src/node_modules/underscore/underscore.js b/src/node_modules/underscore/underscore.js new file mode 100644 index 0000000..825f710 --- /dev/null +++ b/src/node_modules/underscore/underscore.js @@ -0,0 +1,2042 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define('underscore', factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () { + var current = global._; + var exports = global._ = factory(); + exports.noConflict = function () { global._ = current; return exports; }; + }())); +}(this, (function () { + // Underscore.js 1.13.4 + // https://underscorejs.org + // (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors + // Underscore may be freely distributed under the MIT license. + + // Current version. + var VERSION = '1.13.4'; + + // Establish the root object, `window` (`self`) in the browser, `global` + // on the server, or `this` in some virtual machines. We use `self` + // instead of `window` for `WebWorker` support. + var root = (typeof self == 'object' && self.self === self && self) || + (typeof global == 'object' && global.global === global && global) || + Function('return this')() || + {}; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype; + var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + + // Create quick reference variables for speed access to core prototypes. + var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // Modern feature detection. + var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + + // All **ECMAScript 5+** native function implementations that we hope to use + // are declared here. + var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + + // Create references to these builtin functions because we override them. + var _isNaN = isNaN, + _isFinite = isFinite; + + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + // The largest integer that can be represented exactly. + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + + // Some functions take a variable number of arguments, or a few expected + // arguments at the beginning and then a variable number of values to operate + // on. This helper accumulates all remaining arguments past the function’s + // argument length (or an explicit `startIndex`), into an array that becomes + // the last argument. Similar to ES6’s "rest parameter". + function restArguments(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; + } + + // Is a given variable an object? + function isObject(obj) { + var type = typeof obj; + return type === 'function' || (type === 'object' && !!obj); + } + + // Is a given value equal to null? + function isNull(obj) { + return obj === null; + } + + // Is a given variable undefined? + function isUndefined(obj) { + return obj === void 0; + } + + // Is a given value a boolean? + function isBoolean(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; + } + + // Is a given value a DOM element? + function isElement(obj) { + return !!(obj && obj.nodeType === 1); + } + + // Internal function for creating a `toString`-based type tester. + function tagTester(name) { + var tag = '[object ' + name + ']'; + return function(obj) { + return toString.call(obj) === tag; + }; + } + + var isString = tagTester('String'); + + var isNumber = tagTester('Number'); + + var isDate = tagTester('Date'); + + var isRegExp = tagTester('RegExp'); + + var isError = tagTester('Error'); + + var isSymbol = tagTester('Symbol'); + + var isArrayBuffer = tagTester('ArrayBuffer'); + + var isFunction = tagTester('Function'); + + // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old + // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). + var nodelist = root.document && root.document.childNodes; + if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + isFunction = function(obj) { + return typeof obj == 'function' || false; + }; + } + + var isFunction$1 = isFunction; + + var hasObjectTag = tagTester('Object'); + + // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. + // In IE 11, the most common among them, this problem also applies to + // `Map`, `WeakMap` and `Set`. + var hasStringTagBug = ( + supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8))) + ), + isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map)); + + var isDataView = tagTester('DataView'); + + // In IE 10 - Edge 13, we need a different heuristic + // to determine whether an object is a `DataView`. + function ie10IsDataView(obj) { + return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer); + } + + var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView); + + // Is a given value an array? + // Delegates to ECMA5's native `Array.isArray`. + var isArray = nativeIsArray || tagTester('Array'); + + // Internal function to check whether `key` is an own property name of `obj`. + function has$1(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); + } + + var isArguments = tagTester('Arguments'); + + // Define a fallback version of the method in browsers (ahem, IE < 9), where + // there isn't any inspectable "Arguments" type. + (function() { + if (!isArguments(arguments)) { + isArguments = function(obj) { + return has$1(obj, 'callee'); + }; + } + }()); + + var isArguments$1 = isArguments; + + // Is a given object a finite number? + function isFinite$1(obj) { + return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj)); + } + + // Is the given value `NaN`? + function isNaN$1(obj) { + return isNumber(obj) && _isNaN(obj); + } + + // Predicate-generating function. Often useful outside of Underscore. + function constant(value) { + return function() { + return value; + }; + } + + // Common internal logic for `isArrayLike` and `isBufferLike`. + function createSizePropertyCheck(getSizeProperty) { + return function(collection) { + var sizeProperty = getSizeProperty(collection); + return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX; + } + } + + // Internal helper to generate a function to obtain property `key` from `obj`. + function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + } + + // Internal helper to obtain the `byteLength` property of an object. + var getByteLength = shallowProperty('byteLength'); + + // Internal helper to determine whether we should spend extensive checks against + // `ArrayBuffer` et al. + var isBufferLike = createSizePropertyCheck(getByteLength); + + // Is a given value a typed array? + var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; + function isTypedArray(obj) { + // `ArrayBuffer.isView` is the most future-proof, so use it when available. + // Otherwise, fall back on the above regular expression. + return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) : + isBufferLike(obj) && typedArrayPattern.test(toString.call(obj)); + } + + var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false); + + // Internal helper to obtain the `length` property of an object. + var getLength = shallowProperty('length'); + + // Internal helper to create a simple lookup structure. + // `collectNonEnumProps` used to depend on `_.contains`, but this led to + // circular imports. `emulatedSet` is a one-off solution that only works for + // arrays of strings. + function emulatedSet(keys) { + var hash = {}; + for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; + return { + contains: function(key) { return hash[key] === true; }, + push: function(key) { + hash[key] = true; + return keys.push(key); + } + }; + } + + // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't + // be iterated by `for key in ...` and thus missed. Extends `keys` in place if + // needed. + function collectNonEnumProps(obj, keys) { + keys = emulatedSet(keys); + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (isFunction$1(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { + keys.push(prop); + } + } + } + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys`. + function keys(obj) { + if (!isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (has$1(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + } + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + function isEmpty(obj) { + if (obj == null) return true; + // Skip the more expensive `toString`-based type checks if `obj` has no + // `.length`. + var length = getLength(obj); + if (typeof length == 'number' && ( + isArray(obj) || isString(obj) || isArguments$1(obj) + )) return length === 0; + return getLength(keys(obj)) === 0; + } + + // Returns whether an object has a given set of `key:value` pairs. + function isMatch(object, attrs) { + var _keys = keys(attrs), length = _keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = _keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + } + + // If Underscore is called as a function, it returns a wrapped object that can + // be used OO-style. This wrapper holds altered versions of all functions added + // through `_.mixin`. Wrapped objects may be chained. + function _$1(obj) { + if (obj instanceof _$1) return obj; + if (!(this instanceof _$1)) return new _$1(obj); + this._wrapped = obj; + } + + _$1.VERSION = VERSION; + + // Extracts the result from a wrapped and chained object. + _$1.prototype.value = function() { + return this._wrapped; + }; + + // Provide unwrapping proxies for some methods used in engine operations + // such as arithmetic and JSON stringification. + _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value; + + _$1.prototype.toString = function() { + return String(this._wrapped); + }; + + // Internal function to wrap or shallow-copy an ArrayBuffer, + // typed array or DataView to a new view, reusing the buffer. + function toBufferView(bufferSource) { + return new Uint8Array( + bufferSource.buffer || bufferSource, + bufferSource.byteOffset || 0, + getByteLength(bufferSource) + ); + } + + // We use this string twice, so give it a name for minification. + var tagDataView = '[object DataView]'; + + // Internal recursive comparison function for `_.isEqual`. + function eq(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); + } + + // Internal recursive comparison function for `_.isEqual`. + function deepEq(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof _$1) a = a._wrapped; + if (b instanceof _$1) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + // Work around a bug in IE 10 - Edge 13. + if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) { + if (!isDataView$1(b)) return false; + className = tagDataView; + } + switch (className) { + // These types are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); + case '[object ArrayBuffer]': + case tagDataView: + // Coerce to typed array so we can fall through. + return deepEq(toBufferView(a), toBufferView(b), aStack, bStack); + } + + var areArrays = className === '[object Array]'; + if (!areArrays && isTypedArray$1(a)) { + var byteLength = getByteLength(a); + if (byteLength !== getByteLength(b)) return false; + if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; + areArrays = true; + } + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor && + isFunction$1(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var _keys = keys(a), key; + length = _keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = _keys[length]; + if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; + } + + // Perform a deep comparison to check if two objects are equal. + function isEqual(a, b) { + return eq(a, b); + } + + // Retrieve all the enumerable property names of an object. + function allKeys(obj) { + if (!isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + } + + // Since the regular `Object.prototype.toString` type tests don't work for + // some types in IE 11, we use a fingerprinting heuristic instead, based + // on the methods. It's not great, but it's the best we got. + // The fingerprint method lists are defined below. + function ie11fingerprint(methods) { + var length = getLength(methods); + return function(obj) { + if (obj == null) return false; + // `Map`, `WeakMap` and `Set` have no enumerable keys. + var keys = allKeys(obj); + if (getLength(keys)) return false; + for (var i = 0; i < length; i++) { + if (!isFunction$1(obj[methods[i]])) return false; + } + // If we are testing against `WeakMap`, we need to ensure that + // `obj` doesn't have a `forEach` method in order to distinguish + // it from a regular `Map`. + return methods !== weakMapMethods || !isFunction$1(obj[forEachName]); + }; + } + + // In the interest of compact minification, we write + // each string in the fingerprints only once. + var forEachName = 'forEach', + hasName = 'has', + commonInit = ['clear', 'delete'], + mapTail = ['get', hasName, 'set']; + + // `Map`, `WeakMap` and `Set` each have slightly different + // combinations of the above sublists. + var mapMethods = commonInit.concat(forEachName, mapTail), + weakMapMethods = commonInit.concat(mapTail), + setMethods = ['add'].concat(commonInit, forEachName, hasName); + + var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map'); + + var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap'); + + var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set'); + + var isWeakSet = tagTester('WeakSet'); + + // Retrieve the values of an object's properties. + function values(obj) { + var _keys = keys(obj); + var length = _keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[_keys[i]]; + } + return values; + } + + // Convert an object into a list of `[key, value]` pairs. + // The opposite of `_.object` with one argument. + function pairs(obj) { + var _keys = keys(obj); + var length = _keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [_keys[i], obj[_keys[i]]]; + } + return pairs; + } + + // Invert the keys and values of an object. The values must be serializable. + function invert(obj) { + var result = {}; + var _keys = keys(obj); + for (var i = 0, length = _keys.length; i < length; i++) { + result[obj[_keys[i]]] = _keys[i]; + } + return result; + } + + // Return a sorted list of the function names available on the object. + function functions(obj) { + var names = []; + for (var key in obj) { + if (isFunction$1(obj[key])) names.push(key); + } + return names.sort(); + } + + // An internal function for creating assigner functions. + function createAssigner(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + } + + // Extend a given object with all the properties in passed-in object(s). + var extend = createAssigner(allKeys); + + // Assigns a given object with all the own properties in the passed-in + // object(s). + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + var extendOwn = createAssigner(keys); + + // Fill in a given object with default properties. + var defaults = createAssigner(allKeys, true); + + // Create a naked function reference for surrogate-prototype-swapping. + function ctor() { + return function(){}; + } + + // An internal function for creating a new object that inherits from another. + function baseCreate(prototype) { + if (!isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + var Ctor = ctor(); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + } + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + function create(prototype, props) { + var result = baseCreate(prototype); + if (props) extendOwn(result, props); + return result; + } + + // Create a (shallow-cloned) duplicate of an object. + function clone(obj) { + if (!isObject(obj)) return obj; + return isArray(obj) ? obj.slice() : extend({}, obj); + } + + // Invokes `interceptor` with the `obj` and then returns `obj`. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + function tap(obj, interceptor) { + interceptor(obj); + return obj; + } + + // Normalize a (deep) property `path` to array. + // Like `_.iteratee`, this function can be customized. + function toPath$1(path) { + return isArray(path) ? path : [path]; + } + _$1.toPath = toPath$1; + + // Internal wrapper for `_.toPath` to enable minification. + // Similar to `cb` for `_.iteratee`. + function toPath(path) { + return _$1.toPath(path); + } + + // Internal function to obtain a nested property in `obj` along `path`. + function deepGet(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; + } + + // Get the value of the (deep) property on `path` from `object`. + // If any property in `path` does not exist or if the value is + // `undefined`, return `defaultValue` instead. + // The `path` is normalized through `_.toPath`. + function get(object, path, defaultValue) { + var value = deepGet(object, toPath(path)); + return isUndefined(value) ? defaultValue : value; + } + + // Shortcut function for checking if an object has a given property directly on + // itself (in other words, not on a prototype). Unlike the internal `has` + // function, this public version can also traverse nested properties. + function has(obj, path) { + path = toPath(path); + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (!has$1(obj, key)) return false; + obj = obj[key]; + } + return !!length; + } + + // Keep the identity function around for default iteratees. + function identity(value) { + return value; + } + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + function matcher(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; + } + + // Creates a function that, when passed an object, will traverse that object’s + // properties down the given `path`, specified as an array of keys or indices. + function property(path) { + path = toPath(path); + return function(obj) { + return deepGet(obj, path); + }; + } + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + function optimizeCb(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + } + + // An internal function to generate callbacks that can be applied to each + // element in a collection, returning the desired result — either `_.identity`, + // an arbitrary callback, a property matcher, or a property accessor. + function baseIteratee(value, context, argCount) { + if (value == null) return identity; + if (isFunction$1(value)) return optimizeCb(value, context, argCount); + if (isObject(value) && !isArray(value)) return matcher(value); + return property(value); + } + + // External wrapper for our callback generator. Users may customize + // `_.iteratee` if they want additional predicate/iteratee shorthand styles. + // This abstraction hides the internal-only `argCount` argument. + function iteratee(value, context) { + return baseIteratee(value, context, Infinity); + } + _$1.iteratee = iteratee; + + // The function we call internally to generate a callback. It invokes + // `_.iteratee` if overridden, otherwise `baseIteratee`. + function cb(value, context, argCount) { + if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context); + return baseIteratee(value, context, argCount); + } + + // Returns the results of applying the `iteratee` to each element of `obj`. + // In contrast to `_.map` it returns an object. + function mapObject(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = keys(obj), + length = _keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = _keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + } + + // Predicate-generating function. Often useful outside of Underscore. + function noop(){} + + // Generates a function for a given object that returns a given property. + function propertyOf(obj) { + if (obj == null) return noop; + return function(path) { + return get(obj, path); + }; + } + + // Run a function **n** times. + function times(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; + } + + // Return a random integer between `min` and `max` (inclusive). + function random(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + } + + // A (possibly faster) way to get the current timestamp as an integer. + var now = Date.now || function() { + return new Date().getTime(); + }; + + // Internal helper to generate functions for escaping and unescaping strings + // to/from HTML interpolation. + function createEscaper(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + } + + // Internal list of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + + // Function for escaping strings to HTML interpolation. + var _escape = createEscaper(escapeMap); + + // Internal list of HTML entities for unescaping. + var unescapeMap = invert(escapeMap); + + // Function for unescaping strings from HTML interpolation. + var _unescape = createEscaper(unescapeMap); + + // By default, Underscore uses ERB-style template delimiters. Change the + // following template settings to use alternative delimiters. + var templateSettings = _$1.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g + }; + + // When customizing `_.templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + + function escapeChar(match) { + return '\\' + escapes[match]; + } + + // In order to prevent third-party code injection through + // `_.templateSettings.variable`, we test it against the following regular + // expression. It is intentionally a bit more liberal than just matching valid + // identifiers, but still prevents possible loopholes through defaults or + // destructuring assignment. + var bareIdentifier = /^\s*(\w|\$)+\s*$/; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + // NB: `oldSettings` only exists for backwards compatibility. + function template(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = defaults({}, settings, _$1.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(argument, '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _$1); + }; + + // Provide the compiled source as a convenience for precompilation. + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; + } + + // Traverses the children of `obj` along `path`. If a child is a function, it + // is invoked with its parent as context. Returns the value of the final + // child, or `fallback` if any child is undefined. + function result(obj, path, fallback) { + path = toPath(path); + var length = path.length; + if (!length) { + return isFunction$1(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = isFunction$1(prop) ? prop.call(obj) : prop; + } + return obj; + } + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + } + + // Start chaining a wrapped Underscore object. + function chain(obj) { + var instance = _$1(obj); + instance._chain = true; + return instance; + } + + // Internal function to execute `sourceFunc` bound to `context` with optional + // `args`. Determines whether to execute a function as a constructor or as a + // normal function. + function executeBound(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (isObject(result)) return result; + return self; + } + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. `_` acts + // as a placeholder by default, allowing any combination of arguments to be + // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. + var partial = restArguments(function(func, boundArgs) { + var placeholder = partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; + }); + + partial.placeholder = _$1; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). + var bind = restArguments(function(func, context, args) { + if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; + }); + + // Internal helper for collection methods to determine whether a collection + // should be iterated as an array or as an object. + // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var isArrayLike = createSizePropertyCheck(getLength); + + // Internal implementation of a recursive `flatten` function. + function flatten$1(input, depth, strict, output) { + output = output || []; + if (!depth && depth !== 0) { + depth = Infinity; + } else if (depth <= 0) { + return output.concat(input); + } + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) { + // Flatten current level of array or arguments object. + if (depth > 1) { + flatten$1(value, depth - 1, strict, output); + idx = output.length; + } else { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; + } + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + var bindAll = restArguments(function(obj, keys) { + keys = flatten$1(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = bind(obj[key], obj); + } + return obj; + }); + + // Memoize an expensive function by storing its results. + function memoize(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!has$1(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; + } + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + var delay = restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); + }); + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + var defer = partial(delay, _$1, 1); + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var _now = now(); + if (!previous && options.leading === false) previous = _now; + var remaining = wait - (_now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = _now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; + } + + // When a sequence of calls of the returned function ends, the argument + // function is triggered. The end of a sequence is defined by the `wait` + // parameter. If `immediate` is passed, the argument function will be + // triggered at the beginning of the sequence instead of at the end. + function debounce(func, wait, immediate) { + var timeout, previous, args, result, context; + + var later = function() { + var passed = now() - previous; + if (wait > passed) { + timeout = setTimeout(later, wait - passed); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + // This check is needed because `func` can recursively invoke `debounced`. + if (!timeout) args = context = null; + } + }; + + var debounced = restArguments(function(_args) { + context = this; + args = _args; + previous = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + if (immediate) result = func.apply(context, args); + } + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = args = context = null; + }; + + return debounced; + } + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + function wrap(func, wrapper) { + return partial(wrapper, func); + } + + // Returns a negated version of the passed-in predicate. + function negate(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; + } + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + function compose() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; + } + + // Returns a function that will only be executed on and after the Nth call. + function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + } + + // Returns a function that will only be executed up to (but not including) the + // Nth call. + function before(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + } + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + var once = partial(before, 2); + + // Returns the first key on an object that passes a truth test. + function findKey(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = keys(obj), key; + for (var i = 0, length = _keys.length; i < length; i++) { + key = _keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + } + + // Internal function to generate `_.findIndex` and `_.findLastIndex`. + function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; + } + + // Returns the first index on an array-like that passes a truth test. + var findIndex = createPredicateIndexFinder(1); + + // Returns the last index on an array-like that passes a truth test. + var findLastIndex = createPredicateIndexFinder(-1); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + function sortedIndex(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; + } + + // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. + function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), isNaN$1); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + } + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + var indexOf = createIndexFinder(1, findIndex, sortedIndex); + + // Return the position of the last occurrence of an item in an array, + // or -1 if the item is not included in the array. + var lastIndexOf = createIndexFinder(-1, findLastIndex); + + // Return the first value which passes a truth test. + function find(obj, predicate, context) { + var keyFinder = isArrayLike(obj) ? findIndex : findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; + } + + // Convenience version of a common use case of `_.find`: getting the first + // object containing specific `key:value` pairs. + function findWhere(obj, attrs) { + return find(obj, matcher(attrs)); + } + + // The cornerstone for collection functions, an `each` + // implementation, aka `forEach`. + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + function each(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + for (i = 0, length = _keys.length; i < length; i++) { + iteratee(obj[_keys[i]], _keys[i], obj); + } + } + return obj; + } + + // Return the results of applying the iteratee to each element. + function map(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + } + + // Internal helper to create a reducing function, iterating left or right. + function createReduce(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[_keys ? _keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = _keys ? _keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); + }; + } + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. + var reduce = createReduce(1); + + // The right-associative version of reduce, also known as `foldr`. + var reduceRight = createReduce(-1); + + // Return all the elements that pass a truth test. + function filter(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; + } + + // Return all the elements for which a truth test fails. + function reject(obj, predicate, context) { + return filter(obj, negate(cb(predicate)), context); + } + + // Determine whether all of the elements pass a truth test. + function every(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + } + + // Determine if at least one element in the object passes a truth test. + function some(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; + } + + // Determine if the array or object contains a given item (using `===`). + function contains(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return indexOf(obj, item, fromIndex) >= 0; + } + + // Invoke a method (with arguments) on every item in a collection. + var invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (isFunction$1(path)) { + func = path; + } else { + path = toPath(path); + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); + }); + + // Convenience version of a common use case of `_.map`: fetching a property. + function pluck(obj, key) { + return map(obj, property(key)); + } + + // Convenience version of a common use case of `_.filter`: selecting only + // objects containing specific `key:value` pairs. + function where(obj, attrs) { + return filter(obj, matcher(attrs)); + } + + // Return the maximum element (or element-based computation). + function max(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; + } + + // Return the minimum element (or element-based computation). + function min(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || (computed === Infinity && result === Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; + } + + // Safely create a real, live array from anything iterable. + var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; + function toArray(obj) { + if (!obj) return []; + if (isArray(obj)) return slice.call(obj); + if (isString(obj)) { + // Keep surrogate pair characters together. + return obj.match(reStrSymbol); + } + if (isArrayLike(obj)) return map(obj, identity); + return values(obj); + } + + // Sample **n** random values from a collection using the modern version of the + // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `_.map`. + function sample(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = values(obj); + return obj[random(obj.length - 1)]; + } + var sample = toArray(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); + } + + // Shuffle a collection. + function shuffle(obj) { + return sample(obj, Infinity); + } + + // Sort the object's values by a criterion produced by an iteratee. + function sortBy(obj, iteratee, context) { + var index = 0; + iteratee = cb(iteratee, context); + return pluck(map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + } + + // An internal function used for aggregate "group by" operations. + function group(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = cb(iteratee, context); + each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; + } + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + var groupBy = group(function(result, value, key) { + if (has$1(result, key)) result[key].push(value); else result[key] = [value]; + }); + + // Indexes the object's values by a criterion, similar to `_.groupBy`, but for + // when you know that your index values will be unique. + var indexBy = group(function(result, value, key) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + var countBy = group(function(result, value, key) { + if (has$1(result, key)) result[key]++; else result[key] = 1; + }); + + // Split a collection into two arrays: one whose elements all pass the given + // truth test, and one whose elements all do not pass the truth test. + var partition = group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); + }, true); + + // Return the number of elements in a collection. + function size(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : keys(obj).length; + } + + // Internal `_.pick` helper function to determine whether `key` is an enumerable + // property name of `obj`. + function keyInObj(value, key, obj) { + return key in obj; + } + + // Return a copy of the object only containing the allowed properties. + var pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (isFunction$1(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); + keys = allKeys(obj); + } else { + iteratee = keyInObj; + keys = flatten$1(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }); + + // Return a copy of the object without the disallowed properties. + var omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (isFunction$1(iteratee)) { + iteratee = negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = map(flatten$1(keys, false, false), String); + iteratee = function(value, key) { + return !contains(keys, key); + }; + } + return pick(obj, iteratee, context); + }); + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. + function initial(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); + } + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. The **guard** check allows it to work with `_.map`. + function first(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[0]; + return initial(array, array.length - n); + } + + // Returns everything but the first entry of the `array`. Especially useful on + // the `arguments` object. Passing an **n** will return the rest N values in the + // `array`. + function rest(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); + } + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. + function last(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return rest(array, Math.max(0, array.length - n)); + } + + // Trim out all falsy values from an array. + function compact(array) { + return filter(array, Boolean); + } + + // Flatten out an array, either recursively (by default), or up to `depth`. + // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. + function flatten(array, depth) { + return flatten$1(array, depth, false); + } + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + var difference = restArguments(function(array, rest) { + rest = flatten$1(rest, true, true); + return filter(array, function(value){ + return !contains(rest, value); + }); + }); + + // Return a version of the array that does not contain the specified value(s). + var without = restArguments(function(array, otherArrays) { + return difference(array, otherArrays); + }); + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // The faster algorithm will not work with an iteratee if the iteratee + // is not a one-to-one function, so providing an iteratee will disable + // the faster algorithm. + function uniq(array, isSorted, iteratee, context) { + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!contains(result, value)) { + result.push(value); + } + } + return result; + } + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + var union = restArguments(function(arrays) { + return uniq(flatten$1(arrays, true, true)); + }); + + // Produce an array that contains every item shared between all the + // passed-in arrays. + function intersection(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; + } + + // Complement of zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices. + function unzip(array) { + var length = (array && max(array, getLength).length) || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = pluck(array, index); + } + return result; + } + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + var zip = restArguments(unzip); + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. Passing by pairs is the reverse of `_.pairs`. + function object(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + } + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](https://docs.python.org/library/functions.html#range). + function range(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; + } + + // Chunk a single array into multiple arrays, each containing `count` or fewer + // items. + function chunk(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; + } + + // Helper function to continue chaining intermediate results. + function chainResult(instance, obj) { + return instance._chain ? _$1(obj).chain() : obj; + } + + // Add your own custom functions to the Underscore object. + function mixin(obj) { + each(functions(obj), function(name) { + var func = _$1[name] = obj[name]; + _$1.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return chainResult(this, func.apply(_$1, args)); + }; + }); + return _$1; + } + + // Add all mutator `Array` functions to the wrapper. + each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) { + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) { + delete obj[0]; + } + } + return chainResult(this, obj); + }; + }); + + // Add all accessor `Array` functions to the wrapper. + each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) obj = method.apply(obj, arguments); + return chainResult(this, obj); + }; + }); + + // Named Exports + + var allExports = { + __proto__: null, + VERSION: VERSION, + restArguments: restArguments, + isObject: isObject, + isNull: isNull, + isUndefined: isUndefined, + isBoolean: isBoolean, + isElement: isElement, + isString: isString, + isNumber: isNumber, + isDate: isDate, + isRegExp: isRegExp, + isError: isError, + isSymbol: isSymbol, + isArrayBuffer: isArrayBuffer, + isDataView: isDataView$1, + isArray: isArray, + isFunction: isFunction$1, + isArguments: isArguments$1, + isFinite: isFinite$1, + isNaN: isNaN$1, + isTypedArray: isTypedArray$1, + isEmpty: isEmpty, + isMatch: isMatch, + isEqual: isEqual, + isMap: isMap, + isWeakMap: isWeakMap, + isSet: isSet, + isWeakSet: isWeakSet, + keys: keys, + allKeys: allKeys, + values: values, + pairs: pairs, + invert: invert, + functions: functions, + methods: functions, + extend: extend, + extendOwn: extendOwn, + assign: extendOwn, + defaults: defaults, + create: create, + clone: clone, + tap: tap, + get: get, + has: has, + mapObject: mapObject, + identity: identity, + constant: constant, + noop: noop, + toPath: toPath$1, + property: property, + propertyOf: propertyOf, + matcher: matcher, + matches: matcher, + times: times, + random: random, + now: now, + escape: _escape, + unescape: _unescape, + templateSettings: templateSettings, + template: template, + result: result, + uniqueId: uniqueId, + chain: chain, + iteratee: iteratee, + partial: partial, + bind: bind, + bindAll: bindAll, + memoize: memoize, + delay: delay, + defer: defer, + throttle: throttle, + debounce: debounce, + wrap: wrap, + negate: negate, + compose: compose, + after: after, + before: before, + once: once, + findKey: findKey, + findIndex: findIndex, + findLastIndex: findLastIndex, + sortedIndex: sortedIndex, + indexOf: indexOf, + lastIndexOf: lastIndexOf, + find: find, + detect: find, + findWhere: findWhere, + each: each, + forEach: each, + map: map, + collect: map, + reduce: reduce, + foldl: reduce, + inject: reduce, + reduceRight: reduceRight, + foldr: reduceRight, + filter: filter, + select: filter, + reject: reject, + every: every, + all: every, + some: some, + any: some, + contains: contains, + includes: contains, + include: contains, + invoke: invoke, + pluck: pluck, + where: where, + max: max, + min: min, + shuffle: shuffle, + sample: sample, + sortBy: sortBy, + groupBy: groupBy, + indexBy: indexBy, + countBy: countBy, + partition: partition, + toArray: toArray, + size: size, + pick: pick, + omit: omit, + first: first, + head: first, + take: first, + initial: initial, + last: last, + rest: rest, + tail: rest, + drop: rest, + compact: compact, + flatten: flatten, + without: without, + uniq: uniq, + unique: uniq, + union: union, + intersection: intersection, + difference: difference, + unzip: unzip, + transpose: unzip, + zip: zip, + object: object, + range: range, + chunk: chunk, + mixin: mixin, + 'default': _$1 + }; + + // Default Export + + // Add all of the Underscore functions to the wrapper object. + var _ = mixin(allExports); + // Legacy Node.js API. + _._ = _; + + return _; + +}))); +//# sourceMappingURL=underscore-umd.js.map diff --git a/src/package.json b/src/package.json new file mode 100644 index 0000000..70390c5 --- /dev/null +++ b/src/package.json @@ -0,0 +1,10 @@ +{ + "name": "wifi-setup", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "crontab": "^1.4.2", + "readline-sync": "^1.4.10" + } +} diff --git a/src/resources/reset_device/button_chime.wav b/src/resources/reset_device/button_chime.wav new file mode 100644 index 0000000..7123fe1 Binary files /dev/null and b/src/resources/reset_device/button_chime.wav differ diff --git a/src/resources/reset_device/connection_monitor.py b/src/resources/reset_device/connection_monitor.py new file mode 100644 index 0000000..61d5cd4 --- /dev/null +++ b/src/resources/reset_device/connection_monitor.py @@ -0,0 +1,39 @@ +import time +import sys +import os +import reset_lib + +no_conn_counter = 0 +consecutive_active_reports = 0 +config_hash = reset_lib.config_file_hash() + +# If auto_config is set to 0 in /etc/raspiwifi/raspiwifi.conf exit this script +if config_hash['auto_config'] == "0": + sys.exit() +else: + # Main connection monitoring loop at 10 second interval + while True: + time.sleep(10) + + # If iwconfig report no association with an AP add 10 to the "No + # Connection Couter" + if reset_lib.is_wifi_active() == False: + no_conn_counter += 10 + consecutive_active_reports = 0 + # If iwconfig report association with an AP add 1 to the + # consecutive_active_reports counter and 10 to the no_conn_counter + else: + consecutive_active_reports += 1 + no_conn_counter += 10 + # Since wpa_supplicant seems to breifly associate with an AP for + # 6-8 seconds to check the network key the below will reset the + # no_conn_counter to 0 only if two 10 second checks have come up active. + if consecutive_active_reports >= 2: + no_conn_counter = 0 + consecutive_active_reports = 0 + + # If the number of seconds not associated with an AP is greater or + # equal to the auto_config_delay specified in the /etc/raspiwifi/raspiwifi.conf + # trigger a reset into AP Host (Configuration) mode. + if no_conn_counter >= int(config_hash['auto_config_delay']): + reset_lib.reset_to_host_mode() diff --git a/src/resources/reset_device/manual_reset.py b/src/resources/reset_device/manual_reset.py new file mode 100644 index 0000000..9a1c570 --- /dev/null +++ b/src/resources/reset_device/manual_reset.py @@ -0,0 +1,3 @@ +import reset_lib + +reset_lib.reset_to_host_mode() diff --git a/src/resources/reset_device/reset.py b/src/resources/reset_device/reset.py new file mode 100644 index 0000000..950db04 --- /dev/null +++ b/src/resources/reset_device/reset.py @@ -0,0 +1,40 @@ +import RPi.GPIO as GPIO +import os +import time +import subprocess +import reset_lib + +GPIO.setmode(GPIO.BCM) +GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) + +counter = 0 +serial_last_four = subprocess.check_output(['cat', '/proc/cpuinfo'])[-5:-1].decode('utf-8') +config_hash = reset_lib.config_file_hash() +ssid_prefix = config_hash['ssid_prefix'] + " " +reboot_required = False + + +reboot_required = reset_lib.wpa_check_activate(config_hash['wpa_enabled'], config_hash['wpa_key']) + +reboot_required = reset_lib.update_ssid(ssid_prefix, serial_last_four) + +if reboot_required == True: + os.system('reboot') + +# This is the main logic loop waiting for a button to be pressed on GPIO 18 for 10 seconds. +# If that happens the device will reset to its AP Host mode allowing for reconfiguration on a new network. +while True: + while GPIO.input(18) == 1: + time.sleep(1) + counter = counter + 1 + + print(counter) + + if counter == 9: + reset_lib.reset_to_host_mode() + + if GPIO.input(18) == 0: + counter = 0 + break + + time.sleep(1) diff --git a/src/resources/reset_device/reset_lib.py b/src/resources/reset_device/reset_lib.py new file mode 100644 index 0000000..969993a --- /dev/null +++ b/src/resources/reset_device/reset_lib.py @@ -0,0 +1,93 @@ +import os +import fileinput +import subprocess + +def config_file_hash(): + config_file = open('/etc/raspiwifi/raspiwifi.conf') + config_hash = {} + + for line in config_file: + line_key = line.split("=")[0] + line_value = line.split("=")[1].rstrip() + config_hash[line_key] = line_value + + return config_hash + +def wpa_check_activate(wpa_enabled, wpa_key): + wpa_active = False + reboot_required = False + + with open('/etc/hostapd/hostapd.conf') as hostapd_conf: + for line in hostapd_conf: + if 'wpa_passphrase' in line: + wpa_active = True + + if wpa_enabled == '1' and wpa_active == False: + reboot_required = True + os.system('cp /usr/lib/raspiwifi/reset_device/static_files/hostapd.conf.wpa /etc/hostapd/hostapd.conf') + + if wpa_enabled == '1': + with fileinput.FileInput('/etc/hostapd/hostapd.conf', inplace=True) as hostapd_conf: + for line in hostapd_conf: + if 'wpa_passphrase' in line: + if 'wpa_passphrase=' + wpa_key not in line: + print('wpa_passphrase=' + wpa_key) + os.system('reboot') + else: + print(line, end = '') + else: + print(line, end = '') + + if wpa_enabled == '0' and wpa_active == True: + reboot_required = True + os.system('cp /usr/lib/raspiwifi/reset_device/static_files/hostapd.conf.nowpa /etc/hostapd/hostapd.conf') + + return reboot_required + +def update_ssid(ssid_prefix, serial_last_four): + reboot_required = False + ssid_correct = False + + with open('/etc/hostapd/hostapd.conf') as hostapd_conf: + for line in hostapd_conf: + if ssid_prefix in line: + ssid_correct = True + + if ssid_correct == False: + with fileinput.FileInput("/etc/hostapd/hostapd.conf", inplace=True) as file: + for line in file: + if 'ssid=' in line: + line_array = line.split('=') + line_array[1] = ssid_prefix + ' ' + serial_last_four + print(line_array[0] + '=' + line_array[1]) + else: + print(line, end = '') + + reboot_required = True + + return reboot_required + +def is_wifi_active(): + iwconfig_out = subprocess.check_output(['iwconfig']).decode('utf-8') + wifi_active = True + + if "Access Point: Not-Associated" in iwconfig_out: + wifi_active = False + + return wifi_active + +def reset_to_host_mode(): + if not os.path.isfile('/etc/raspiwifi/host_mode'): + os.system('aplay /usr/lib/raspiwifi/reset_device/button_chime.wav') + os.system('rm -f /etc/wpa_supplicant/wpa_supplicant.conf') + os.system('rm -f /home/pi/Projects/RaspiWifi/tmp/*') + os.system('rm /etc/cron.raspiwifi/apclient_bootstrapper') + os.system('cp /usr/lib/raspiwifi/reset_device/static_files/aphost_bootstrapper /etc/cron.raspiwifi/') + os.system('chmod +x /etc/cron.raspiwifi/aphost_bootstrapper') + os.system('mv /etc/dhcpcd.conf /etc/dhcpcd.conf.original') + os.system('cp /usr/lib/raspiwifi/reset_device/static_files/dhcpcd.conf /etc/') + os.system('mv /etc/dnsmasq.conf /etc/dnsmasq.conf.original') + os.system('cp /usr/lib/raspiwifi/reset_device/static_files/dnsmasq.conf /etc/') + os.system('cp /usr/lib/raspiwifi/reset_device/static_files/dhcpcd.conf /etc/') + os.system('touch /etc/raspiwifi/host_mode') + os.system('reboot') diff --git a/src/resources/reset_device/static_files/apclient_bootstrapper b/src/resources/reset_device/static_files/apclient_bootstrapper new file mode 100644 index 0000000..51a9e98 --- /dev/null +++ b/src/resources/reset_device/static_files/apclient_bootstrapper @@ -0,0 +1,5 @@ +#!/bin/bash + +python3 /usr/lib/raspiwifi/reset_device/reset.py & + +python3 /usr/lib/raspiwifi/reset_device/connection_monitor.py & diff --git a/src/resources/reset_device/static_files/aphost_bootstrapper b/src/resources/reset_device/static_files/aphost_bootstrapper new file mode 100644 index 0000000..6911a35 --- /dev/null +++ b/src/resources/reset_device/static_files/aphost_bootstrapper @@ -0,0 +1,7 @@ +#!/bin/bash + +python3 /usr/lib/raspiwifi/reset_device/reset.py & + +python3 /usr/lib/raspiwifi/configuration_app/app.py & + +hostapd -dd /etc/hostapd/hostapd.conf & diff --git a/src/resources/reset_device/static_files/dhcpcd.conf b/src/resources/reset_device/static_files/dhcpcd.conf new file mode 100644 index 0000000..8de1785 --- /dev/null +++ b/src/resources/reset_device/static_files/dhcpcd.conf @@ -0,0 +1,2 @@ +interface wlan0 +static ip_address=10.0.0.1/24 diff --git a/src/resources/reset_device/static_files/dnsmasq.conf b/src/resources/reset_device/static_files/dnsmasq.conf new file mode 100644 index 0000000..7ee6b80 --- /dev/null +++ b/src/resources/reset_device/static_files/dnsmasq.conf @@ -0,0 +1,11 @@ +interface=wlan0 +dhcp-range=10.0.0.10,10.0.0.15,12h +#dhcp-option=option:router,10.0.0.1 +#dhcp-option=option:netmask,255.255.255.0 + +# Delays sending DHCPOFFER and proxydhcp replies for at least the specified number of seconds. +dhcp-mac=set:client_is_a_pi,B8:27:EB:*:*:* +dhcp-reply-delay=tag:client_is_a_pi,2 + +address=/raspiwifisetup.com/10.0.0.1 +address=/idliketoconfigurethewifionthisdevicenowplease.com/10.0.0.1 diff --git a/src/resources/reset_device/static_files/hostapd.conf.nowpa b/src/resources/reset_device/static_files/hostapd.conf.nowpa new file mode 100644 index 0000000..2613e79 --- /dev/null +++ b/src/resources/reset_device/static_files/hostapd.conf.nowpa @@ -0,0 +1,4 @@ +interface=wlan0 +driver=nl80211 +ssid=temp-ssid +channel=1 \ No newline at end of file diff --git a/src/resources/reset_device/static_files/hostapd.conf.wpa b/src/resources/reset_device/static_files/hostapd.conf.wpa new file mode 100644 index 0000000..39fd197 --- /dev/null +++ b/src/resources/reset_device/static_files/hostapd.conf.wpa @@ -0,0 +1,9 @@ +interface=wlan0 +driver=nl80211 +ssid=temp-ssid +channel=1 +auth_algs=1 +wpa=2 +wpa_key_mgmt=WPA-PSK +rsn_pairwise=CCMP +wpa_passphrase=0 \ No newline at end of file diff --git a/src/resources/reset_device/static_files/raspiwifi.conf b/src/resources/reset_device/static_files/raspiwifi.conf new file mode 100644 index 0000000..84faf70 --- /dev/null +++ b/src/resources/reset_device/static_files/raspiwifi.conf @@ -0,0 +1,7 @@ +ssid_prefix=RaspiWiFi Setup +auto_config=0 +auto_config_delay=300 +ssl_enabled=0 +server_port=80 +wpa_enabled=0 +wpa_key=0 \ No newline at end of file diff --git a/src/resources/reset_device/static_files/wpa_supplicant.conf.default b/src/resources/reset_device/static_files/wpa_supplicant.conf.default new file mode 100644 index 0000000..71912ec --- /dev/null +++ b/src/resources/reset_device/static_files/wpa_supplicant.conf.default @@ -0,0 +1,2 @@ +ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev +update_config=1 \ No newline at end of file diff --git a/src/setup.js b/src/setup.js new file mode 100644 index 0000000..4c0168d --- /dev/null +++ b/src/setup.js @@ -0,0 +1,149 @@ +const Utils = require('./lib/utils.js'); +const lib = new Utils(); +const child_process = require('child_process'); +const readline = require('readline-sync'); + +const fgGreen = lib.consoleColorCodes.FgGreen; +const consoleReset = lib.consoleColorCodes.Reset; + +require('crontab').load(function (err, crontab) { + console.log(crontab.jobs()); +}); +return; +(function () { + + if (!lib.isCurrentUserRoot()) { + console.log('Script has to be run as root!') + return; + } + + lib.clearConsole(); + lib.printWelcomeMessage(); + + const input_obj = { + input_ssid: '', + input_is_wpa_encryption: false, + input_wpa_password: null, + input_is_autoreconfig: false, + input_autoreconfig_delay: 300, + input_server_port: 80, + input_is_ssl_enabled: false + } + + input_obj.input_ssid = readline.question( + `${fgGreen}Would you like to specify an SSID you'd like to use for Host/Configuration mode? [default: RaspiWiFi Setup]: ${consoleReset}`, + { + defaultInput: 'RaspiWifi Setup' + }) + console.log(""); + + let inp = ''; + do { + inp = readline.question( + `${fgGreen}Would you like WPA encryption enabled on the hotspot while in Configuration Mode?: [y/N]${consoleReset}`, { + defaultInput: 'n' + }); + input_obj.input_is_wpa_encryption = inp.toLowerCase() === 'y'; + console.log(""); + + } while (!lib.checkForYN(inp)) + + if (input_obj.input_is_wpa_encryption) { + input_obj.input_wpa_password = readline.question( + `${fgGreen}What password would you like to for WPA hotspot access (if enabled above, Must be at least 8 characters) [default: NO PASSWORD]: ${consoleReset}`, + { + hideEchoBack: true, + defaultInput: null, + }); + console.log(""); + } + + do { + inp = readline.question(`${fgGreen}Would you like to enable auto-reconfiguration mode?: [y/N]${consoleReset}`, + { + defaultInput: 'n' + }); + input_obj.input_is_autoreconfig = inp.toLowerCase() === 'y'; + console.log(""); + } while (!lib.checkForYN(inp)) + + + + input_obj.input_autoreconfig_delay = readline.questionInt( + `${fgGreen}How long of a delay would you like without an active connection before auto-reconfiguration triggers (seconds)? [default: 300]: ${consoleReset}`, + { + cancel: 300, + defaultInput: 300 + }); + console.log(""); + + + input_obj.input_server_port = readline.questionInt( + `${fgGreen}Which port would you like to use for the Configuration Page? [default: 80]: ${consoleReset}`, + { + cancel: 80, + defaultInput: 80 + }); + console.log(""); + + + do { + inp = readline.question( + `${fgGreen}Would you like to enable SSL during configuration mode \n(NOTICE: you will get a certificate ID error when connecting, but traffic will be encrypted)?: [y/N]${consoleReset}`, + { + defaultInput: 'n' + }) + console.log(""); + input_obj.input_is_ssl_enabled = inp.toLowerCase() === 'y'; + } while (!lib.checkForYN(inp)) + + + let commitChanges = false; + do { + inp = readline.question( + `${lib.consoleColorCodes.FgRed}Are you ready to commit changes to the system? [y/N]: ${consoleReset}`, + { + defaultInput: 'n' + }) + console.log(""); + commitChanges = inp.toLowerCase() === 'y'; + } while (!lib.checkForYN(inp)) + + + if (!commitChanges) { + lib.printSetupCanceledMessage(); + return; + } + + console.log(input_obj) + + //lib.installSystemDependencies(); + //lib.copyConfigs(); + lib.updateMainConfigFile({ + ssid: input_obj.input_ssid, + autoConfig: input_obj.input_is_autoreconfig, + autoConfigDelay: input_obj.input_autoreconfig_delay, + sslEnabled: input_obj.input_is_ssl_enabled, + serverPort: input_obj.input_server_port, + wpaEnabled: input_obj.input_is_wpa_encryption, + wpaSecret: input_obj.input_wpa_password + } + ); + + lib.printFinishedMessage(); + + let shouldReboot = false; + do { + inp = readline.question( + `${lib.consoleColorCodes.FgRed}Would you like to do that now? [y/N]: ${consoleReset}`, + { + defaultInput: 'n' + }) + shouldReboot = inp.toLowerCase() === 'y'; + } while (!lib.checkForYN(inp)) + + if (shouldReboot) + lib.reboot(); + +}()); + diff --git a/src/test.txt b/src/test.txt new file mode 100644 index 0000000..e13a903 --- /dev/null +++ b/src/test.txt @@ -0,0 +1,9 @@ +{ + "SSID": "RaspiWifi Setup", + "AutoReconfig": false, + "AutoReconfigDelay": 300, + "SSLEnabled": false, + "ServerPort": 80, + "WPAEnabled": false, + "PSK": "" +} diff --git a/src/yarn.lock b/src/yarn.lock new file mode 100644 index 0000000..7f6aac6 --- /dev/null +++ b/src/yarn.lock @@ -0,0 +1,20 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +crontab@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/crontab/-/crontab-1.4.2.tgz#847452d91574c6029486e70d0186cb27be742892" + integrity sha512-utvLBomZS+ZWpi7MHqn6ETneYxfShNFx9rKj0HUsF0dnTPdOtnjLNC2lNhFWJD89H3/Un0uV7wigEDe3EWfFlg== + dependencies: + underscore "^1.6.0" + +readline-sync@^1.4.10: + version "1.4.10" + resolved "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.10.tgz#41df7fbb4b6312d673011594145705bf56d8873b" + integrity sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw== + +underscore@^1.6.0: + version "1.13.4" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.4.tgz#7886b46bbdf07f768e0052f1828e1dcab40c0dee" + integrity sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ== diff --git a/tests/index.js b/tests/index.js new file mode 100644 index 0000000..1471662 --- /dev/null +++ b/tests/index.js @@ -0,0 +1,19 @@ +var iwconfig = require('wireless-tools/iwconfig'); + +iwconfig.status(function (err, status) { + console.log('--- Iwconfig ---') + if (err) console.log("err:", err); + console.log("IWconfig status:", status); +}); + + + +var ifconfig = require('wireless-tools/ifconfig'); + +ifconfig.status(function (err, status) { + console.log('--- Ifconfig ---') + if (err) { + console.log('err:', err); + } + console.log('Ifconfig Status:', status); +}); \ No newline at end of file diff --git a/tests/node_modules/.yarn-integrity b/tests/node_modules/.yarn-integrity new file mode 100644 index 0000000..e670dbc --- /dev/null +++ b/tests/node_modules/.yarn-integrity @@ -0,0 +1,16 @@ +{ + "systemParams": "darwin-x64-93", + "modulesFolders": [ + "node_modules" + ], + "flags": [], + "linkedModules": [], + "topLevelPatterns": [ + "wireless-tools@^0.19.0" + ], + "lockfileEntries": { + "wireless-tools@^0.19.0": "https://registry.yarnpkg.com/wireless-tools/-/wireless-tools-0.19.0.tgz#67fb73cd371f2d9ba3b9ef253400a31f8c784b11" + }, + "files": [], + "artifacts": {} +} \ No newline at end of file diff --git a/tests/node_modules/wireless-tools/.npmignore b/tests/node_modules/wireless-tools/.npmignore new file mode 100644 index 0000000..123ae94 --- /dev/null +++ b/tests/node_modules/wireless-tools/.npmignore @@ -0,0 +1,27 @@ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules diff --git a/tests/node_modules/wireless-tools/.travis.yml b/tests/node_modules/wireless-tools/.travis.yml new file mode 100644 index 0000000..679f353 --- /dev/null +++ b/tests/node_modules/wireless-tools/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: stable +sudo: false + +after_success: + - npm run codeclimate diff --git a/tests/node_modules/wireless-tools/LICENSE b/tests/node_modules/wireless-tools/LICENSE new file mode 100644 index 0000000..21c8e46 --- /dev/null +++ b/tests/node_modules/wireless-tools/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Christopher M. Baker + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/tests/node_modules/wireless-tools/README.md b/tests/node_modules/wireless-tools/README.md new file mode 100644 index 0000000..2c26247 --- /dev/null +++ b/tests/node_modules/wireless-tools/README.md @@ -0,0 +1,738 @@ +# Wireless tools for Node.js +[![npm version](https://badge.fury.io/js/wireless-tools.svg)](http://badge.fury.io/js/wireless-tools) +[![release version](https://img.shields.io/badge/version-0.19.0-blue.svg)](https://github.com/bakerface/wireless-tools) +[![build status](https://travis-ci.org/bakerface/wireless-tools.svg?branch=master)](https://travis-ci.org/bakerface/wireless-tools) +[![code climate](https://codeclimate.com/github/bakerface/wireless-tools/badges/gpa.svg)](https://codeclimate.com/github/bakerface/wireless-tools) +[![test coverage](https://codeclimate.com/github/bakerface/wireless-tools/badges/coverage.svg)](https://codeclimate.com/github/bakerface/wireless-tools/coverage) +[![github issues](https://img.shields.io/github/issues/bakerface/wireless-tools.svg)](https://github.com/bakerface/wireless-tools/issues) +[![dependencies](https://david-dm.org/bakerface/wireless-tools.svg)](https://david-dm.org/bakerface/wireless-tools) +[![dev dependencies](https://david-dm.org/bakerface/wireless-tools/dev-status.svg)](https://david-dm.org/bakerface/wireless-tools#info=devDependencies) +[![downloads](http://img.shields.io/npm/dm/wireless-tools.svg)](https://www.npmjs.com/package/wireless-tools) + +## Table of Contents +- [hostapd](#hostapd) - configure an access point + - [hostapd.enable(options, callback)](#hostapdenableoptions-callback) - host an access point + - [hostapd.disable(interface, callback)](#hostapddisableinterface-callback) - stop hosting an access point +- [ifconfig](#ifconfig) - configure network interfaces + - [ifconfig.status(callback)](#ifconfigstatuscallback) - status of all network interfaces + - [ifconfig.status(interface, callback)](#ifconfigstatusinterface-callback) - status of a network interface + - [ifconfig.down(interface, callback)](#ifconfigdowninterface-callback) - take down a network interface + - [ifconfig.up(options, callback)](#ifconfigupoptions-callback) - bring up a network interface +- [iwconfig](#iwconfig) - configure wireless network interfaces + - [iwconfig.status(callback)](#iwconfigstatuscallback) - status of all wireless network interfaces + - [iwconfig.status(interface, callback)](#iwconfigstatusinterface-callback) - status of a wireless network interface +- [iwlist](#iwlist) - query wireless network interfaces + - [iwlist.scan(options, callback)](#iwlistscaninterface-callback) - scan for wireless networks +- [udhcpc](#udhcpc) - configure a dhcp client + - [udhcpc.enable(options, callback)](#udhcpcenableoptions-callback) - start a dhcp client + - [udhcpc.disable(interface, callback)](#udhcpcdisableinterface-callback) - stop a dhcp client +- [udhcpd](#udhcpd) - configure a dhcp server + - [udhcpd.enable(options, callback)](#udhcpdenableoptions-callback) - start a dhcp server + - [udhcpd.disable(interface, callback)](#udhcpddisableinterface-callback) - stop a dhcp server +- [wpa_cli](#wpa_cli) - send commands to wpa_supplicant using wpa_cli + - [wpa_cli.status(interface, callback)](#wpa_clistatusinterface-callback) - get status of wpa + - [wpa_cli.bssid(interface, ap, ssid, callback)](#wpa_clibssidinterface-ap-ssid-callback) - set preferred bssid for ssid + - [wpa_cli.reassociate(interface, callback)](#wpa_clireassociateinterface-callback) - tell wpa_supplicant to reassociate to an access points + - [wpa_cli.set(interface, variable, value, callback)](#wpa_clisetinterface-variable-value-callback) - set variable to value + - [wpa_cli.add_network(interface, callback)](#wpa_cliadd_networkinterface-callback) - add network + - [wpa_cli.set_network(interface, id, variable, value, callback)](#wpa_cliset_networkinterface-id-variable-value-callback) - set network variables + - [wpa_cli.enable_network(interface, id, callback)](#wpa_clienable_networkinterface-id-callback) - enable network + - [wpa_cli.disable_network(interface, id, callback)](#wpa_clidisable_networkinterface-id-callback) - disable network + - [wpa_cli.remove_network(interface, id, callback)](#wpa_cliremove_networkinterface-id-callback) - remove network + - [wpa_cli.select_network(interface, id, callback)](#wpa_cliselect_networkinterface-id-callback) - select network + - [wpa_cli.scan(interface, callback)](#wpa_cliscaninterface-callback) - new BSS scan + - [wpa_cli.scan_results(interface, callback)](#wpa_cliscan_resultsinterface-callback) - results of latest BSS scan + - [wpa_cli.save_config(interface, callback)](#wpa_clisave_configinterface-callback) - saves the current configuration +- [wpa_supplicant](#wpa_supplicant) - configure a wireless network connection + - [wpa_supplicant.enable(options, callback)](#wpa_supplicantenableoptions-callback) - connect to a wireless network + - [wpa_supplicant.disable(interface, callback)](#wpa_supplicantdisableinterface-callback) - disconnect from a wireless network + - [wpa_supplicant.manual(options, callback)](#wpa_supplicantmanualoptions-callback) - start wpa_supplicant in a way it can receive commands from wpa_cli +- [iw](#iw) - get and set parameters using `iw`, the interface for nl80211 interfaces + - [iw.scan(options, callback)](#iwscaninterface-callback) - scan for wireless networks + +# hostapd +The **hostapd** command is used to configure wireless access points. + +## hostapd.enable(options, callback) +The **hostapd enable** command is used to host an access point on a specific wireless interface. + +``` javascript +var hostapd = require('wireless-tools/hostapd'); + +var options = { + channel: 6, + driver: 'rtl871xdrv', + hw_mode: 'g', + interface: 'wlan0', + ssid: 'RaspberryPi', + wpa: 2, + wpa_passphrase: 'raspberry' +}; + +hostapd.enable(options, function(err) { + // the access point was created +}); +``` + +## hostapd.disable(interface, callback) +The **hostapd disable** command is used to stop hosting an access point on a specific wireless interface. + +``` javascript +var hostapd = require('wireless-tools/hostapd'); + +hostapd.disable('wlan0', function(err) { + // no longer hosting the access point +}); +``` + +# ifconfig +The **ifconfig** command is used to configure network interfaces. + +## ifconfig.status(callback) +The **ifconfig status** command is used to query the status of all configured interfaces. + +``` javascript +var ifconfig = require('wireless-tools/ifconfig'); + +ifconfig.status(function(err, status) { + console.log(status); +}); + +// => +[ + { + interface: 'eth0', + link: 'ethernet', + address: 'b8:27:eb:da:52:ad', + ipv4_address: '192.168.1.2', + ipv4_broadcast: '192.168.1.255', + ipv4_subnet_mask: '255.255.255.0', + up: true, + broadcast: true, + running: true, + multicast: true + }, + { + interface: 'lo', + link: 'local', + ipv4_address: '127.0.0.1', + ipv4_subnet_mask: '255.0.0.0', + up: true, + running: true, + loopback: true + }, + { + interface: 'wlan0', + link: 'ethernet', + address: '00:0b:81:95:12:21', + ipv4_address: '192.168.10.1', + ipv4_broadcast: '192.168.10.255', + ipv4_subnet_mask: '255.255.255.0', + up: true, + broadcast: true, + multicast: true + } +] +``` + +## ifconfig.status(interface, callback) +The **ifconfig interface status** command is used to query the status of a specific interface. + +``` javascript +var ifconfig = require('wireless-tools/ifconfig'); + +ifconfig.status('eth0', function(err, status) { + console.log(status); +}); + +// => +{ + interface: 'eth0', + link: 'ethernet', + address: 'b8:27:eb:da:52:ad', + ipv4_address: '192.168.1.2', + ipv4_broadcast: '192.168.1.255', + ipv4_subnet_mask: '255.255.255.0', + up: true, + broadcast: true, + running: true, + multicast: true +} +``` + +## ifconfig.down(interface, callback) +The **ifconfig down** command is used to take down an interface that is up. + +``` javascript +var ifconfig = require('wireless-tools/ifconfig'); + +ifconfig.down('wlan0', function(err) { + // the interface is down +}); +``` + +## ifconfig.up(options, callback) +The **ifconfig up** command is used to bring up an interface with the specified configuration. + +``` javascript +var ifconfig = require('wireless-tools/ifconfig'); + +var options = { + interface: 'wlan0', + ipv4_address: '192.168.10.1', + ipv4_broadcast: '192.168.10.255', + ipv4_subnet_mask: '255.255.255.0' +}; + +ifconfig.up(options, function(err) { + // the interface is up +}); +``` + +# iwconfig +The **iwconfig** command is used to configure wireless network interfaces. + +## iwconfig.status(callback) +The **iwconfig status** command is used to query the status of all configured wireless interfaces. + +``` javascript +var iwconfig = require('wireless-tools/iwconfig'); + +iwconfig.status(function(err, status) { + console.log(status); +}); + +// => +[ + { + interface: 'wlan0', + access_point: '00:0b:81:95:12:21', + frequency: 2.437, + ieee: '802.11bg', + mode: 'master', + noise: 0, + quality: 77, + sensitivity: 0, + signal: 50, + ssid: 'RaspberryPi' + }, + { + interface: 'wlan1', + frequency: 2.412, + mode: 'auto', + noise: 0, + quality: 0, + sensitivity: 0, + signal: 0, + unassociated: true + } +] +``` + +## iwconfig.status(interface, callback) +The **iwconfig interface status** command is used to query the status of a specific wireless interface. + +``` javascript +var iwconfig = require('wireless-tools/iwconfig'); + +iwconfig.status('wlan0', function(err, status) { + console.log(status); +}); + +// => +{ + interface: 'wlan0', + access_point: '00:0b:81:95:12:21', + frequency: 2.437, + ieee: '802.11bg', + mode: 'master', + noise: 0, + quality: 77, + sensitivity: 0, + signal: 50, + ssid: 'RaspberryPi' +} +``` + +# iwlist +The **iwlist** command is used to get detailed information from a wireless interface. + +## iwlist.scan(interface, callback) +The **iwlist scan** command is used to scan for wireless networks visible to a wireless interface. For convenience, the networks are sorted by signal strength. + +``` javascript +var iwlist = require('wireless-tools/iwlist'); + +iwlist.scan('wlan0', function(err, networks) { + console.log(networks); +}); + +iwlist.scan({ iface : 'wlan0', show_hidden : true }, function(err, networks) { + console.log(networks); +}); + +// => +[ + { + address: '00:0b:81:ab:14:22', + ssid: 'BlueberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wpa', + quality: 48, + signal: 87 + }, + { + address: '00:0b:81:95:12:21', + ssid: 'RaspberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wpa2', + quality: 58, + signal: 83 + }, + { + address: '00:0b:81:cd:f2:04', + ssid: 'BlackberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wep', + quality: 48, + signal: 80 + }, + { + address: '00:0b:81:fd:42:14', + ssid: 'CranberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'open', + quality: 32, + signal: 71 + } +] + +[ + { + address: '00:0b:81:ab:14:22', + ssid: 'BlueberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wpa', + quality: 48, + signal: 87 + }, + { + address: '00:0b:81:95:12:21', + ssid: 'RaspberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wpa2', + quality: 58, + signal: 83 + }, + { + address: '00:0b:81:cd:f2:04', + ssid: 'BlackberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wep', + quality: 48, + signal: 80 + }, + { + address: '00:0b:81:fd:42:14', + ssid: 'CranberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'open', + quality: 32, + signal: 71 + }, + { + address: '2c:c5:d3:02:ae:4c', + channel: 100, + frequency: 5.5, + mode: 'master', + quality: 66, + signal: -44, + security: 'wpa2' + } +] +``` + +# udhcpc +The **udhcpc** command is used to configure a dhcp client for a network interface. + +## udhcpc.enable(options, callback) +The **udhcpc enable** command is used to start a dhcp client on a specific network interface. + +``` javascript +var udhcpc = require('wireless-tools/udhcpc'); + +var options = { + interface: 'wlan0' +}; + +udhcpc.enable(options, function(err) { + // the dhcp client was started +}); +``` + +## udhcpc.disable(interface, callback) +The **udhcpc disable** command is used to stop a dhcp client on a specific network interface. + +``` javascript +var udhcpc = require('wireless-tools/udhcpc'); + +udhcpc.disable('wlan0', function(err) { + // the dhcp client was stopped +}); +``` + +# udhcpd +The **udhcpd** command is used to configure a dhcp server for a network interface. + +## udhcpd.enable(options, callback) +The **udhcpd enable** command is used to start a dhcp server on a specific network interface. + +``` javascript +var udhcpd = require('wireless-tools/udhcpd'); + +var options = { + interface: 'wlan0', + start: '192.168.10.100', + end: '192.168.10.200', + option: { + router: '192.168.10.1', + subnet: '255.255.255.0', + dns: [ '4.4.4.4', '8.8.8.8' ] + } +}; + +udhcpd.enable(options, function(err) { + // the dhcp server was started +}); +``` + +## udhcpd.disable(interface, callback) +The **udhcpd disable** command is used to stop a dhcp server on a specific network interface. + +``` javascript +var udhcpd = require('wireless-tools/udhcpd'); + +udhcpd.disable('wlan0', function(err) { + // the dhcp server was stopped +}); +``` + +# wpa_cli +The **wpa_cli** command is used to setup what wpa_supplicant must do to connect to a wireless network connection for a network interface. + +Most of wpa_cli commands return either 'OK' or 'FAIL' (and the exit status is +always 0). Because of this, all 'FAIL' responses will return and callback with an error. + +Responses containing an 'OK' result only means than wpa_supplicant had received +the command. You must poll wpa_supplicant (or other commands like iwconfig) to be sure that the command was actually applied by wpa_supplicant. + +## wpa_cli.status(interface, callback) +The **wpa_cli status** command is used to get the current status of wpa_supplicant on a specific network interface. + +``` javascript +var wpa_cli = require('wireless-tools/wpa_cli'); + +wpa_cli.status('wlan0', function(err, status) { + console.dir(status); +}); +``` + +``` javascript +// => +{ + bssid: '2c:f5:d3:02:ea:d9', + frequency: 2412, + mode: 'station', + key_mgmt: 'wpa2-psk', + ssid: 'Fake-Wifi', + pairwise_cipher: 'CCMP', + group_cipher: 'CCMP', + p2p_device_address: 'e4:28:9c:a8:53:72', + wpa_state: 'COMPLETED', + ip: '10.34.141.168', + mac: 'e4:28:9c:a8:53:72', + uuid: 'e1cda789-8c88-53e8-ffff-31c304580c1e', + id: 0 +} +``` +## wpa_cli.bssid(interface, ap, ssid, callback) +The **wpa_cli bssid** command is used to set the preferred access points for an specific ssid on a specific network interface. + +``` javascript +var wpa_cli = require('wireless-tools/wpa_cli'); + +wpa_cli.bssid('wlan0', '2c:f5:d3:02:ea:dd', 'Fake-Wifi', function(err, data){ + // this is correct usage + console.dir(data); +}); +``` +## wpa_cli.reassociate(interface, callback) +The **wpa_cli reassociate** command is used to instruct wpa_supplicant to reassociate to access points for an SSID on a specific network interface. + +``` javascript +var wpa_cli = require('wireless-tools/wpa_cli'); + +wpa_cli.bssid('wlan0', 'Fake-Wifi', '2c:f5:d3:02:ea:dd', function(err, data){ + // our usage is wrong so an error is triggered + if (err) { + console.dir(err); + // attempt to reassociate + wpa_cli.reassociate('wlan0', function(err, data) { + console.dir(data); + }); + } +}); +``` +## wpa_cli.set(interface, variable, value, callback) +The **wpa_cli set** command is used to set wpa_supplicant parameters to a value on a specific network interface. + +## wpa_cli.add_network(interface, callback) +The **wpa_cli add_network** command is used to create a new network entry on a specific network interface. +It will return on success the id of the new network + +## wpa_cli.set_network(interface, id, variable, value, callback) +The **wpa_cli set_network** command is used to set variables for a network on a specific network interface. + +## wpa_cli.enable_network(interface, id, callback) +The **wpa_cli enable_network** command is used to enable a network on a specific network interface. + +## wpa_cli.disable_network(interface, id, callback) +The **wpa_cli disable_network** command is used to disable a network on a specific network interface. + +## wpa_cli.remove_network(interface, id, callback) +The **wpa_cli remove_network** command is used to remove a network on a specific network interface. + +## wpa_cli.select_network(interface, id, callback) +The **wpa_cli select_network** command is used to select a specific network on a specific network interface and +disable all others. + +``` javascript +var wpa_cli = require('wireless-tools/wpa_cli'); + +wpa_cli.select_network('wlan0', 0, function(err, data){ + if (err) { + // most likely the set values for the specified id are wrong + console.dir(err); + } else { + // successfully connected to the new network + console.dir(data); + } +}); +``` +## wpa_cli.scan(interface, callback) +The **wpa_cli scan** is used to request a new BSS scan on a specific network interface. + +## wpa_cli.scan_results(interface, callback) +The **wpa_cli scan_results** is used to return the results of the latest BSS scan + that was run on a specific network interface. + +``` javascript +var wpa_cli = require('wireless-tools/wpa_cli'); + +wpa_cli.scan('wlan0', function(err, data){ + wpa_cli.scan_results('wlan0', function(err, data) { + // returns the results of the BSS scan once it completes + console.dir(data); + } +}); +``` + +``` javascript +=> +[ + { + bssid: '2c:f5:d3:02:ea:d9', + frequency: 2472, + signalLevel: -31, + flags: '[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]', + ssid: 'FakeWifi' + }, + { + bssid: '2c:f5:d3:02:ea:d9', + frequency: 2472, + signalLevel: -31, + flags: '[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]', + ssid: 'FakeWifi2' + } +] +``` + +## wpa_cli.save_config(interface, callback) +The **wpa_cli save_config** command is used to save the current wpa_cli configuration for the specific network interface. + +``` javascript +var wpa_cli = require('wireless-tools/wpa_cli'); + +wpa_cli.save_config('wlan0', function(err, data){ + // current wpa_cli configuration is saved +}); +``` + +# wpa_supplicant +The **wpa_supplicant** command is used to configure a wireless network connection for a network interface. + +## wpa_supplicant.enable(options, callback) +The **wpa_supplicant enable** command is used to join a wireless network on a specific network interface. + +``` javascript +var wpa_supplicant = require('wireless-tools/wpa_supplicant'); + +var options = { + interface: 'wlan0', + ssid: 'RaspberryPi', + passphrase: 'raspberry', + driver: 'wext' +}; + +wpa_supplicant.enable(options, function(err) { + // connected to the wireless network +}); +``` + +## wpa_supplicant.disable(interface, callback) +The **wpa_supplicant disable** command is used to disconnect from a wireless network on a specific network interface. + +``` javascript +var wpa_supplicant = require('wireless-tools/wpa_supplicant'); + +wpa_supplicant.disable('wlan0', function(err) { + // disconnected from wireless network +}); +``` + +## wpa_supplicant.manual(options, callback) +The **wpa_supplicant manual** command is used to launch wpa_supplicant on a specific network interface. + +``` javascript +var wpa_supplicant = require('wireless-tools/wpa_supplicant'); + +var options = { + interface: 'wlan0', + drivers: [ 'nl80211', 'wext' ] +}; + +wpa_supplicant.manual(options, function(err) { + // wpa_supplicant launched on wlan0 interface (can be setup using wpa_cli) +}); +``` + +# iw +The **iw** command is used to get and set detailed information from an nl80211 wireless interface. + +## iw.scan(interface, callback) +The **iw scan** command is used to scan for wireless networks visible to a wireless interface. For convenience, the networks are sorted by signal strength. + +``` javascript +var iw = require('wireless-tools/iw'); + +iw.scan('wlan0', function(err, networks) { + console.log(networks); +}); + +iw.scan({ iface : 'wlan0', show_hidden : true }, function(err, networks) { + console.log(networks); +}); + +// => +[ + { + address: '00:0b:81:ab:14:22', + frequency: 2422, + signal: -80, + lastSeenMs: 0, + ssid: 'BlueberryPi', + channel: 3, + security: 'wpa' + }, + { + address: '00:0b:81:95:12:21', + frequency: 5825, + signal: -83, + lastSeenMs: 2031, + ssid: 'RaspberryPi', + channel: 165, + security: 'wpa2' + }, + { + address: '00:0b:81:cd:f2:04', + frequency: 2437, + signal: -88, + lastSeenMs: 0, + ssid: 'BlackberryPi', + channel: 6, + security: 'wep' + }, + { + address: '00:0b:81:fd:42:14', + frequency: 2412, + signal: -92, + lastSeenMs: 0, + ssid: 'CranberryPi', + channel: 1, + security: 'open' + } +] + +[ + { + address: '00:0b:81:ab:14:22', + frequency: 2422, + signal: -80, + lastSeenMs: 0, + ssid: 'BlueberryPi', + channel: 3, + security: 'wpa' + }, + { + address: '00:0b:81:95:12:21', + frequency: 5825, + signal: -83, + lastSeenMs: 2031, + ssid: 'RaspberryPi', + channel: 165, + security: 'wpa2' + }, + { + address: '00:0b:81:cd:f2:04', + frequency: 2437, + signal: -88, + lastSeenMs: 0, + ssid: 'BlackberryPi', + channel: 6, + security: 'wep' + }, + { + address: '00:0b:81:fd:42:14', + frequency: 2412, + signal: -92, + lastSeenMs: 0, + ssid: 'CranberryPi', + channel: 1, + security: 'open' + }, + { + address: '00:0b:81:fd:42:01', + frequency: 2412, + signal: -94, + lastSeenMs: 1069, + channel: 1, + security: 'open' + } +] +``` diff --git a/tests/node_modules/wireless-tools/bump-version b/tests/node_modules/wireless-tools/bump-version new file mode 100755 index 0000000..a2e3a47 --- /dev/null +++ b/tests/node_modules/wireless-tools/bump-version @@ -0,0 +1,4 @@ +#!/bin/sh + +sed -i '' 's/"version": ".*"/"version": "'$1'"/g' package.json +sed -i '' 's/version-.*-blue.svg/version-'$1'-blue.svg/g' README.md diff --git a/tests/node_modules/wireless-tools/hostapd.js b/tests/node_modules/wireless-tools/hostapd.js new file mode 100644 index 0000000..08879db --- /dev/null +++ b/tests/node_modules/wireless-tools/hostapd.js @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var child_process = require('child_process'); + +/** + * The **hostpad** command is used to configure wireless access points. + * + * @static + * @category hostapd + * + */ +var hostapd = module.exports = { + exec: child_process.exec, + disable: disable, + enable: enable +}; + +/** + * The **hostpad disable** command is used to stop hosting an access point + * on a specific wireless interface. + * + * @static + * @category hostapd + * @param {string} interface The network interface of the access point. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var hostapd = require('wireless-tools/hostapd'); + * + * hostapd.disable('wlan0', function(err) { + * // no longer hosting the access point + * }); + * + */ +function disable(interface, callback) { + var file = interface + '-hostapd.conf'; + + return this.exec('kill `pgrep -f "^hostapd -B ' + file + '"` || true', + callback); +} + +/** + * The **hostpad enable** command is used to host an access point + * on a specific wireless interface. + * + * @static + * @category hostapd + * @param {object} options The access point configuration. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var hostapd = require('wireless-tools/hostapd'); + * + * var options = { + * channel: 6, + * driver: 'rtl871xdrv', + * hw_mode: 'g', + * interface: 'wlan0', + * ssid: 'RaspberryPi', + * wpa: 2, + * wpa_passphrase: 'raspberry' + * }; + * + * hostapd.enable(options, function(err) { + * // the access point was created + * }); + * + */ +function enable(options, callback) { + var file = options.interface + '-hostapd.conf'; + + var commands = [ + 'cat <' + file + ' && hostapd -B ' + file + ' && rm -f ' + file + ]; + + Object.getOwnPropertyNames(options).forEach(function(key) { + commands.push(key + '=' + options[key]); + }); + + return this.exec(commands.join('\n'), callback); +} diff --git a/tests/node_modules/wireless-tools/ifconfig.js b/tests/node_modules/wireless-tools/ifconfig.js new file mode 100644 index 0000000..08f9fa7 --- /dev/null +++ b/tests/node_modules/wireless-tools/ifconfig.js @@ -0,0 +1,249 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var child_process = require('child_process'); + +/** + * The **ifconfig** command is used to configure network interfaces. + * + * @static + * @category ifconfig + * + */ +var ifconfig = module.exports = { + exec: child_process.exec, + status: status, + down: down, + up: up +}; + +/** + * Parses the status for a single network interface. + * + * @private + * @static + * @category ifconfig + * @param {string} block The section of stdout for the interface. + * @returns {object} The parsed network interface status. + * + */ +function parse_status_block(block) { + var match; + + var parsed = { + interface: block.match(/^([^\s]+)/)[1] + }; + + if ((match = block.match(/Link encap:\s*([^\s]+)/))) { + parsed.link = match[1].toLowerCase(); + } + + if ((match = block.match(/HWaddr\s+([^\s]+)/))) { + parsed.address = match[1].toLowerCase(); + } + + if ((match = block.match(/inet6\s+addr:\s*([^\s]+)/))) { + parsed.ipv6_address = match[1]; + } + + if ((match = block.match(/inet\s+addr:\s*([^\s]+)/))) { + parsed.ipv4_address = match[1]; + } + + if ((match = block.match(/Bcast:\s*([^\s]+)/))) { + parsed.ipv4_broadcast = match[1]; + } + + if ((match = block.match(/Mask:\s*([^\s]+)/))) { + parsed.ipv4_subnet_mask = match[1]; + } + + if ((match = block.match(/UP/))) { + parsed.up = true; + } + + if ((match = block.match(/BROADCAST/))) { + parsed.broadcast = true; + } + + if ((match = block.match(/RUNNING/))) { + parsed.running = true; + } + + if ((match = block.match(/MULTICAST/))) { + parsed.multicast = true; + } + + if ((match = block.match(/LOOPBACK/))) { + parsed.loopback = true; + } + + return parsed; +} + +/** + * Parses the status for all network interfaces. + * + * @private + * @static + * @category ifconfig + * @param {function} callback The callback function. + * + */ +function parse_status(callback) { + return function(error, stdout, stderr) { + if (error) callback(error); + else callback(error, + stdout.trim().split('\n\n').map(parse_status_block)); + }; +} + +/** + * Parses the status for a single network interface. + * + * @private + * @static + * @category ifconfig + * @param {function} callback The callback function. + * + */ +function parse_status_interface(callback) { + return function(error, stdout, stderr) { + if (error) callback(error); + else callback(error, parse_status_block(stdout.trim())); + }; +} + +/** + * The **ifconfig status** command is used to query the status of all + * configured interfaces. + * + * @static + * @category ifconfig + * @param {string} [interface] The network interface. + * @param {function} callback The callback function. + * @example + * + * var ifconfig = require('wireless-tools/ifconfig'); + * + * ifconfig.status(function(err, status) { + * console.log(status); + * }); + * + * // => + * [ + * { + * interface: 'eth0', + * link: 'ethernet', + * address: 'b8:27:eb:da:52:ad', + * ipv4_address: '192.168.1.2', + * ipv4_broadcast: '192.168.1.255', + * ipv4_subnet_mask: '255.255.255.0', + * up: true, + * broadcast: true, + * running: true, + * multicast: true + * }, + * { + * interface: 'lo', + * link: 'local', + * ipv4_address: '127.0.0.1', + * ipv4_subnet_mask: '255.0.0.0', + * up: true, + * running: true, + * loopback: true + * }, + * { + * interface: 'wlan0', + * link: 'ethernet', + * address: '00:0b:81:95:12:21', + * ipv4_address: '192.168.10.1', + * ipv4_broadcast: '192.168.10.255', + * ipv4_subnet_mask: '255.255.255.0', + * up: true, + * broadcast: true, + * multicast: true + * } + * ] + * + */ +function status(interface, callback) { + if (callback) { + this.exec('ifconfig ' + interface, parse_status_interface(callback)); + } + else { + this.exec('ifconfig -a', parse_status(interface)); + } +} + +/** + * The **ifconfig down** command is used to take down an interface that is up. + * + * @static + * @category ifconfig + * @param {string} interface The network interface. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var ifconfig = require('wireless-tools/ifconfig'); + * + * ifconfig.down('wlan0', function(err) { + * // the interface is down + * }); + * + */ +function down(interface, callback) { + return this.exec('ifconfig ' + interface + ' down', callback); +} + +/** + * The **ifconfig up** command is used to bring up an interface with the + * specified configuration. + * + * @static + * @category ifconfig + * @param {object} options The interface configuration. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var options = { + * interface: 'wlan0', + * ipv4_address: '192.168.10.1', + * ipv4_broadcast: '192.168.10.255', + * ipv4_subnet_mask: '255.255.255.0' + * }; + * + * ifconfig.up(options, function(err) { + * // the interface is up + * }); + * + */ +function up(options, callback) { + return this.exec('ifconfig ' + options.interface + + ' ' + options.ipv4_address + + ' netmask ' + options.ipv4_subnet_mask + + ' broadcast ' + options.ipv4_broadcast + + ' up', callback); +} diff --git a/tests/node_modules/wireless-tools/iw.js b/tests/node_modules/wireless-tools/iw.js new file mode 100644 index 0000000..000a825 --- /dev/null +++ b/tests/node_modules/wireless-tools/iw.js @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var child_process = require('child_process'); + +/** + * The **iw** command is used to control nl80211 radios. + * + * @static + * @category iw + * + */ +var iw = module.exports = { + exec: child_process.exec, + scan: scan +}; + +/** + * Returns a truthy if the network has an ssid; falsy otherwise. + * + * @private + * @static + * @category iw + * @param {object} network The scanned network object. + * @returns {string} The ssid. + * + */ +function has_ssid(network) { + return network.ssid; +} + +/** + * Returns a truthy if the network has any key; falsy otherwise. + * + * @private + * @static + * @category iw + * @param {object} network The scanned network object. + * @returns {boolean} True if any key. + * + */ +function has_keys(network) { + return Object.keys(network).length !== 0; +} + + + +/** + * A comparison function to sort networks ordered by signal strength. + * + * @private + * @static + * @category iw + * @param {object} a A scanned network object. + * @param {object} b Another scanned network object. + * @returns {number} The comparison value. + * + */ +function by_signal(a, b) { + return b.signal - a.signal; +} + +/** + * Parses a scanned wireless network cell. + * + * @private + * @static + * @category iw + * @param {string} cell The section of stdout for the cell. + * @returns {object} The scanned network object. + * + */ +function parse_cell(cell) { + var parsed = { }; + var match; + + if ((match = cell.match(/BSS ([0-9A-Fa-f:-]{17})\(on/))) { + parsed.address = match[1].toLowerCase(); + } + + if ((match = cell.match(/freq: ([0-9]+)/))) { + parsed.frequency = parseInt(match[1], 10); + } + + if ((match = cell.match(/signal: (-?[0-9.]+) dBm/))) { + parsed.signal = parseFloat(match[1]); + } + + if ((match = cell.match(/last seen: ([0-9]+) ms ago/))) { + parsed.lastSeenMs = parseInt(match[1], 10); + } + + if ((match = cell.match(/SSID: \\x00/))) { + delete parsed.ssid; + } + else if ((match = cell.match(/SSID: ([^\n]*)/))) { + parsed.ssid = match[1]; + } + + if ((match = cell.match(/DS Parameter set: channel ([0-9]+)/))) { + parsed.channel = parseInt(match[1], 10); + } + else if ((match = cell.match(/\* primary channel: ([0-9]+)/))) { + parsed.channel = parseInt(match[1], 10); + } + + if ((match = cell.match(/RSN:[\s*]+Version: 1/))) { + parsed.security = 'wpa2'; + } + else if ((match = cell.match(/WPA:[\s*]+Version: 1/))) { + parsed.security = 'wpa'; + } + else if ((match = cell.match(/capability: ESS Privacy/))) { + parsed.security = 'wep'; + } + else if ((match = cell.match(/capability: ESS/))) { + parsed.security = 'open'; + } + return parsed; +} + +/** + * Parses all scanned wireless network cells. + * + * @private + * @static + * @category iw + * @param {function} callback The callback function. + * + */ +function parse_scan(show_hidden, callback) { + return function(error, stdout, stderr) { + if (error) callback(error); + else + if (show_hidden) { + callback(error, stdout + .split(/(^|\n)(?=BSS )/) + .map(parse_cell) + .filter(has_keys) + .sort(by_signal)); + } else { + callback(error, stdout + .split(/(^|\n)(?=BSS )/) + .map(parse_cell) + .filter(has_ssid) + .sort(by_signal)); + } + }; +} + +/** + * The **iw scan** command is used to scan for wireless networks + * visible to a wireless interface. For convenience, the networks are + * sorted by signal strength. + * + * @static + * @category iw + * @param {string} interface The wireless network interface. + * @param {function} callback The callback function. + */ +function scan(options, callback) { + var interface, show_hidden + if (typeof options === 'string') { + var interface = options; + var show_hidden = false; + } else { + var interface = options.iface; + var show_hidden = options.show_hidden || false; + } + + this.exec('iw dev ' + interface + ' scan', parse_scan(show_hidden, callback)); +} diff --git a/tests/node_modules/wireless-tools/iwconfig.js b/tests/node_modules/wireless-tools/iwconfig.js new file mode 100644 index 0000000..fb2f5fd --- /dev/null +++ b/tests/node_modules/wireless-tools/iwconfig.js @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var child_process = require('child_process'); + +/** + * The **iwconfig** command is used to configure wireless network interfaces. + * + * @private + * @category iwconfig + * + */ +var iwconfig = module.exports = { + exec: child_process.exec, + status: status +}; + +/** + * Parses the status for a single wireless network interface. + * + * @private + * @static + * @category iwconfig + * @param {string} block The section of stdout for the interface. + * @returns {object} The parsed wireless network interface status. + * + */ +function parse_status_block(block) { + var match; + + // Skip out of the block is invalid + if (!block) return; + + var parsed = { + interface: block.match(/^([^\s]+)/)[1] + }; + + if ((match = block.match(/Access Point:\s*([A-Fa-f0-9:]{17})/))) { + parsed.access_point = match[1].toLowerCase(); + } + + if ((match = block.match(/Frequency[:|=]\s*([0-9\.]+)/))) { + parsed.frequency = parseFloat(match[1]); + } + + if ((match = block.match(/IEEE\s*([^\s]+)/))) { + parsed.ieee = match[1].toLowerCase(); + } + + if ((match = block.match(/Mode[:|=]\s*([^\s]+)/))) { + parsed.mode = match[1].toLowerCase(); + } + + if ((match = block.match(/Noise level[:|=]\s*(-?[0-9]+)/))) { + parsed.noise = parseInt(match[1], 10); + } + + if ((match = block.match(/Link Quality[:|=]\s*([0-9]+)/))) { + parsed.quality = parseInt(match[1], 10); + } + + if ((match = block.match(/Sensitivity[:|=]\s*([0-9]+)/))) { + parsed.sensitivity = parseInt(match[1], 10); + } + + if ((match = block.match(/Signal level[:|=]\s*(-?[0-9]+)/))) { + parsed.signal = parseInt(match[1], 10); + } + + if ((match = block.match(/ESSID[:|=]\s*"([^"]+)"/))) { + parsed.ssid = match[1]; + } + + if ((match = block.match(/unassociated/))) { + parsed.unassociated = true; + } + + return parsed; +} + +/** + * Parses the status for all wireless network interfaces. + * + * @private + * @static + * @category iwconfig + * @param {function} callback The callback function. + * + */ +function parse_status(callback) { + return function(error, stdout, stderr) { + if (error) callback(error); + else callback(error, + stdout.trim().split('\n\n').map(parse_status_block).filter(function(i) { return !! i })); + }; +} + +/** + * Parses the status for a single wireless network interface. + * + * @private + * @static + * @category iwconfig + * @param {function} callback The callback function. + * + */ +function parse_status_interface(callback) { + return function(error, stdout, stderr) { + if (error) callback(error); + else callback(error, parse_status_block(stdout.trim())); + }; +} + +/** + * Parses the status for a single wireless network interface. + * + * @private + * @static + * @category iwconfig + * @param {string} [interface] The wireless network interface. + * @param {function} callback The callback function. + * @example + * + * var iwconfig = require('wireless-tools/iwconfig'); + * + * iwconfig.status(function(err, status) { + * console.log(status); + * }); + * + * // => + * [ + * { + * interface: 'wlan0', + * access_point: '00:0b:81:95:12:21', + * frequency: 2.437, + * ieee: '802.11bg', + * mode: 'master', + * noise: 0, + * quality: 77, + * sensitivity: 0, + * signal: 50, + * ssid: 'RaspberryPi' + * }, + * { + * interface: 'wlan1', + * frequency: 2.412, + * mode: 'auto', + * noise: 0, + * quality: 0, + * sensitivity: 0, + * signal: 0, + * unassociated: true + * } + * ] + * + */ +function status(interface, callback) { + if (callback) { + return this.exec('iwconfig ' + interface, + parse_status_interface(callback)); + } + else { + return this.exec('iwconfig', parse_status(interface)); + } +} diff --git a/tests/node_modules/wireless-tools/iwlist.js b/tests/node_modules/wireless-tools/iwlist.js new file mode 100644 index 0000000..206506b --- /dev/null +++ b/tests/node_modules/wireless-tools/iwlist.js @@ -0,0 +1,310 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var child_process = require('child_process'); + +/** + * The **iwlist** command is used to get detailed information from a + * wireless interface. + * + * @static + * @category iwlist + * + */ +var iwlist = module.exports = { + exec: child_process.exec, + scan: scan +}; + +/** + * Returns a truthy if the network has an ssid; falsy otherwise. + * + * @private + * @static + * @category iwlist + * @param {object} network The scanned network object. + * @returns {string} The ssid. + * + */ +function has_ssid(network) { + return network.ssid; +} + +/** + * Returns a truthy if the network has any key; falsy otherwise. + * + * @private + * @static + * @category iwlist + * @param {object} network The scanned network object. + * @returns {boolean} True if any key. + * + */ +function has_keys(network) { + return Object.keys(network).length !== 0; +} + + + +/** + * A comparison function to sort networks ordered by signal strength. + * + * @private + * @static + * @category iwlist + * @param {object} a A scanned network object. + * @param {object} b Another scanned network object. + * @returns {number} The comparison value. + * + */ +function by_signal(a, b) { + return b.signal - a.signal; +} + +/** + * Parses a scanned wireless network cell. + * + * @private + * @static + * @category iwlist + * @param {string} cell The section of stdout for the cell. + * @returns {object} The scanned network object. + * + */ +function parse_cell(cell) { + var parsed = { }; + var match; + + if ((match = cell.match(/Address\s*[:|=]\s*([A-Fa-f0-9:]{17})/))) { + parsed.address = match[1].toLowerCase(); + } + + if ((match = cell.match(/Channel\s*([0-9]+)/))) { + parsed.channel = parseInt(match[1], 10); + } + + if ((match = cell.match(/Frequency\s*[:|=]\s*([0-9\.]+)\s*GHz/))) { + parsed.frequency = parseFloat(match[1]); + } + + if ((match = cell.match(/Mode\s*[:|=]\s*([^\s]+)/))) { + parsed.mode = match[1].toLowerCase(); + } + + if ((match = cell.match(/Quality\s*[:|=]\s*([0-9]+)/))) { + parsed.quality = parseInt(match[1], 10); + } + + if ((match = cell.match(/Signal level\s*[:|=]\s*(-?[0-9]+)/))) { + parsed.signal = parseInt(match[1], 10); + } + + if ((match = cell.match(/Noise level\s*[:|=]\s*(-?[0-9]+)/))) { + parsed.noise = parseInt(match[1], 10); + } + + if ((match = cell.match(/ESSID\s*[:|=]\s*"([^"]+)"/))) { + parsed.ssid = match[1]; + } + + if ((match = cell.match(/WPA2\s+Version/))) { + parsed.security = 'wpa2'; + } + else if ((match = cell.match(/WPA\s+Version/))) { + parsed.security = 'wpa'; + } + else if ((match = cell.match(/Encryption key\s*[:|=]\s*on/))) { + parsed.security = 'wep'; + } + else if ((match = cell.match(/Encryption key\s*[:|=]\s*off/))) { + parsed.security = 'open'; + } + + return parsed; +} + +/** + * Parses all scanned wireless network cells. + * + * @private + * @static + * @category iwlist + * @param {function} callback The callback function. + * + */ +function parse_scan(show_hidden, callback) { + return function(error, stdout, stderr) { + if (error) callback(error); + else + if (show_hidden) { + callback(error, stdout + .split(/Cell [0-9]+ -/) + .map(parse_cell) + .filter(has_keys) + .sort(by_signal)); + } else { + callback(error, stdout + .split(/Cell [0-9]+ -/) + .map(parse_cell) + .filter(has_ssid) + .sort(by_signal)); + } + }; +} + +/** + * The **iwlist scan** command is used to scan for wireless networks + * visible to a wireless interface. For convenience, the networks are + * sorted by signal strength. + * + * @static + * @category iwlist + * @param {string} interface The wireless network interface. + * @param {function} callback The callback function. + * @example + * + * var iwlist = require('wireless-tools/iwlist'); + * + * iwlist.scan('wlan0', function(err, networks) { + * console.log(networks); + * }); + * + * iwlist.scan({ iface : 'wlan0', show_hidden: true }, function(err, networks) { + * console.log(networks); + * }); + * + * // => + * [ + * { + * address: '00:0b:81:ab:14:22', + * ssid: 'BlueberryPi', + * mode: 'master', + * frequency: 2.437, + * channel: 6, + * security: 'wpa', + * quality: 48, + * signal: 87 + * }, + * { + * address: '00:0b:81:95:12:21', + * ssid: 'RaspberryPi', + * mode: 'master', + * frequency: 2.437, + * channel: 6, + * security: 'wpa2', + * quality: 58, + * signal: 83 + * }, + * { + * address: '00:0b:81:cd:f2:04', + * ssid: 'BlackberryPi', + * mode: 'master', + * frequency: 2.437, + * channel: 6, + * security: 'wep', + * quality: 48, + * signal: 80 + * }, + * { + * address: '00:0b:81:fd:42:14', + * ssid: 'CranberryPi', + * mode: 'master', + * frequency: 2.437, + * channel: 6, + * security: 'open', + * quality: 32, + * signal: 71 + * } + * ] + * + * [ + * { + * address: '00:0b:81:ab:14:22', + * ssid: 'BlueberryPi', + * mode: 'master', + * frequency: 2.437, + * channel: 6, + * security: 'wpa', + * quality: 48, + * signal: 87 + * }, + * { + * address: '00:0b:81:95:12:21', + * ssid: 'RaspberryPi', + * mode: 'master', + * frequency: 2.437, + * channel: 6, + * security: 'wpa2', + * quality: 58, + * signal: 83 + * }, + * { + * address: '00:0b:81:cd:f2:04', + * ssid: 'BlackberryPi', + * mode: 'master', + * frequency: 2.437, + * channel: 6, + * security: 'wep', + * quality: 48, + * signal: 80 + * }, + * { + * address: '00:0b:81:fd:42:14', + * ssid: 'CranberryPi', + * mode: 'master', + * frequency: 2.437, + * channel: 6, + * security: 'open', + * quality: 32, + * signal: 71 + * }, + * { + * address: '2c:c5:d3:02:ae:4c', + * channel: 100, + * frequency: 5.5, + * mode: 'master', + * quality: 66, + * signal: -44, + * security: 'wpa2' + * } + * ] + * + */ +function scan(options, callback) { + var interface, show_hidden + if (typeof options === 'string') { + var interface = options; + var show_hidden = false; + } else { + var interface = options.iface; + var show_hidden = options.show_hidden || false; + } + + var extra_params = ''; + + if (options.ssid) { + extra_params = ' essid ' + options.ssid; + } + + this.exec('iwlist ' + interface + ' scan' + extra_params, parse_scan(show_hidden, callback)); +} diff --git a/tests/node_modules/wireless-tools/package.json b/tests/node_modules/wireless-tools/package.json new file mode 100644 index 0000000..9fc9a6c --- /dev/null +++ b/tests/node_modules/wireless-tools/package.json @@ -0,0 +1,55 @@ +{ + "name": "wireless-tools", + "version": "0.19.0", + "description": "Wireless tools for Node.js", + "author": "Christopher M. Baker", + "license": "MIT", + "homepage": "https://github.com/bakerface/wireless-tools", + "main": "wireless-tools.js", + "keywords": [ + "wireless", + "tools", + "hostapd", + "ifconfig", + "iwconfig", + "iwlist", + "iw", + "udhcpc", + "udhcpd", + "wpa_supplicant" + ], + "repository": { + "type": "git", + "url": "https://github.com/bakerface/wireless-tools.git" + }, + "bugs": { + "url": "https://github.com/bakerface/wireless-tools/issues" + }, + "scripts": { + "test": "istanbul cover node_modules/.bin/_mocha", + "posttest": "istanbul check-coverage --statements 100 --functions 100 --branches 100 --lines 100", + "codeclimate": "codeclimate-test-reporter < coverage/lcov.info" + }, + "xo": { + "space": true + }, + "devDependencies": { + "codeclimate-test-reporter": "^0.3.1", + "istanbul": "^0.4.3", + "mocha": "^2.5.3", + "should": "^9.0.2", + "xo": "^0.16.0" + }, + "contributors": [ + { + "name": "Athom", + "email": "support@athom.com", + "url": "https://www.athom.com/en/" + }, + { + "name": "Wink", + "email": "support@wink.com", + "url": "https://www.wink.com/" + } + ] +} diff --git a/tests/node_modules/wireless-tools/test/hostapd.js b/tests/node_modules/wireless-tools/test/hostapd.js new file mode 100644 index 0000000..6f5d4ec --- /dev/null +++ b/tests/node_modules/wireless-tools/test/hostapd.js @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var should = require('should'); +var hostapd = require('../hostapd'); + +describe('hostapd', function() { + describe('hostapd.disable(options, callback)', function() { + it('should stop the daemons', function(done) { + hostapd.exec = function(command, callback) { + should(command).eql( + 'kill `pgrep -f "^hostapd -B wlan0-hostapd.conf"` || true'); + callback(null, '', ''); + }; + + hostapd.disable('wlan0', function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + hostapd.exec = function(command, callback) { + callback('error'); + }; + + hostapd.disable('wlan0', function(err) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('hostapd.enable(options, callback)', function() { + it('should start the daemon', function(done) { + hostapd.exec = function(command, callback) { + should(command).eql('cat <wlan0-hostapd.conf' + + ' && hostapd -B wlan0-hostapd.conf' + + ' && rm -f wlan0-hostapd.conf\n' + + 'channel=6\n' + + 'driver=rtl871xdrv\n' + + 'hw_mode=g\n' + + 'interface=wlan0\n' + + 'ssid=RaspberryPi\n' + + 'wpa=2\n' + + 'wpa_passphrase=raspberry'); + + callback(null, '', ''); + }; + + var options = { + channel: 6, + driver: 'rtl871xdrv', + hw_mode: 'g', + interface: 'wlan0', + ssid: 'RaspberryPi', + wpa: 2, + wpa_passphrase: 'raspberry' + }; + + hostapd.enable(options, function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + hostapd.exec = function(command, callback) { + callback('error'); + }; + + var options = { + channel: 6, + driver: 'rtl871xdrv', + hw_mode: 'g', + interface: 'wlan0', + ssid: 'RaspberryPi', + wpa: 2, + wpa_passphrase: 'raspberry' + }; + + hostapd.enable(options, function(err) { + should(err).eql('error'); + done(); + }); + }) + }) +}) diff --git a/tests/node_modules/wireless-tools/test/ifconfig.js b/tests/node_modules/wireless-tools/test/ifconfig.js new file mode 100644 index 0000000..4c61cc0 --- /dev/null +++ b/tests/node_modules/wireless-tools/test/ifconfig.js @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var should = require('should'); +var ifconfig = require('../ifconfig'); + +var IFCONFIG_STATUS_LINUX = [ + 'eth0 Link encap:Ethernet HWaddr DE:AD:BE:EF:C0:DE', + ' inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0', + ' UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1', + ' RX packets:114919 errors:0 dropped:10 overruns:0 frame:0', + ' TX packets:117935 errors:0 dropped:0 overruns:0 carrier:0', + ' collisions:0 txqueuelen:1000', + ' RX bytes:28178397 (26.8 MiB) TX bytes:23423409 (22.3 MiB)', + '', + 'lo Link encap:Local Loopbacks', + ' inet addr:127.0.0.1 Mask:255.0.0.0', + ' UP LOOPBACK RUNNING MTU:65536 Metric:1', + ' RX packets:0 errors:0 dropped:0 overruns:0 frame:0', + ' TX packets:0 errors:0 dropped:0 overruns:0 carrier:0', + ' collisions:0 txqueuelen:0', + ' RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)' +].join('\n'); + +var IFCONFIG_STATUS_INTERFACE_LINUX = [ + 'wlan0 HWaddr DE:AD:BE:EF:C0:DE', + ' inet6 addr:fe80::21c:c0ff:feae:b5e6/64 Scope:Link', + ' MTU:1500 Metric:1', + ' RX packets:0 errors:0 dropped:0 overruns:0 frame:0', + ' TX packets:0 errors:0 dropped:0 overruns:0 carrier:0', + ' collisions:0 txqueuelen:1000', + ' RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)' +].join('\n'); + + + +describe('ifconfig', function() { + describe('ifconfig.status(callback)', function() { + it('should get the status for each interface', function(done) { + ifconfig.exec = function(command, callback) { + should(command).eql('ifconfig -a'); + callback(null, IFCONFIG_STATUS_LINUX, ''); + }; + + ifconfig.status(function(err, status) { + should(status).eql([ + { + interface: 'eth0', + link: 'ethernet', + address: 'de:ad:be:ef:c0:de', + ipv4_address: '192.168.1.2', + ipv4_broadcast: '192.168.1.255', + ipv4_subnet_mask: '255.255.255.0', + up: true, + broadcast: true, + running: true, + multicast: true + }, + { + interface: 'lo', + link: 'local', + ipv4_address: '127.0.0.1', + ipv4_subnet_mask: '255.0.0.0', + up: true, + loopback: true, + running: true + } + ]); + + done(); + }); + }) + + it('should handle errors', function(done) { + ifconfig.exec = function(command, callback) { + callback('error'); + }; + + ifconfig.status(function(err, status) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('ifconfig.status(interface, callback)', function() { + it('should get the status for the specified interface', function(done) { + ifconfig.exec = function(command, callback) { + should(command).eql('ifconfig wlan0'); + callback(null, IFCONFIG_STATUS_INTERFACE_LINUX, ''); + }; + + ifconfig.status('wlan0', function(err, status) { + should(status).eql({ + interface: 'wlan0', + address: 'de:ad:be:ef:c0:de', + ipv6_address: 'fe80::21c:c0ff:feae:b5e6/64' + }); + + done(); + }); + }) + + it('should handle errors', function(done) { + ifconfig.exec = function(command, callback) { + callback('error'); + }; + + ifconfig.status('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('ifconfig.down(interface, callback)', function() { + it('should take down the interface', function(done) { + ifconfig.exec = function(command, callback) { + should(command).eql('ifconfig wlan0 down'); + callback(null, '', ''); + }; + + ifconfig.down('wlan0', function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + ifconfig.exec = function(command, callback) { + callback('error'); + }; + + ifconfig.down('wlan0', function(err) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('ifconfig.up(options, callback)', function() { + it('should bring up the interface', function(done) { + ifconfig.exec = function(command, callback) { + should(command).eql('ifconfig wlan0 192.168.10.1' + + ' netmask 255.255.255.0 broadcast 192.168.10.255 up'); + + callback(null, '', ''); + }; + + var options = { + interface: 'wlan0', + ipv4_address: '192.168.10.1', + ipv4_broadcast: '192.168.10.255', + ipv4_subnet_mask: '255.255.255.0' + }; + + ifconfig.up(options, function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + ifconfig.exec = function(command, callback) { + callback('error'); + }; + + var options = { + interface: 'wlan0', + ipv4_address: '192.168.10.1', + ipv4_broadcast: '192.168.10.255', + ipv4_subnet_mask: '255.255.255.0' + }; + + ifconfig.down(options, function(err) { + should(err).eql('error'); + done(); + }); + }) + }) +}) diff --git a/tests/node_modules/wireless-tools/test/iw.js b/tests/node_modules/wireless-tools/test/iw.js new file mode 100644 index 0000000..77c62c2 --- /dev/null +++ b/tests/node_modules/wireless-tools/test/iw.js @@ -0,0 +1,860 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var should = require('should'); +var iw = require('../iw'); + +var IW_SCAN_LINUX = "BSS 14:91:82:c7:76:b9(on wlan0)\n" + +" TSF: 337644127 usec (0d, 00:05:37)\n" + +" freq: 2412\n" + +" beacon interval: 100 TUs\n" + +" capability: ESS Privacy ShortSlotTime (0x0411)\n" + +" signal: -87.00 dBm\n" + +" last seen: 0 ms ago\n" + +" Information elements from Probe Response frame:\n" + +" SSID: creamcorn\n" + +" Supported rates: 1.0* 2.0* 5.5* 11.0* 22.0 6.0 9.0 12.0 \n" + +" DS Parameter set: channel 1\n" + +" TIM: DTIM Count 0 DTIM Period 2 Bitmap Control 0x0 Bitmap[0] 0x0\n" + +" ERP: \n" + +" Extended supported rates: 18.0 24.0 36.0 48.0 54.0 \n" + +" RSN: * Version: 1\n" + +" * Group cipher: CCMP\n" + +" * Pairwise ciphers: CCMP\n" + +" * Authentication suites: PSK\n" + +" * Capabilities: 16-PTKSA-RC 1-GTKSA-RC (0x000c)\n" + +" HT capabilities:\n" + +" Capabilities: 0x6f\n" + +" RX LDPC\n" + +" HT20/HT40\n" + +" SM Power Save disabled\n" + +" RX HT20 SGI\n" + +" RX HT40 SGI\n" + +" No RX STBC\n" + +" Max AMSDU length: 3839 bytes\n" + +" No DSSS/CCK HT40\n" + +" Maximum RX AMPDU length 65535 bytes (exponent: 0x003)\n" + +" Minimum RX AMPDU time spacing: 4 usec (0x05)\n" + +" HT TX/RX MCS rate indexes supported: 0-23, 32\n" + +" HT operation:\n" + +" * primary channel: 1\n" + +" * secondary channel offset: no secondary\n" + +" * STA channel width: 20 MHz\n" + +" * RIFS: 0\n" + +" * HT protection: nonmember\n" + +" * non-GF present: 0\n" + +" * OBSS non-GF present: 1\n" + +" * dual beacon: 0\n" + +" * dual CTS protection: 0\n" + +" * STBC beacon: 0\n" + +" * L-SIG TXOP Prot: 0\n" + +" * PCO active: 0\n" + +" * PCO phase: 0\n" + +" Extended capabilities: 6\n" + +" VHT capabilities:\n" + +" VHT Capabilities (0x33801831):\n" + +" Max MPDU length: 7991\n" + +" Supported Channel Width: neither 160 nor 80+80\n" + +" RX LDPC\n" + +" short GI (80 MHz)\n" + +" SU Beamformer\n" + +" SU Beamformee\n" + +" RX antenna pattern consistency\n" + +" TX antenna pattern consistency\n" + +" VHT RX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT RX highest supported: 0 Mbps\n" + +" VHT TX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT TX highest supported: 0 Mbps\n" + +" VHT operation:\n" + +" * channel width: 0 (20 or 40 MHz)\n" + +" * center freq segment 1: 0\n" + +" * center freq segment 2: 0\n" + +" * VHT basic MCS set: 0xfffc\n" + +" WMM: * Parameter version 1\n" + +" * BE: CW 15-1023, AIFSN 3, TXOP 2048 usec\n" + +" * BK: CW 15-1023, AIFSN 7\n" + +" * VI: CW 7-15, AIFSN 2, TXOP 3008 usec\n" + +" * VO: CW 3-7, AIFSN 2, TXOP 1504 usec\n" + +"BSS f4:0f:1b:b5:5b:4d(on wlan0)\n" + +" TSF: 337645123 usec (0d, 00:05:37)\n" + +" freq: 5260\n" + +" beacon interval: 102 TUs\n" + +" capability: ESS Privacy RadioMeasure (0x1011)\n" + +" signal: -59.00 dBm\n" + +" last seen: 4530 ms ago\n" + +" Information elements from Probe Response frame:\n" + +" SSID: Wink-Visitor\n" + +" Supported rates: 6.0* 9.0 12.0* 18.0 24.0* 36.0 48.0 54.0 \n" + +" Country: US Environment: Indoor/Outdoor\n" + +" Channels [36 - 48] @ 17 dBm\n" + +" Channels [52 - 64] @ 24 dBm\n" + +" Channels [100 - 116] @ 24 dBm\n" + +" Channels [132 - 140] @ 24 dBm\n" + +" Channels [149 - 165] @ 30 dBm\n" + +" BSS Load:\n" + +" * station count: 14\n" + +" * channel utilisation: 16/255\n" + +" * available admission capacity: 23437 [*32us]\n" + +" HT capabilities:\n" + +" Capabilities: 0x19ac\n" + +" HT20\n" + +" SM Power Save disabled\n" + +" RX HT20 SGI\n" + +" TX STBC\n" + +" RX STBC 1-stream\n" + +" Max AMSDU length: 7935 bytes\n" + +" DSSS/CCK HT40\n" + +" Maximum RX AMPDU length 65535 bytes (exponent: 0x003)\n" + +" Minimum RX AMPDU time spacing: 8 usec (0x06)\n" + +" HT RX MCS rate indexes supported: 0-23\n" + +" HT TX MCS rate indexes are undefined\n" + +" HT operation:\n" + +" * primary channel: 52\n" + +" * secondary channel offset: no secondary\n" + +" * STA channel width: 20 MHz\n" + +" * RIFS: 1\n" + +" * HT protection: no\n" + +" * non-GF present: 1\n" + +" * OBSS non-GF present: 0\n" + +" * dual beacon: 0\n" + +" * dual CTS protection: 0\n" + +" * STBC beacon: 0\n" + +" * L-SIG TXOP Prot: 0\n" + +" * PCO active: 0\n" + +" * PCO phase: 0\n" + +" Extended capabilities: Proxy ARP Service, WNM-Notification, 6\n" + +" VHT capabilities:\n" + +" VHT Capabilities (0x0f8379b2):\n" + +" Max MPDU length: 11454\n" + +" Supported Channel Width: neither 160 nor 80+80\n" + +" RX LDPC\n" + +" short GI (80 MHz)\n" + +" TX STBC\n" + +" SU Beamformer\n" + +" SU Beamformee\n" + +" VHT RX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT RX highest supported: 0 Mbps\n" + +" VHT TX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT TX highest supported: 0 Mbps\n" + +" VHT operation:\n" + +" * channel width: 0 (20 or 40 MHz)\n" + +" * center freq segment 1: 0\n" + +" * center freq segment 2: 0\n" + +" * VHT basic MCS set: 0x0000\n" + +" WPA: * Version: 1\n" + +" * Group cipher: CCMP\n" + +" * Pairwise ciphers: CCMP\n" + +" * Authentication suites: PSK\n" + +" * Capabilities: 1-PTKSA-RC 1-GTKSA-RC (0x0000)\n" + +" WMM: * Parameter version 1\n" + +" * u-APSD\n" + +" * BE: CW 15-1023, AIFSN 3\n" + +" * BK: CW 15-1023, AIFSN 7\n" + +" * VI: CW 7-15, AIFSN 2, TXOP 3008 usec\n" + +" * VO: CW 3-7, AIFSN 2, TXOP 1504 usec\n" + +"BSS f4:0f:1b:b5:5b:4e(on wlan0)\n" + +" TSF: 337645151 usec (0d, 00:05:37)\n" + +" freq: 5260\n" + +" beacon interval: 102 TUs\n" + +" capability: ESS RadioMeasure (0x1001)\n" + +" signal: -59.00 dBm\n" + +" last seen: 4530 ms ago\n" + +" Information elements from Probe Response frame:\n" + +" SSID: Flex-Visitor\n" + +" Supported rates: 6.0* 9.0 12.0* 18.0 24.0* 36.0 48.0 54.0 \n" + +" Country: US Environment: Indoor/Outdoor\n" + +" Channels [36 - 48] @ 17 dBm\n" + +" Channels [52 - 64] @ 24 dBm\n" + +" Channels [100 - 116] @ 24 dBm\n" + +" Channels [132 - 140] @ 24 dBm\n" + +" Channels [149 - 165] @ 30 dBm\n" + +" BSS Load:\n" + +" * station count: 14\n" + +" * channel utilisation: 16/255\n" + +" * available admission capacity: 23437 [*32us]\n" + +" HT capabilities:\n" + +" Capabilities: 0x19ac\n" + +" HT20\n" + +" SM Power Save disabled\n" + +" RX HT20 SGI\n" + +" TX STBC\n" + +" RX STBC 1-stream\n" + +" Max AMSDU length: 7935 bytes\n" + +" DSSS/CCK HT40\n" + +" Maximum RX AMPDU length 65535 bytes (exponent: 0x003)\n" + +" Minimum RX AMPDU time spacing: 8 usec (0x06)\n" + +" HT RX MCS rate indexes supported: 0-23\n" + +" HT TX MCS rate indexes are undefined\n" + +" HT operation:\n" + +" * primary channel: 52\n" + +" * secondary channel offset: no secondary\n" + +" * STA channel width: 20 MHz\n" + +" * RIFS: 1\n" + +" * HT protection: no\n" + +" * non-GF present: 1\n" + +" * OBSS non-GF present: 0\n" + +" * dual beacon: 0\n" + +" * dual CTS protection: 0\n" + +" * STBC beacon: 0\n" + +" * L-SIG TXOP Prot: 0\n" + +" * PCO active: 0\n" + +" * PCO phase: 0\n" + +" Extended capabilities: Proxy ARP Service, WNM-Notification, 6\n" + +" VHT capabilities:\n" + +" VHT Capabilities (0x0f8379b2):\n" + +" Max MPDU length: 11454\n" + +" Supported Channel Width: neither 160 nor 80+80\n" + +" RX LDPC\n" + +" short GI (80 MHz)\n" + +" TX STBC\n" + +" SU Beamformer\n" + +" SU Beamformee\n" + +" VHT RX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT RX highest supported: 0 Mbps\n" + +" VHT TX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT TX highest supported: 0 Mbps\n" + +" VHT operation:\n" + +" * channel width: 0 (20 or 40 MHz)\n" + +" * center freq segment 1: 0\n" + +" * center freq segment 2: 0\n" + +" * VHT basic MCS set: 0x0000\n" + +" WMM: * Parameter version 1\n" + +" * u-APSD\n" + +" * BE: CW 15-1023, AIFSN 3\n" + +" * BK: CW 15-1023, AIFSN 7\n" + +" * VI: CW 7-15, AIFSN 2, TXOP 3008 usec\n" + +" * VO: CW 3-7, AIFSN 2, TXOP 1504 usec\n" + +"BSS 6c:70:9f:e7:d8:b3(on wlan0)\n" + +" TSF: 337644811 usec (0d, 00:05:37)\n" + +" freq: 5180\n" + +" beacon interval: 100 TUs\n" + +" capability: ESS Privacy SpectrumMgmt RadioMeasure (0x1111)\n" + +" signal: -77.00 dBm\n" + +" last seen: 2110 ms ago\n" + +" Information elements from Probe Response frame:\n" + +" SSID: QA Lab 5GHz\n" + +" Supported rates: 6.0* 9.0 12.0* 18.0 24.0* 36.0 48.0 54.0 \n" + +" Country: US Environment: Indoor/Outdoor\n" + +" Channels [36 - 36] @ 17 dBm\n" + +" Channels [40 - 40] @ 17 dBm\n" + +" Channels [44 - 44] @ 17 dBm\n" + +" Channels [48 - 48] @ 17 dBm\n" + +" Channels [52 - 52] @ 24 dBm\n" + +" Channels [56 - 56] @ 24 dBm\n" + +" Channels [60 - 60] @ 24 dBm\n" + +" Channels [64 - 64] @ 24 dBm\n" + +" Channels [100 - 100] @ 24 dBm\n" + +" Channels [104 - 104] @ 24 dBm\n" + +" Channels [108 - 108] @ 24 dBm\n" + +" Channels [112 - 112] @ 24 dBm\n" + +" Channels [116 - 116] @ 24 dBm\n" + +" Channels [132 - 132] @ 24 dBm\n" + +" Channels [136 - 136] @ 24 dBm\n" + +" Channels [140 - 140] @ 24 dBm\n" + +" Channels [144 - 144] @ 24 dBm\n" + +" Channels [149 - 149] @ 30 dBm\n" + +" Channels [153 - 153] @ 30 dBm\n" + +" Channels [157 - 157] @ 30 dBm\n" + +" Channels [161 - 161] @ 30 dBm\n" + +" Channels [165 - 165] @ 30 dBm\n" + +" Power constraint: 0 dB\n" + +" TPC report: TX power: 17 dBm\n" + +" RSN: * Version: 1\n" + +" * Group cipher: CCMP\n" + +" * Pairwise ciphers: CCMP\n" + +" * Authentication suites: PSK\n" + +" * Capabilities: 1-PTKSA-RC 1-GTKSA-RC (0x0000)\n" + +" HT capabilities:\n" + +" Capabilities: 0x9ef\n" + +" RX LDPC\n" + +" HT20/HT40\n" + +" SM Power Save disabled\n" + +" RX HT20 SGI\n" + +" RX HT40 SGI\n" + +" TX STBC\n" + +" RX STBC 1-stream\n" + +" Max AMSDU length: 7935 bytes\n" + +" No DSSS/CCK HT40\n" + +" Maximum RX AMPDU length 65535 bytes (exponent: 0x003)\n" + +" Minimum RX AMPDU time spacing: 4 usec (0x05)\n" + +" HT RX MCS rate indexes supported: 0-23\n" + +" HT TX MCS rate indexes are undefined\n" + +" HT operation:\n" + +" * primary channel: 36\n" + +" * secondary channel offset: above\n" + +" * STA channel width: any\n" + +" * RIFS: 1\n" + +" * HT protection: no\n" + +" * non-GF present: 0\n" + +" * OBSS non-GF present: 0\n" + +" * dual beacon: 0\n" + +" * dual CTS protection: 0\n" + +" * STBC beacon: 0\n" + +" * L-SIG TXOP Prot: 0\n" + +" * PCO active: 0\n" + +" * PCO phase: 0\n" + +" Extended capabilities: 6\n" + +" VHT capabilities:\n" + +" VHT Capabilities (0x0f8259b2):\n" + +" Max MPDU length: 11454\n" + +" Supported Channel Width: neither 160 nor 80+80\n" + +" RX LDPC\n" + +" short GI (80 MHz)\n" + +" TX STBC\n" + +" SU Beamformer\n" + +" SU Beamformee\n" + +" VHT RX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT RX highest supported: 0 Mbps\n" + +" VHT TX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT TX highest supported: 0 Mbps\n" + +" VHT operation:\n" + +" * channel width: 1 (80 MHz)\n" + +" * center freq segment 1: 42\n" + +" * center freq segment 2: 0\n" + +" * VHT basic MCS set: 0x0000\n" + +" WMM: * Parameter version 1\n" + +" * u-APSD\n" + +" * BE: CW 15-1023, AIFSN 3\n" + +" * BK: CW 15-1023, AIFSN 7\n" + +" * VI: CW 7-15, AIFSN 2, TXOP 3008 usec\n" + +" * VO: CW 3-7, AIFSN 2, TXOP 1504 usec\n" + +"BSS 2c:30:33:ec:4b:24(on wlan0)\n" + +" TSF: 337644493 usec (0d, 00:05:37)\n" + +" freq: 2437\n" + +" beacon interval: 31 TUs\n" + +" capability: ESS Privacy ShortPreamble SpectrumMgmt ShortSlotTime RadioMeasure (0x1531)\n" + +" signal: -68.00 dBm\n" + +" last seen: 0 ms ago\n" + +" Information elements from Probe Response frame:\n" + +" SSID: NETGEAR03\n" + +" Supported rates: 1.0* 2.0* 5.5 11.0 18.0 24.0 36.0 54.0 \n" + +" DS Parameter set: channel 6\n" + +" Country: US Environment: Indoor/Outdoor\n" + +" Channels [1 - 11] @ 30 dBm\n" + +" Power constraint: 0 dB\n" + +" TPC report: TX power: 25 dBm\n" + +" ERP: \n" + +" ERP D4.0: \n" + +" RSN: * Version: 1\n" + +" * Group cipher: CCMP\n" + +" * Pairwise ciphers: CCMP\n" + +" * Authentication suites: PSK\n" + +" * Capabilities: 16-PTKSA-RC 1-GTKSA-RC (0x000c)\n" + +" Extended supported rates: 6.0 9.0 12.0 48.0 \n" + +" BSS Load:\n" + +" * station count: 1\n" + +" * channel utilisation: 166/255\n" + +" * available admission capacity: 0 [*32us]\n" + +" HT capabilities:\n" + +" Capabilities: 0x19b0\n" + +" HT20\n" + +" Static SM Power Save\n" + +" RX Greenfield\n" + +" RX HT20 SGI\n" + +" TX STBC\n" + +" RX STBC 1-stream\n" + +" Max AMSDU length: 7935 bytes\n" + +" DSSS/CCK HT40\n" + +" Maximum RX AMPDU length 65535 bytes (exponent: 0x003)\n" + +" Minimum RX AMPDU time spacing: 8 usec (0x06)\n" + +" HT RX MCS rate indexes supported: 0-15\n" + +" HT TX MCS rate indexes are undefined\n" + +" HT operation:\n" + +" * primary channel: 6\n" + +" * secondary channel offset: no secondary\n" + +" * STA channel width: 20 MHz\n" + +" * RIFS: 1\n" + +" * HT protection: no\n" + +" * non-GF present: 1\n" + +" * OBSS non-GF present: 0\n" + +" * dual beacon: 0\n" + +" * dual CTS protection: 0\n" + +" * STBC beacon: 0\n" + +" * L-SIG TXOP Prot: 0\n" + +" * PCO active: 0\n" + +" * PCO phase: 0\n" + +" Extended capabilities: Extended Channel Switching, BSS Transition, 6\n" + +" WPS: * Version: 1.0\n" + +" * Wi-Fi Protected Setup State: 2 (Configured)\n" + +" * Response Type: 3 (AP)\n" + +" * UUID: 00000000-0000-0000-0000-000000000000\n" + +" * Manufacturer: NETGEAR, Inc.\n" + +" * Model: VMB3010\n" + +" * Model Number: VMB3010\n" + +" * Serial Number: 01\n" + +" * Primary Device Type: 6-0050f204-1\n" + +" * Device name: NTGRBS\n" + +" * Config methods: Label, PBC\n" + +" * RF Bands: 0x1\n" + +" WMM: * Parameter version 1\n" + +" * u-APSD\n" + +" * BE: CW 15-1023, AIFSN 3\n" + +" * BK: CW 15-1023, AIFSN 7\n" + +" * VI: CW 7-15, AIFSN 2, TXOP 6016 usec\n" + +" * VO: CW 3-7, AIFSN 2, TXOP 3264 usec\n" + +"BSS 7c:0e:ce:b7:d7:90(on wlan0)\n" + +" TSF: 239785397355 usec (2d, 18:36:25)\n" + +" freq: 2412\n" + +" beacon interval: 102 TUs\n" + +" capability: ESS Privacy ShortPreamble ShortSlotTime RadioMeasure (0x1431)\n" + +" signal: -77.00 dBm\n" + +" last seen: 10 ms ago\n" + +" Information elements from Probe Response frame:\n" + +" SSID: Flex-Skynet\n" + +" Supported rates: 1.0* 2.0* 5.5* 6.0 9.0 11.0* 12.0 18.0 \n" + +" DS Parameter set: channel 1\n" + +" Country: US Environment: Indoor/Outdoor\n" + +" Channels [1 - 11] @ 30 dBm\n" + +" BSS Load:\n" + +" * station count: 2\n" + +" * channel utilisation: 201/255\n" + +" * available admission capacity: 23437 [*32us]\n" + +" ERP: \n" + +" HT capabilities:\n" + +" Capabilities: 0x19ac\n" + +" HT20\n" + +" SM Power Save disabled\n" + +" RX HT20 SGI\n" + +" TX STBC\n" + +" RX STBC 1-stream\n" + +" Max AMSDU length: 7935 bytes\n" + +" DSSS/CCK HT40\n" + +" Maximum RX AMPDU length 65535 bytes (exponent: 0x003)\n" + +" Minimum RX AMPDU time spacing: 8 usec (0x06)\n" + +" HT RX MCS rate indexes supported: 0-23\n" + +" HT TX MCS rate indexes are undefined\n" + +" RSN: * Version: 1\n" + +" * Group cipher: CCMP\n" + +" * Pairwise ciphers: CCMP\n" + +" * Authentication suites: IEEE 802.1X\n" + +" * Capabilities: 4-PTKSA-RC 4-GTKSA-RC (0x0028)\n" + +" Extended supported rates: 24.0 36.0 48.0 54.0 \n" + +" HT operation:\n" + +" * primary channel: 1\n" + +" * secondary channel offset: no secondary\n" + +" * STA channel width: 20 MHz\n" + +" * RIFS: 0\n" + +" * HT protection: nonmember\n" + +" * non-GF present: 1\n" + +" * OBSS non-GF present: 0\n" + +" * dual beacon: 0\n" + +" * dual CTS protection: 0\n" + +" * STBC beacon: 0\n" + +" * L-SIG TXOP Prot: 0\n" + +" * PCO active: 0\n" + +" * PCO phase: 0\n" + +" Extended capabilities: Proxy ARP Service, WNM-Notification\n" + +" WMM: * Parameter version 1\n" + +" * u-APSD\n" + +" * BE: CW 15-1023, AIFSN 3\n" + +" * BK: CW 15-1023, AIFSN 7\n" + +" * VI: CW 7-15, AIFSN 2, TXOP 3008 usec\n" + +" * VO: CW 3-7, AIFSN 2, TXOP 1504 usec\n" + +"BSS cc:46:d6:3c:91:04(on wlan0)\n" + +" TSF: 337644462 usec (0d, 00:05:37)\n" + +" freq: 2412\n" + +" beacon interval: 102 TUs\n" + +" capability: ESS ShortPreamble ShortSlotTime RadioMeasure (0x1421)\n" + +" signal: -90.00 dBm\n" + +" last seen: 0 ms ago\n" + +" SSID: \\x00\n" + +" Supported rates: 1.0* 2.0* 5.5* 6.0 9.0 11.0* 12.0 18.0 \n" + +" DS Parameter set: channel 1\n" + +" TIM: DTIM Count 0 DTIM Period 1 Bitmap Control 0x0 Bitmap[0] 0x0\n" + +" Country: US Environment: Indoor/Outdoor\n" + +" Channels [1 - 11] @ 30 dBm\n" + +" BSS Load:\n" + +" * station count: 1\n" + +" * channel utilisation: 190/255\n" + +" * available admission capacity: 23437 [*32us]\n" + +" ERP: \n" + +" HT capabilities:\n" + +" Capabilities: 0x19ac\n" + +" HT20\n" + +" SM Power Save disabled\n" + +" RX HT20 SGI\n" + +" TX STBC\n" + +" RX STBC 1-stream\n" + +" Max AMSDU length: 7935 bytes\n" + +" DSSS/CCK HT40\n" + +" Maximum RX AMPDU length 65535 bytes (exponent: 0x003)\n" + +" Minimum RX AMPDU time spacing: 8 usec (0x06)\n" + +" HT RX MCS rate indexes supported: 0-23\n" + +" HT TX MCS rate indexes are undefined\n" + +" Extended supported rates: 24.0 36.0 48.0 54.0 \n" + +" HT operation:\n" + +" * primary channel: 1\n" + +" * secondary channel offset: no secondary\n" + +" * STA channel width: 20 MHz\n" + +" * RIFS: 0\n" + +" * HT protection: nonmember\n" + +" * non-GF present: 1\n" + +" * OBSS non-GF present: 0\n" + +" * dual beacon: 0\n" + +" * dual CTS protection: 0\n" + +" * STBC beacon: 0\n" + +" * L-SIG TXOP Prot: 0\n" + +" * PCO active: 0\n" + +" * PCO phase: 0\n" + +" Extended capabilities: Proxy ARP Service, WNM-Notification\n" + +" WMM: * Parameter version 1\n" + +" * u-APSD\n" + +" * BE: CW 15-1023, AIFSN 3\n" + +" * BK: CW 15-1023, AIFSN 7\n" + +" * VI: CW 7-15, AIFSN 2, TXOP 3008 usec\n" + +" * VO: CW 3-7, AIFSN 2, TXOP 1504 usec\n" + +"BSS 14:91:82:bd:15:61(on wlan0)\n" + +" TSF: 337644716 usec (0d, 00:05:37)\n" + +" freq: 2457\n" + +" beacon interval: 100 TUs\n" + +" capability: ESS Privacy ShortSlotTime (0x0411)\n" + +" signal: -88.00 dBm\n" + +" last seen: 1070 ms ago\n" + +" Information elements from Probe Response frame:\n" + +" SSID: beast10\n" + +" Supported rates: 1.0* 2.0* 5.5* 11.0* 22.0 6.0 9.0 12.0 \n" + +" DS Parameter set: channel 10\n" + +" TIM: DTIM Count 1 DTIM Period 2 Bitmap Control 0x0 Bitmap[0] 0x0\n" + +" ERP: \n" + +" Extended supported rates: 18.0 24.0 36.0 48.0 54.0 \n" + +" Extended capabilities: 6\n" + +" VHT capabilities:\n" + +" VHT Capabilities (0x33801831):\n" + +" Max MPDU length: 7991\n" + +" Supported Channel Width: neither 160 nor 80+80\n" + +" RX LDPC\n" + +" short GI (80 MHz)\n" + +" SU Beamformer\n" + +" SU Beamformee\n" + +" RX antenna pattern consistency\n" + +" TX antenna pattern consistency\n" + +" VHT RX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT RX highest supported: 0 Mbps\n" + +" VHT TX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT TX highest supported: 0 Mbps\n" + +" VHT operation:\n" + +" * channel width: 0 (20 or 40 MHz)\n" + +" * center freq segment 1: 0\n" + +" * center freq segment 2: 0\n" + +" * VHT basic MCS set: 0xfffc\n" + +" WMM: * Parameter version 1\n" + +" * BE: CW 15-1023, AIFSN 3, TXOP 2048 usec\n" + +" * BK: CW 15-1023, AIFSN 7\n" + +" * VI: CW 7-15, AIFSN 2, TXOP 3008 usec\n" + +" * VO: CW 3-7, AIFSN 2, TXOP 1504 usec\n" + +describe('iw', function() { + describe('iw.scan(interface, callback)', function() { + it('should scan the specified interface', function(done) { + iw.exec = function(command, callback) { + should(command).eql('iw dev wlan0 scan'); + callback(null, IW_SCAN_LINUX, ''); + }; + + iw.scan('wlan0', function(err, status) { + should(status).eql([ + { frequency: 5260, + address: "f4:0f:1b:b5:5b:4d", + signal: -59, + lastSeenMs: 4530, + ssid: 'Wink-Visitor', + channel: 52, + security: 'wpa' }, + { frequency: 5260, + address: "f4:0f:1b:b5:5b:4e", + signal: -59, + lastSeenMs: 4530, + ssid: 'Flex-Visitor', + channel: 52, + security: 'open' }, + { frequency: 2437, + address: "2c:30:33:ec:4b:24", + signal: -68, + lastSeenMs: 0, + ssid: 'NETGEAR03', + channel: 6, + security: 'wpa2' }, + { frequency: 5180, + address: "6c:70:9f:e7:d8:b3", + signal: -77, + lastSeenMs: 2110, + ssid: 'QA Lab 5GHz', + channel: 36, + security: 'wpa2' }, + { frequency: 2412, + address: "7c:0e:ce:b7:d7:90", + signal: -77, + lastSeenMs: 10, + ssid: 'Flex-Skynet', + channel: 1, + security: 'wpa2' }, + { frequency: 2412, + address: "14:91:82:c7:76:b9", + signal: -87, + lastSeenMs: 0, + ssid: 'creamcorn', + channel: 1, + security: 'wpa2' }, + { frequency: 2457, + address: "14:91:82:bd:15:61", + signal: -88, + lastSeenMs: 1070, + ssid: 'beast10', + channel: 10, + security: 'wep' }, + ]); + done(); + }); + }) + + it('should scan the specified interface and show hidden ssid networks', function(done) { + iw.exec = function(command, callback) { + should(command).eql('iw dev wlan0 scan'); + callback(null, IW_SCAN_LINUX, ''); + }; + + var options = { + iface: 'wlan0', + show_hidden: true + }; + + iw.scan(options, function(err, status) { + should(status).eql([ + { frequency: 5260, + address: "f4:0f:1b:b5:5b:4d", + signal: -59, + lastSeenMs: 4530, + ssid: 'Wink-Visitor', + channel: 52, + security: 'wpa' }, + { frequency: 5260, + address: "f4:0f:1b:b5:5b:4e", + signal: -59, + lastSeenMs: 4530, + ssid: 'Flex-Visitor', + channel: 52, + security: 'open' }, + { frequency: 2437, + address: "2c:30:33:ec:4b:24", + signal: -68, + lastSeenMs: 0, + ssid: 'NETGEAR03', + channel: 6, + security: 'wpa2' }, + { frequency: 5180, + address: "6c:70:9f:e7:d8:b3", + signal: -77, + lastSeenMs: 2110, + ssid: 'QA Lab 5GHz', + channel: 36, + security: 'wpa2' }, + { frequency: 2412, + address: "7c:0e:ce:b7:d7:90", + signal: -77, + lastSeenMs: 10, + ssid: 'Flex-Skynet', + channel: 1, + security: 'wpa2' }, + { frequency: 2412, + address: "14:91:82:c7:76:b9", + signal: -87, + lastSeenMs: 0, + ssid: 'creamcorn', + channel: 1, + security: 'wpa2' }, + { frequency: 2457, + address: "14:91:82:bd:15:61", + signal: -88, + lastSeenMs: 1070, + ssid: 'beast10', + channel: 10, + security: 'wep' }, + { frequency: 2412, + address: "cc:46:d6:3c:91:04", + signal: -90, + lastSeenMs: 0, + channel: 1, + security: 'open' }, + ]); + done(); + }); + }) + + it('should scan the specified interface and not show hidden ssid networks', function(done) { + iw.exec = function(command, callback) { + should(command).eql('iw dev wlan0 scan'); + callback(null, IW_SCAN_LINUX, ''); + }; + + var options = { + iface: 'wlan0' + }; + + iw.scan(options, function(err, status) { + should(status).eql([ + { frequency: 5260, + address: "f4:0f:1b:b5:5b:4d", + signal: -59, + lastSeenMs: 4530, + ssid: 'Wink-Visitor', + channel: 52, + security: 'wpa' }, + { frequency: 5260, + address: "f4:0f:1b:b5:5b:4e", + signal: -59, + lastSeenMs: 4530, + ssid: 'Flex-Visitor', + channel: 52, + security: 'open' }, + { frequency: 2437, + address: "2c:30:33:ec:4b:24", + signal: -68, + lastSeenMs: 0, + ssid: 'NETGEAR03', + channel: 6, + security: 'wpa2' }, + { frequency: 5180, + address: "6c:70:9f:e7:d8:b3", + signal: -77, + lastSeenMs: 2110, + ssid: 'QA Lab 5GHz', + channel: 36, + security: 'wpa2' }, + { frequency: 2412, + address: "7c:0e:ce:b7:d7:90", + signal: -77, + lastSeenMs: 10, + ssid: 'Flex-Skynet', + channel: 1, + security: 'wpa2' }, + { frequency: 2412, + address: "14:91:82:c7:76:b9", + signal: -87, + lastSeenMs: 0, + ssid: 'creamcorn', + channel: 1, + security: 'wpa2' }, + { frequency: 2457, + address: "14:91:82:bd:15:61", + signal: -88, + lastSeenMs: 1070, + ssid: 'beast10', + channel: 10, + security: 'wep' }, + ]); + done(); + }); + }) + + it('should handle errors', function(done) { + iw.exec = function(command, callback) { + callback('error'); + }; + + iw.scan('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }) + }) +}) diff --git a/tests/node_modules/wireless-tools/test/iwconfig.js b/tests/node_modules/wireless-tools/test/iwconfig.js new file mode 100644 index 0000000..c78f3ea --- /dev/null +++ b/tests/node_modules/wireless-tools/test/iwconfig.js @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var should = require('should'); +var iwconfig = require('../iwconfig'); + +var IWCONFIG_STATUS_LINUX = [ + 'wlan0 IEEE 802.11bg ESSID:"RaspberryPi" Nickname:""', + ' Mode:Master Frequency:2.437 GHz Access Point: 00:0B:81:95:12:21', + ' Bit Rate:54 Mb/s Sensitivity:0/0', + ' Retry:off RTS thr:off Fragment thr:off', + ' Power Management:off', + ' Link Quality=18/100 Signal level=11/100 Noise level=0/100', + ' Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0', + ' Tx excessive retries:0 Invalid misc:0 Missed beacon:0', + '', + '', + '', + 'wlan1 unassociated Nickname:""', + ' Mode:Auto Frequency=2.412 GHz Access Point: Not-Associated', + ' Sensitivity:0/0', + ' Retry:off RTS thr:off Fragment thr:off', + ' Power Management:off', + ' Link Quality:0 Signal level:0 Noise level:0', + ' Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0', + ' Tx excessive retries:0 Invalid misc:0 Missed beacon:0', + '', + 'lo no wireless extensions.', + '' +].join('\n'); + +var IWCONFIG_STATUS_INTERFACE_LINUX = [ + 'wlan0 IEEE 802.11bg ESSID:"RaspberryPi" Nickname:""', + ' Mode:Master Frequency:2.437 GHz Access Point: 00:0B:81:95:12:21', + ' Bit Rate:54 Mb/s Sensitivity:0/0', + ' Retry:off RTS thr:off Fragment thr:off', + ' Power Management:off', + ' Link Quality=18/100 Signal level=11/100 Noise level=0/100', + ' Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0', + ' Tx excessive retries:0 Invalid misc:0 Missed beacon:0', + '' +].join('\n'); + +var IWCONFIG_STATUS_INTERFACE_LINUX2 = [ + 'wlan0 IEEE 802.11abgn ESSID:"FAKE-Wifi"', + ' Mode:Managed Frequency:2.412 GHz Access Point: 00:0B:81:95:12:21', + ' Bit Rate=36 Mb/s Tx-Power=22 dBm', + ' Retry short limit:7 RTS thr:off Fragment thr:off', + ' Encryption key:off', + ' Power Management:on', + ' Link Quality=63/70 Signal level=-47 dBm', + ' Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0', + ' Tx excessive retries:0 Invalid misc:0 Missed beacon:0', + '' +].join('\n'); + +describe('iwconfig', function() { + describe('iwconfig.status(callback)', function() { + it('should get the status for each interface', function(done) { + iwconfig.exec = function(command, callback) { + should(command).eql('iwconfig'); + callback(null, IWCONFIG_STATUS_LINUX, ''); + }; + + iwconfig.status(function(err, status) { + should(status).eql([ + { + interface: 'wlan0', + ssid: 'RaspberryPi', + access_point: '00:0b:81:95:12:21', + ieee: '802.11bg', + mode: 'master', + frequency: 2.437, + sensitivity: 0, + quality: 18, + signal: 11, + noise: 0 + }, + { + interface: 'wlan1', + unassociated: true, + mode: 'auto', + frequency: 2.412, + sensitivity: 0, + quality: 0, + signal: 0, + noise: 0 + }, + { + interface: 'lo' + } + ]); + + done(); + }); + }) + + it('should handle errors', function(done) { + iwconfig.exec = function(command, callback) { + callback('error'); + }; + + iwconfig.status(function(err, status) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('iwconfig.status(interface, callback)', function() { + it('should get the status for the specified interface', function(done) { + iwconfig.exec = function(command, callback) { + should(command).eql('iwconfig wlan0'); + callback(null, IWCONFIG_STATUS_INTERFACE_LINUX, ''); + }; + + iwconfig.status('wlan0', function(err, status) { + should(status).eql({ + interface: 'wlan0', + ssid: 'RaspberryPi', + access_point: '00:0b:81:95:12:21', + ieee: '802.11bg', + mode: 'master', + frequency: 2.437, + sensitivity: 0, + quality: 18, + signal: 11, + noise: 0 + }); + + done(); + }); + }) + + it('should handle errors', function(done) { + iwconfig.exec = function(command, callback) { + callback('error'); + }; + + iwconfig.status('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('iwconfig.status(interface, callback)', function() { + it('should get the status for the specified interface', function(done) { + iwconfig.exec = function(command, callback) { + should(command).eql('iwconfig wlan0'); + callback(null, IWCONFIG_STATUS_INTERFACE_LINUX2, ''); + }; + + iwconfig.status('wlan0', function(err, status) { + should(status).eql({ + interface: 'wlan0', + ssid: 'FAKE-Wifi', + access_point: '00:0b:81:95:12:21', + ieee: '802.11abgn', + mode: 'managed', + frequency: 2.412, + quality: 63, + signal: -47 + }); + + done(); + }); + }) + + it('should handle errors', function(done) { + iwconfig.exec = function(command, callback) { + callback('error'); + }; + + iwconfig.status('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }) + }) +}) diff --git a/tests/node_modules/wireless-tools/test/iwlist.js b/tests/node_modules/wireless-tools/test/iwlist.js new file mode 100644 index 0000000..b333104 --- /dev/null +++ b/tests/node_modules/wireless-tools/test/iwlist.js @@ -0,0 +1,368 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var should = require('should'); +var iwlist = require('../iwlist'); + +var IWLIST_SCAN_LINUX = [ +'Cell 01 - Address: 00:0B:81:95:12:21', +' ESSID:"RaspberryPi"', +' Protocol:IEEE 802.11bgn', +' Mode:Master', +' Frequency:2.437 GHz (Channel 6)', +' Encryption key:on', +' Bit Rates:144 Mb/s', +' Extra:rsn_ie=00000000000000000000000000000000000000000000', +' IE: IEEE 802.11i/WPA2 Version 1', +' Group Cipher : CCMP', +' Pairwise Ciphers (1) : CCMP', +' Authentication Suites (1) : PSK', +' IE: Unknown: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', +' Quality=58/100 Signal level=83/100', +'Cell 02 - Address: 00:0B:81:AB:14:22', +' ESSID:"BlueberryPi"', +' Protocol:IEEE 802.11bgn', +' Mode:Master', +' Frequency:2.437 GHz (Channel 6)', +' Encryption key:on', +' Bit Rates:144 Mb/s', +' IE: WPA Version 1', +' Group Cipher : TKIP', +' Pairwise Ciphers (2) : CCMP TKIP', +' Authentication Suites (1) : PSK', +' Extra:rsn_ie=0000000000000000000000000000000000000000000000000000', +' Quality=48/100 Signal level=87/100', +'Cell 03 - Address: 00:0B:81:CD:F2:04', +' ESSID:"BlackberryPi"', +' Protocol:IEEE 802.11bgn', +' Mode:Master', +' Frequency:2.437 GHz (Channel 6)', +' Encryption key:on', +' Bit Rates:144 Mb/s', +' IE: Unknown: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', +' Extra:rsn_ie=0000000000000000000000000000000000000000000000000000', +' Quality=48/100 Signal level=80/100', +'Cell 04 - Address: 00:0B:81:FD:42:14', +' ESSID:"CranberryPi"', +' Protocol:IEEE 802.11bgn', +' Mode:Master', +' Frequency:2.437 GHz (Channel 6)', +' Encryption key:off', +' Bit Rates:144 Mb/s', +' IE: Unknown: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', +' Quality:4/5 Signal level:-60 dBm Noise level:-92 dBm', +'Cell 05 - Address: 2C:C5:D3:02:AE:4C', +' Channel:100', +' Frequency:5.5 GHz (Channel 100)', +' Quality=65/70 Signal level=-45 dBm', +' Encryption key:on', +' ESSID:""', +' Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s', +' Mode:Master', +' Extra:tsf=0000003d2a54d03b', +' Extra: Last beacon: 3360ms ago', +' IE: Unknown: DD180050F20201018E0003A4000027A4000042435E0062322F00', +' IE: Unknown: 2D1AAD091BF8FE000000000000000000001000000000000000000000', +' IE: Unknown: 3D1664000000000000000000000000000000000000000000', +' IE: IEEE 802.11i/WPA2 Version 1', +' Group Cipher : CCMP', +' Pairwise Ciphers (1) : CCMP', +' Authentication Suites (1) : PSK' +].join('\n'); + +var IWLIST_SCAN_LINUX_ACTIVE_SCAN = [ +'Cell 01 - Address: 00:0B:81:95:12:21', +' ESSID:"RaspberryPi"', +' Protocol:IEEE 802.11bgn', +' Mode:Master', +' Frequency:2.437 GHz (Channel 6)', +' Encryption key:on', +' Bit Rates:144 Mb/s', +' Extra:rsn_ie=00000000000000000000000000000000000000000000', +' IE: IEEE 802.11i/WPA2 Version 1', +' Group Cipher : CCMP', +' Pairwise Ciphers (1) : CCMP', +' Authentication Suites (1) : PSK', +' IE: Unknown: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', +' Quality=58/100 Signal level=83/100', +'Cell 02 - Address: 00:0B:81:AB:14:22', +' ESSID:"BlueberryPi"', +' Protocol:IEEE 802.11bgn', +' Mode:Master', +' Frequency:2.437 GHz (Channel 6)', +' Encryption key:on', +' Bit Rates:144 Mb/s', +' IE: WPA Version 1', +' Group Cipher : TKIP', +' Pairwise Ciphers (2) : CCMP TKIP', +' Authentication Suites (1) : PSK', +' Extra:rsn_ie=0000000000000000000000000000000000000000000000000000', +' Quality=48/100 Signal level=87/100', +'Cell 03 - Address: 00:0B:81:CD:F2:04', +' ESSID:"BlackberryPi"', +' Protocol:IEEE 802.11bgn', +' Mode:Master', +' Frequency:2.437 GHz (Channel 6)', +' Encryption key:on', +' Bit Rates:144 Mb/s', +' IE: Unknown: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', +' Extra:rsn_ie=0000000000000000000000000000000000000000000000000000', +' Quality=48/100 Signal level=80/100', +'Cell 04 - Address: 00:0B:81:FD:42:14', +' ESSID:"CranberryPi"', +' Protocol:IEEE 802.11bgn', +' Mode:Master', +' Frequency:2.437 GHz (Channel 6)', +' Encryption key:off', +' Bit Rates:144 Mb/s', +' IE: Unknown: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', +' Quality=32/100 Signal level=71/100', +'Cell 05 - Address: 2C:C5:D3:02:AE:4C', +' Channel:100', +' Frequency:5.5 GHz (Channel 100)', +' Quality=65/70 Signal level=-45 dBm', +' Encryption key:on', +' ESSID:"hidden-ssid"', +' Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s', +' Mode:Master', +' Extra:tsf=0000003d2a54d03b', +' Extra: Last beacon: 3360ms ago', +' IE: Unknown: DD180050F20201018E0003A4000027A4000042435E0062322F00', +' IE: Unknown: 2D1AAD091BF8FE000000000000000000001000000000000000000000', +' IE: Unknown: 3D1664000000000000000000000000000000000000000000', +' IE: IEEE 802.11i/WPA2 Version 1', +' Group Cipher : CCMP', +' Pairwise Ciphers (1) : CCMP', +' Authentication Suites (1) : PSK' +].join('\n'); + +describe('iwlist', function() { + describe('iwlist.scan(interface, callback)', function() { + it('should scan the specified interface', function(done) { + iwlist.exec = function(command, callback) { + should(command).eql('iwlist wlan0 scan'); + callback(null, IWLIST_SCAN_LINUX, ''); + }; + + iwlist.scan('wlan0', function(err, status) { + should(status).eql([ + { + address: '00:0b:81:ab:14:22', + ssid: 'BlueberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wpa', + quality: 48, + signal: 87 + }, + { + address: '00:0b:81:95:12:21', + ssid: 'RaspberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wpa2', + quality: 58, + signal: 83 + }, + { + address: '00:0b:81:cd:f2:04', + ssid: 'BlackberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wep', + quality: 48, + signal: 80 + }, + { + address: '00:0b:81:fd:42:14', + ssid: 'CranberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'open', + quality: 4, + signal: -60, + noise: -92 + } + ]); + + done(); + }); + }) + + it('should scan the specified interface and show hidden ssid networks', function(done) { + iwlist.exec = function(command, callback) { + should(command).eql('iwlist wlan0 scan'); + callback(null, IWLIST_SCAN_LINUX, ''); + }; + + var options = { + iface: 'wlan0', + show_hidden: true + }; + + iwlist.scan(options, function(err, status) { + should(status).eql( + [ + { + address: '00:0b:81:ab:14:22', + channel: 6, + frequency: 2.437, + mode: 'master', + quality: 48, + signal: 87, + ssid: 'BlueberryPi', + security: 'wpa' + }, + { + address: '00:0b:81:95:12:21', + channel: 6, + frequency: 2.437, + mode: 'master', + quality: 58, + signal: 83, + ssid: 'RaspberryPi', + security: 'wpa2' + }, + { + address: '00:0b:81:cd:f2:04', + channel: 6, + frequency: 2.437, + mode: 'master', + quality: 48, + signal: 80, + ssid: 'BlackberryPi', + security: 'wep' + }, + { + address: '2c:c5:d3:02:ae:4c', + channel: 100, + frequency: 5.5, + mode: 'master', + quality: 65, + signal: -45, + security: 'wpa2' + }, + { + address: '00:0b:81:fd:42:14', + channel: 6, + frequency: 2.437, + mode: 'master', + quality: 4, + signal: -60, + noise: -92, + ssid: 'CranberryPi', + security: 'open' + } + ]); + + done(); + }); + }) + + it('should scan the specified interface looking for hidden ssid', function(done) { + iwlist.exec = function(command, callback) { + should(command).eql('iwlist wlan0 scan essid hidden-ssid'); + callback(null, IWLIST_SCAN_LINUX_ACTIVE_SCAN, ''); + }; + + var options = { + iface: 'wlan0', + show_hidden: false, + ssid: 'hidden-ssid' + }; + + iwlist.scan(options, function(err, status) { + should(status).eql( + [ + { + address: '00:0b:81:ab:14:22', + channel: 6, + frequency: 2.437, + mode: 'master', + quality: 48, + signal: 87, + ssid: 'BlueberryPi', + security: 'wpa' + }, + { + address: '00:0b:81:95:12:21', + channel: 6, + frequency: 2.437, + mode: 'master', + quality: 58, + signal: 83, + ssid: 'RaspberryPi', + security: 'wpa2' + }, + { + address: '00:0b:81:cd:f2:04', + channel: 6, + frequency: 2.437, + mode: 'master', + quality: 48, + signal: 80, + ssid: 'BlackberryPi', + security: 'wep' + }, + { + address: '00:0b:81:fd:42:14', + channel: 6, + frequency: 2.437, + mode: 'master', + quality: 32, + signal: 71, + ssid: 'CranberryPi', + security: 'open' + }, + { + address: '2c:c5:d3:02:ae:4c', + channel: 100, + frequency: 5.5, + mode: 'master', + quality: 65, + signal: -45, + ssid: 'hidden-ssid', + security: 'wpa2' + } + ]); + + done(); + }); + }) + + it('should handle errors', function(done) { + iwlist.exec = function(command, callback) { + callback('error'); + }; + + iwlist.scan('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }) + }) +}) diff --git a/tests/node_modules/wireless-tools/test/udhcpc.js b/tests/node_modules/wireless-tools/test/udhcpc.js new file mode 100644 index 0000000..437050d --- /dev/null +++ b/tests/node_modules/wireless-tools/test/udhcpc.js @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var should = require('should'); +var udhcpc = require('../udhcpc'); + +describe('udhcpc', function() { + describe('udhcpc.disable(options, callback)', function() { + it('should stop the daemons', function(done) { + udhcpc.exec = function(command, callback) { + should(command).eql( + 'kill `pgrep -f "^udhcpc -i wlan0"` || true'); + + callback(null, '', ''); + }; + + udhcpc.disable('wlan0', function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + udhcpc.exec = function(command, callback) { + callback('error'); + }; + + udhcpc.disable('wlan0', function(err) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('udhcpc.enable(options, callback)', function() { + it('should start the daemon', function(done) { + udhcpc.exec = function(command, callback) { + should(command).eql('udhcpc -i wlan0 -n'); + callback(null, '', ''); + }; + + var options = { + interface: 'wlan0' + }; + + udhcpc.enable(options, function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + udhcpc.exec = function(command, callback) { + callback('error'); + }; + + var options = { + interface: 'wlan0' + }; + + udhcpc.enable(options, function(err) { + should(err).eql('error'); + done(); + }); + }) + }) +}) diff --git a/tests/node_modules/wireless-tools/test/udhcpd.js b/tests/node_modules/wireless-tools/test/udhcpd.js new file mode 100644 index 0000000..795f588 --- /dev/null +++ b/tests/node_modules/wireless-tools/test/udhcpd.js @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var should = require('should'); +var udhcpd = require('../udhcpd'); + +describe('udhcpd', function() { + describe('udhcpd.disable(options, callback)', function() { + it('should stop the daemons', function(done) { + udhcpd.exec = function(command, callback) { + should(command).eql( + 'kill `pgrep -f "^udhcpd wlan0-udhcpd.conf"` || true'); + + callback(null, '', ''); + }; + + udhcpd.disable('wlan0', function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + udhcpd.exec = function(command, callback) { + callback('error'); + }; + + udhcpd.disable('wlan0', function(err) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('udhcpd.enable(options, callback)', function() { + it('should start the daemon', function(done) { + udhcpd.exec = function(command, callback) { + should(command).eql('cat <wlan0-udhcpd.conf' + + ' && udhcpd wlan0-udhcpd.conf' + + ' && rm -f wlan0-udhcpd.conf\n' + + 'interface wlan0\n' + + 'start 192.168.10.100\n' + + 'end 192.168.10.200\n' + + 'option router 192.168.10.1\n' + + 'option subnet 255.255.255.0\n' + + 'option dns 4.4.4.4\n' + + 'option dns 8.8.8.8'); + + callback(null, '', ''); + }; + + var options = { + interface: 'wlan0', + start: '192.168.10.100', + end: '192.168.10.200', + option: { + router: '192.168.10.1', + subnet: '255.255.255.0', + dns: [ '4.4.4.4', '8.8.8.8' ] + } + }; + + udhcpd.enable(options, function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + udhcpd.exec = function(command, callback) { + callback('error'); + }; + + var options = { + interface: 'wlan0', + start: '192.168.10.100', + end: '192.168.10.200', + option: { + router: '192.168.10.1', + subnet: '255.255.255.0', + dns: [ '4.4.4.4', '8.8.8.8' ] + } + }; + + udhcpd.enable(options, function(err) { + should(err).eql('error'); + done(); + }); + }) + }) +}) diff --git a/tests/node_modules/wireless-tools/test/wpa_cli.js b/tests/node_modules/wireless-tools/test/wpa_cli.js new file mode 100644 index 0000000..fe004dc --- /dev/null +++ b/tests/node_modules/wireless-tools/test/wpa_cli.js @@ -0,0 +1,660 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var should = require('should'); +var wpa_cli = require('../wpa_cli'); + +var WPA_CLI_STATUS_SILENCE = ''; + +var WPA_CLI_STATUS_COMPLETED = [ + 'bssid=2c:f5:d3:02:ea:d9', + 'freq=2412', + 'ssid=Fake-Wifi', + 'id=0', + 'mode=station', + 'pairwise_cipher=CCMP', + 'group_cipher=CCMP', + 'key_mgmt=WPA2-PSK', + 'wpa_state=COMPLETED', + 'ip_address=10.34.141.168', + 'p2p_device_address=e4:28:9c:a8:53:72', + 'address=e4:28:9c:a8:53:72', + 'uuid=e1cda789-8c88-53e8-ffff-31c304580c1e' +].join('\n'); + +var WPA_CLI_STATUS_4WAY_HANDSHAKE = [ + 'bssid=2c:f5:d3:02:ea:d9', + 'freq=2412', + 'ssid=Fake-Wifi', + 'id=0', + 'mode=station', + 'pairwise_cipher=CCMP', + 'group_cipher=CCMP', + 'key_mgmt=WPA2-PSK', + 'wpa_state=4WAY_HANDSHAKE', + 'ip_address=10.34.141.168', + 'p2p_device_address=e4:28:9c:a8:53:72', + 'address=e4:28:9c:a8:53:72', + 'uuid=e1cda789-8c88-53e8-ffff-31c304580c1e' +].join('\n'); + +var WPA_CLI_STATUS_SCANNING = [ + 'wpa_state=SCANNING', + 'ip_address=10.34.141.168', + 'p2p_device_address=e4:28:9c:a8:53:72', + 'address=e4:28:9c:a8:53:72', + 'uuid=e1cda789-8c88-53e8-ffff-31c304580c1e' +].join('\n'); + +var WPA_CLI_SCAN_RESULTS = [ + 'bssid / frequency / signal level / flags / ssid', + '2c:f5:d3:02:ea:d9 2472 -31 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS] FakeWifi', + '2c:f5:d3:02:ea:d9 2472 -31 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS] FakeWifi2' +].join('\n'); + +var WPA_CLI_SCAN_NORESULTS = [ + '' +].join('\n'); + +var WPA_CLI_COMMAND_OK = 'OK\n'; +var WPA_CLI_COMMAND_FAIL = 'FAIL\n'; +var WPA_CLI_COMMAND_ID = '0\n'; + +describe('wpa_cli', function() { + describe('wpa_cli.status(iface, callback)', function() { + before(function() { + this.OUTPUT = ''; + var self = this; + + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 status'); + callback(null, self.OUTPUT); + }; + }); + + it('status SILENCE', function (done) { + this.OUTPUT = WPA_CLI_STATUS_SILENCE; + + wpa_cli.status('wlan0', function(err, status) { + should(status).eql({ }); + done(); + }); + }); + + it('status COMPLETED', function(done) { + this.OUTPUT = WPA_CLI_STATUS_COMPLETED; + wpa_cli.status('wlan0', function(err, status) { + should(status).eql({ + bssid: '2c:f5:d3:02:ea:d9', + frequency: 2412, + mode: 'station', + key_mgmt: 'wpa2-psk', + ssid: 'Fake-Wifi', + pairwise_cipher: 'CCMP', + group_cipher: 'CCMP', + p2p_device_address: 'e4:28:9c:a8:53:72', + wpa_state: 'COMPLETED', + ip: '10.34.141.168', + mac: 'e4:28:9c:a8:53:72', + uuid: 'e1cda789-8c88-53e8-ffff-31c304580c1e', + id: 0 + }); + + done(); + }); + }); + + it('status 4WAY_HANDSHAKE', function(done) { + this.OUTPUT = WPA_CLI_STATUS_4WAY_HANDSHAKE; + wpa_cli.status('wlan0', function(err, status) { + should(status).eql({ + bssid: '2c:f5:d3:02:ea:d9', + frequency: 2412, + mode: 'station', + key_mgmt: 'wpa2-psk', + ssid: 'Fake-Wifi', + pairwise_cipher: 'CCMP', + group_cipher: 'CCMP', + p2p_device_address: 'e4:28:9c:a8:53:72', + wpa_state: '4WAY_HANDSHAKE', + ip: '10.34.141.168', + mac: 'e4:28:9c:a8:53:72', + uuid: 'e1cda789-8c88-53e8-ffff-31c304580c1e', + id: 0 + }); + + done(); + }); + }); + + it('status SCANNING', function(done) { + this.OUTPUT = WPA_CLI_STATUS_SCANNING; + wpa_cli.status('wlan0', function(err, status) { + should(status).eql({ + p2p_device_address: 'e4:28:9c:a8:53:72', + wpa_state: 'SCANNING', + ip: '10.34.141.168', + mac: 'e4:28:9c:a8:53:72', + uuid: 'e1cda789-8c88-53e8-ffff-31c304580c1e' }); + }); + + done(); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.status('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.bssid(iface, ap, ssid, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 bssid Fake-Wifi 2c:f5:d3:02:ea:89'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.bssid('wlan0', '2c:f5:d3:02:ea:89', 'Fake-Wifi', function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 bssid 2c:f5:d3:02:ea:89 Fake-Wifi'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.bssid('wlan0', 'Fake-Wifi', '2c:f5:d3:02:ea:89', function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('Handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.bssid('wlan0', '2c:f5:d3:02:ea:89', 'Fake-Wifi', function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.reassociate(iface, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 reassociate'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.reassociate('wlan0', function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 reassociate'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.reassociate('wlan0', function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.reassociate('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.set(iface, variable, value, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 set ap_scan 1'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.set('wlan0','ap_scan', 1, function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 set ap_scan 1'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.set('wlan0','ap_scan', 1, function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.set('wlan0','ap_scan', 1, function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.add_network(iface, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 add_network'); + callback(null, WPA_CLI_COMMAND_ID); + }; + + wpa_cli.add_network('wlan0', function(err, status) { + should(status).eql({ + result: '0' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 add_network'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.add_network('wlan0', function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.add_network('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.set_network(iface, id, variable, value, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 set_network 0 scan_ssid 1'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.set_network('wlan0', 0, 'scan_ssid', 1, function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 set_network 0 fake_variable 1'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.set_network('wlan0', 0, 'fake_variable', 1, function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.set_network('wlan0', 0, 'fake_variable', 1, function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.enable_network(iface, id, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 enable_network 0'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.enable_network('wlan0', 0, function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 enable_network 28'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.enable_network('wlan0', 28, function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.enable_network('wlan0', 28, function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.disable_network(iface, id, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 disable_network 0'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.disable_network('wlan0', 0, function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 disable_network 28'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.disable_network('wlan0', 28, function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.disable_network('wlan0', 28, function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.remove_network(iface, id, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 remove_network 0'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.remove_network('wlan0', 0, function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 remove_network 28'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.remove_network('wlan0', 28, function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.remove_network('wlan0', 28, function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.select_network(iface, id, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 select_network 0'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.select_network('wlan0', 0, function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 select_network 28'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.select_network('wlan0', 28, function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.select_network('wlan0', 28, function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.scan(iface, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 scan'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.scan('wlan0', function(err, scan) { + should(scan).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.scan('wlan0', function(err, scan) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.scan_results(iface, callback)', function(){ + before(function() { + this.OUTPUT = ''; + var self = this; + + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 scan_results'); + callback(null, self.OUTPUT); + }; + }); + + it('scan_results NORESULTS', function (done) { + this.OUTPUT = WPA_CLI_SCAN_NORESULTS; + + wpa_cli.scan_results('wlan0', function(err, results) { + should(results).eql([]); + done(); + }); + }); + + it('scan_results COMPLETED', function(done) { + this.OUTPUT = WPA_CLI_SCAN_RESULTS; + wpa_cli.scan_results('wlan0', function(err, results) { + should(results).eql([ + { + bssid: '2c:f5:d3:02:ea:d9', + frequency: 2472, + signalLevel: -31, + flags: '[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]', + ssid: 'FakeWifi' + }, + { + bssid: '2c:f5:d3:02:ea:d9', + frequency: 2472, + signalLevel: -31, + flags: '[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]', + ssid: 'FakeWifi2' + } + ]); + + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.scan_results('wlan0', function(err, results) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.save_config(iface, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 save_config'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.save_config('wlan0', function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 save_config'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.save_config('wlan0', function(err, status) { + should(err.message).eql('FAIL'); + + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.scan('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/tests/node_modules/wireless-tools/test/wpa_supplicant.js b/tests/node_modules/wireless-tools/test/wpa_supplicant.js new file mode 100644 index 0000000..1c7325d --- /dev/null +++ b/tests/node_modules/wireless-tools/test/wpa_supplicant.js @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var should = require('should'); +var wpa_supplicant = require('../wpa_supplicant'); + +describe('wpa_supplicant', function() { + describe('wpa_supplicant.disable(options, callback)', function() { + it('should stop the daemons', function(done) { + wpa_supplicant.exec = function(command, callback) { + should(command).eql( + 'kill `pgrep -f "wpa_supplicant -i wlan0 .*"` || true'); + + callback(null, '', ''); + }; + + wpa_supplicant.disable('wlan0', function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + wpa_supplicant.exec = function(command, callback) { + callback('error'); + }; + + wpa_supplicant.disable('wlan0', function(err) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('wpa_supplicant.enable(options, callback)', function() { + it('should start the daemon', function(done) { + wpa_supplicant.exec = function(command, callback) { + should(command).eql('wpa_passphrase "RaspberryPi" "raspberry"' + + ' > wlan0-wpa_supplicant.conf &&' + + ' wpa_supplicant -i wlan0 -B -D wext -c wlan0-wpa_supplicant.conf' + + ' && rm -f wlan0-wpa_supplicant.conf'); + + callback(null, '', ''); + }; + + var options = { + interface: 'wlan0', + ssid: 'RaspberryPi', + passphrase: 'raspberry', + driver: 'wext' + }; + + wpa_supplicant.enable(options, function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + wpa_supplicant.exec = function(command, callback) { + callback('error'); + }; + + var options = { + interface: 'wlan0', + ssid: 'RaspberryPi', + passphrase: 'raspberry', + driver: 'wext' + }; + + wpa_supplicant.enable(options, function(err) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('wpa_supplicant.manual(options, callback)', function() { + it('should start the daemon', function(done) { + wpa_supplicant.exec = function(command, callback) { + should(command).eql([ + 'wpa_supplicant -i wlan0 -s -B -P /run/wpa_supplicant/wlan0.pid', + '-D nl80211,wext -C /run/wpa_supplicant' + ].join(' ')); + + callback(null, '', ''); + }; + + var options = { + interface: 'wlan0', + drivers: [ 'nl80211', 'wext' ] + }; + + wpa_supplicant.manual(options, function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + wpa_supplicant.exec = function(command, callback) { + callback('error'); + }; + + var options = { + interface: 'wlan0', + drivers: [ 'nl80211', 'wext' ] + }; + + wpa_supplicant.manual(options, function(err) { + should(err).eql('error'); + done(); + }); + }) + }) +}) diff --git a/tests/node_modules/wireless-tools/udhcpc.js b/tests/node_modules/wireless-tools/udhcpc.js new file mode 100644 index 0000000..32cc5c5 --- /dev/null +++ b/tests/node_modules/wireless-tools/udhcpc.js @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var child_process = require('child_process'); + +/** + * The **udhcpc** command is used to configure a dhcp client for a + * network interface. + * + * @static + * @category udhcpc + * + */ +var udhcpc = module.exports = { + exec: child_process.exec, + disable: disable, + enable: enable +}; + +/** + * The **udhcpc disable** command is used to stop a dhcp client on a + * specific network interface. + * + * @static + * @category udhcpc + * @param {string} interface The network interface. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var udhcpc = require('wireless-tools/udhcpc'); + * + * udhcpc.disable('wlan0', function(err) { + * // the dhcp client was stopped + * }); + * + */ +function disable(interface, callback) { + var command = 'kill `pgrep -f "^udhcpc -i ' + interface + '"` || true'; + return this.exec(command, callback); +} + +/** + * The **udhcpc enable** command is used to start a dhcp client on a + * specific network interface. + * + * @static + * @category udhcpc + * @param {object} options The dhcp client configuration. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var udhcpc = require('wireless-tools/udhcpc'); + * + * var options = { + * interface: 'wlan0' + * }; + * + * udhcpc.enable(options, function(err) { + * // the dhcp client was started + * }); + * + */ +function enable(options, callback) { + var command = 'udhcpc -i ' + options.interface + ' -n'; + return this.exec(command, callback); +} diff --git a/tests/node_modules/wireless-tools/udhcpd.js b/tests/node_modules/wireless-tools/udhcpd.js new file mode 100644 index 0000000..006cedf --- /dev/null +++ b/tests/node_modules/wireless-tools/udhcpd.js @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var child_process = require('child_process'); + +/** + * The **udhcpd** command is used to configure a dhcp server for a + * network interface. + * + * @static + * @category udhcpd + * + */ +var udhcpd = module.exports = { + exec: child_process.exec, + disable: disable, + enable: enable +}; + +/** + * Recursively expand `options` into `lines` with a `prefix`. + * + * @private + * @static + * @category udhcpd + * @param {object} options The dhcp server configuration. + * @param {array} lines The lines of the configuration file. + * @param {array) prefix The key prefix. + * + */ +function expand_r(options, lines, prefix) { + Object.getOwnPropertyNames(options).forEach(function(key) { + var full = prefix.concat(key); + var value = options[key]; + + if (Array.isArray(value)) { + value.forEach(function(val) { + lines.push(full.concat(val).join(' ')); + }); + } + else if (typeof(value) == 'object') { + expand_r(value, lines, full); + } + else { + lines.push(full.concat(value).join(' ')); + } + }); +} + +/** + * Convert dhcp server configuration options to a configuration file. + * + * @private + * @static + * @category udhcpd + * @param {object} options The dhcp server configuration. + * @returns {array} The lines of the configuration file. + * + */ +function expand(options) { + var lines = []; + expand_r(options, lines, []); + return lines; +} + +/** + * The **udhcpd enable** command is used to start a dhcp server on a + * specific network interface. + * + * @static + * @category udhcpd + * @param {object} options The dhcp server configuration. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var udhcpd = require('wireless-tools/udhcpd'); + * + * var options = { + * interface: 'wlan0', + * start: '192.168.10.100', + * end: '192.168.10.200', + * option: { + * router: '192.168.10.1', + * subnet: '255.255.255.0', + * dns: [ '4.4.4.4', '8.8.8.8' ] + * } + * }; + * + * udhcpd.enable(options, function(err) { + * // the dhcp server was started + * }); + * + */ +function enable(options, callback) { + var file = options.interface + '-udhcpd.conf'; + + var commands = [].concat( + 'cat <' + file + ' && udhcpd ' + file + ' && rm -f ' + file, + expand(options)); + + return this.exec(commands.join('\n'), callback); +} + +/** + * The **udhcpd disable** command is used to stop a dhcp server on a + * specific network interface. + * + * @static + * @category udhcpd + * @param {string} interface The network interface. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var udhcpd = require('wireless-tools/udhcpd'); + * + * udhcpd.disable('wlan0', function(err) { + * // the dhcp server was stopped + * }); + * + */ +function disable(interface, callback) { + var file = interface + '-udhcpd.conf'; + return this.exec('kill `pgrep -f "^udhcpd ' + file + '"` || true', callback); +} diff --git a/tests/node_modules/wireless-tools/wireless-tools.js b/tests/node_modules/wireless-tools/wireless-tools.js new file mode 100644 index 0000000..de00348 --- /dev/null +++ b/tests/node_modules/wireless-tools/wireless-tools.js @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var wireless_tools = module.exports = { + hostapd: require('./hostapd'), + ifconfig: require('./ifconfig'), + iwconfig: require('./iwconfig'), + iwlist: require('./iwlist'), + iw: require('./iw'), + udhcpc: require('./udhcpc'), + udhcpd: require('./udhcpd'), + wpa: require('./wpa_cli'), + wpa_supplicant: require('./wpa_supplicant') +}; diff --git a/tests/node_modules/wireless-tools/wpa_cli.js b/tests/node_modules/wireless-tools/wpa_cli.js new file mode 100644 index 0000000..f4fa8fb --- /dev/null +++ b/tests/node_modules/wireless-tools/wpa_cli.js @@ -0,0 +1,416 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var child_process = require('child_process'); + +/** + * The **wpa_cli** command is used to configure wpa network interfaces. + * + * @private + * @category wpa_cli + * + */ +var wpa_cli = module.exports = { + exec: child_process.exec, + status: status, + bssid: bssid, + reassociate: reassociate, + set: set, + add_network: add_network, + set_network: set_network, + enable_network: enable_network, + disable_network: disable_network, + remove_network: remove_network, + select_network: select_network, + scan: scan, + scan_results: scan_results, + save_config: save_config +}; + +/** + * Parses the status for a wpa network interface. + * + * @private + * @static + * @category wpa_cli + * @param {string} block The section of stdout for the interface. + * @returns {object} The parsed wpa status. + * + */ +function parse_status_block(block) { + var match; + + var parsed = {}; + if ((match = block.match(/bssid=([A-Fa-f0-9:]{17})/))) { + parsed.bssid = match[1].toLowerCase(); + } + + if ((match = block.match(/freq=([0-9]+)/))) { + parsed.frequency = parseInt(match[1], 10); + } + + if ((match = block.match(/mode=([^\s]+)/))) { + parsed.mode = match[1]; + } + + if ((match = block.match(/key_mgmt=([^\s]+)/))) { + parsed.key_mgmt = match[1].toLowerCase(); + } + + if ((match = block.match(/[^b]ssid=([^\n]+)/))) { + parsed.ssid = match[1]; + } + + if ((match = block.match(/[^b]pairwise_cipher=([^\n]+)/))) { + parsed.pairwise_cipher = match[1]; + } + + if ((match = block.match(/[^b]group_cipher=([^\n]+)/))) { + parsed.group_cipher = match[1]; + } + + if ((match = block.match(/p2p_device_address=([A-Fa-f0-9:]{17})/))) { + parsed.p2p_device_address = match[1]; + } + + if ((match = block.match(/wpa_state=([^\s]+)/))) { + parsed.wpa_state = match[1]; + } + + if ((match = block.match(/ip_address=([^\n]+)/))) { + parsed.ip = match[1]; + } + + if ((match = block.match(/[^_]address=([A-Fa-f0-9:]{17})/))) { + parsed.mac = match[1].toLowerCase(); + } + + if ((match = block.match(/uuid=([^\n]+)/))) { + parsed.uuid = match[1]; + } + + if ((match = block.match(/[^s]id=([0-9]+)/))) { + parsed.id = parseInt(match[1], 10); + } + + return parsed; +} + +/** + * Parses the result for a wpa command over an interface. + * + * @private + * @static + * @category wpa_cli + * @param {string} block The section of stdout for the command. + * @returns {object} The parsed wpa command result. + * + */ +function parse_command_block(block) { + var match; + + var parsed = { + result: block.match(/^([^\s]+)/)[1] + }; + + return parsed; +} + +/** + * Parses the status for a wpa wireless network interface. + * + * @private + * @static + * @category wpa_cli + * @param {function} callback The callback function. + * + */ +function parse_status_interface(callback) { + return function(error, stdout, stderr) { + if (error) { + callback(error); + } else { + callback(error, parse_status_block(stdout.trim())); + } + }; +} + +/** + * Parses the result for a wpa command over an interface. + * + * @private + * @static + * @category wpa_cli + * @param {function} callback The callback function. + * + */ +function parse_command_interface(callback) { + return function(error, stdout, stderr) { + if (error) { + callback(error); + } else { + var output = parse_command_block(stdout.trim()); + if (output.result === 'FAIL') { + callback(new Error(output.result)); + } else { + callback(error, parse_command_block(stdout.trim())); + } + } + }; +} + +/** + * Parses the results of a scan_result request. + * + * @private + * @static + * @category wpa_cli + * @param {string} block The section of stdout for the interface. + * @returns {object} The parsed scan results. + */ +function parse_scan_results(block) { + var match; + var results = []; + var lines; + + lines = block.split('\n').map(function(item) { return item + "\n"; }); + lines.forEach(function(entry){ + var parsed = {}; + if ((match = entry.match(/([A-Fa-f0-9:]{17})\t/))) { + parsed.bssid = match[1].toLowerCase(); + } + + if ((match = entry.match(/\t([\d]+)\t+/))) { + parsed.frequency = parseInt(match[1], 10); + } + + if ((match = entry.match(/([-][0-9]+)\t/))) { + parsed.signalLevel = parseInt(match[1], 10); + } + + if ((match = entry.match(/\t(\[.+\])\t/))) { + parsed.flags = match[1]; + } + + if ((match = entry.match(/\t([^\t]{1,32}(?=\n))/))) { + parsed.ssid = match[1]; + } + + if(!(Object.keys(parsed).length === 0 && parsed.constructor === Object)){ + results.push(parsed); + } + }); + + return results; +} + +/** + * Parses the status for a scan_results request. + * + * @private + * @static + * @category wpa_cli + * @param {function} callback The callback function. + * + */ +function parse_scan_results_interface(callback) { + return function(error, stdout, stderr) { + if (error) { + callback(error); + } else { + callback(error, parse_scan_results(stdout.trim())); + } + }; +} + + +/** + * Parses the status for wpa network interface. + * + * @private + * @static + * @category wpa + * @param {string} [interface] The wireless network interface. + * @param {function} callback The callback function. + * @example + * + * var wpa_cli = require('wireless-tools/wpa_cli'); + * + * wpa_cli.status('wlan0', function(err, status) { + * console.dir(status); + * wpa_cli.bssid('wlan0', '2c:f5:d3:02:ea:dd', 'Fake-Wifi', function(err, data){ + * console.dir(data); + * wpa_cli.bssid('wlan0', 'Fake-Wifi', '2c:f5:d3:02:ea:dd', function(err, data){ + * if (err) { + * console.dir(err); + * wpa_cli.reassociate('wlan0', function(err, data) { + * console.dir(data); + * }); + * } + * }); + * }); + * }); + * + * + * + * // => + * { + * bssid: '2c:f5:d3:02:ea:d9', + * frequency: 2412, + * mode: 'station', + * key_mgmt: 'wpa2-psk', + * ssid: 'Fake-Wifi', + * pairwise_cipher: 'CCMP', + * group_cipher: 'CCMP', + * p2p_device_address: 'e4:28:9c:a8:53:72', + * wpa_state: 'COMPLETED', + * ip: '10.34.141.168', + * mac: 'e4:28:9c:a8:53:72', + * uuid: 'e1cda789-8c88-53e8-ffff-31c304580c1e', + * id: 0 + * } + * + * OK + * + * FAIL + * + * OK + * + */ +function status(interface, callback) { + var command = [ 'wpa_cli -i', interface, 'status'].join(' '); + return this.exec(command, parse_status_interface(callback)); +} + +function bssid(interface, ap, ssid, callback) { + var command = ['wpa_cli -i', interface, 'bssid', ssid, ap].join(' '); + return this.exec(command, parse_command_interface(callback)); +} + +function reassociate(interface, callback) { + var command = ['wpa_cli -i', + interface, + 'reassociate'].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +/* others commands not tested + //ap_scan 1 + // set_network 0 0 scan_ssid 1 + + + // set: set, + // add_network: add_network, + // set_network: set_network, + // enable_network: enable_network +*/ + +function set(interface, variable, value, callback) { + var command = ['wpa_cli -i', + interface, + 'set', + variable, + value ].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +function add_network(interface, callback) { + var command = ['wpa_cli -i', + interface, + 'add_network' ].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +function set_network(interface, id, variable, value, callback) { + var command = ['wpa_cli -i', + interface, + 'set_network', + id, + variable, + value ].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +function enable_network(interface, id, callback) { + var command = ['wpa_cli -i', + interface, + 'enable_network', + id ].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +function disable_network(interface, id, callback) { + var command = ['wpa_cli -i', + interface, + 'disable_network', + id ].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +function remove_network(interface, id, callback) { + var command = ['wpa_cli -i', + interface, + 'remove_network', + id ].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +function select_network(interface, id, callback) { + var command = ['wpa_cli -i', + interface, + 'select_network', + id ].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +function scan(interface, callback) { + var command = ['wpa_cli -i', + interface, + 'scan'].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +function scan_results(interface, callback) { + var command = ['wpa_cli -i', + interface, + 'scan_results'].join(' '); + + return this.exec(command, parse_scan_results_interface(callback)); +} + +function save_config(interface, callback) { + var command = ['wpa_cli -i', + interface, + 'save_config'].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} \ No newline at end of file diff --git a/tests/node_modules/wireless-tools/wpa_supplicant.js b/tests/node_modules/wireless-tools/wpa_supplicant.js new file mode 100644 index 0000000..6316d02 --- /dev/null +++ b/tests/node_modules/wireless-tools/wpa_supplicant.js @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +var child_process = require('child_process'); + +/** + * The **wpa_supplicant** command is used to configure a wireless + * network connection for a network interface. + * + * @static + * @category wpa_supplicant + * + */ +var wpa_supplicant = module.exports = { + exec: child_process.exec, + disable: disable, + enable: enable, + manual: manual +}; + +/** + * The **wpa_supplicant disable** command is used to disconnect from + * a wireless network on a specific network interface. + * + * @static + * @category wpa_supplicant + * @param {string} interface The network interface. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var wpa_supplicant = require('wireless-tools/wpa_supplicant'); + * + * wpa_supplicant.disable('wlan0', function(err) { + * // disconnected from wireless network + * }); + * + */ +function disable(interface, callback) { + var command = 'kill `pgrep -f "wpa_supplicant -i ' + + interface + ' .*"` || true'; + + return this.exec(command, callback); +} + +/** + * The **wpa_supplicant enable** command is used to join a wireless network + * on a specific network interface. + * + * @static + * @category wpa_supplicant + * @param {object} options The wireless network configuration. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var wpa_supplicant = require('wireless-tools/wpa_supplicant'); + * + * var options = { + * interface: 'wlan0', + * ssid: 'RaspberryPi', + * passphrase: 'raspberry', + * driver: 'wext' + * }; + * + * wpa_supplicant.enable(options, function(err) { + * // connected to the wireless network + * }); + * + */ +function enable(options, callback) { + var file = options.interface + '-wpa_supplicant.conf'; + + var command = 'wpa_passphrase "' + options.ssid + '" "' + options.passphrase + + '" > ' + file + ' && wpa_supplicant -i ' + options.interface + ' -B -D ' + + options.driver + ' -c ' + file + ' && rm -f ' + file; + + return this.exec(command, callback); +} + +/** + * launchs wpa manually (as if it were launched by ifup if interface wpa setup + * was done in /network/interfaces) + * /sbin/wpa_supplicant -s -B -P /run/wpa_supplicant.wlan0.pid -i wlan0 -D nl80211,wext -C /run/wpa_supplicant + * options = { + * interface: 'wlan0', + * drivers: [ 'nl80211', 'wext' ] + * } + */ +function manual(options, callback) { + var command = [ + 'wpa_supplicant', + '-i', options.interface, + '-s -B -P /run/wpa_supplicant/' + options.interface + '.pid', + '-D', options.drivers.join(','), + '-C /run/wpa_supplicant' + ].join(' '); + + return this.exec(command, callback); +} + + diff --git a/tests/package.json b/tests/package.json new file mode 100644 index 0000000..d2df67f --- /dev/null +++ b/tests/package.json @@ -0,0 +1,9 @@ +{ + "name": "wifi-setup-test", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "wireless-tools": "^0.19.0" + } +} diff --git a/tests/yarn.lock b/tests/yarn.lock new file mode 100644 index 0000000..4dddb7c --- /dev/null +++ b/tests/yarn.lock @@ -0,0 +1,8 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +wireless-tools@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/wireless-tools/-/wireless-tools-0.19.0.tgz#67fb73cd371f2d9ba3b9ef253400a31f8c784b11" + integrity sha512-WlD5YsEx2FkjuDkQ05XuLmFMxe8r+Hf+EWitReXz44USu1Bi2BahFH7Qr7ttzTlHLLfnHezzHts5ruHRegbMEQ==